Re: [PATCH 1/3] bcache: ignore pending signals when creating gc and allocator thread
From: Coly Li <hidden>
Date: 2020-02-20 13:21:17
Also in:
linux-bcache
On 2020/2/20 12:32 上午, Christoph Hellwig wrote:
On Thu, Feb 13, 2020 at 10:12:05PM +0800, Coly Li wrote:quoted
+ /* + * In case previous btree check operation occupies too many + * system memory for bcache btree node cache, and the + * registering process is selected by OOM killer. Here just + * ignore the SIGKILL sent by OOM killer if there is, to + * avoid kthread_run() being failed by pending signals. The + * bcache registering process will exit after the registration + * done. + */ + if (signal_pending(current)) + flush_signals(current); + + k = kthread_run(bch_allocator_thread, ca, "bcache_allocator");This really needs to go into the kthread code itself instead of requiring cargo culting in the callers.
Hi Christoph,
Correct me if I am wrong.
If the signal is set before calling kthread_run(), kthread_run() will
fail and return -EINTR as code comment of __kthread_create_on_node() says,
315 /*
316 * Wait for completion in killable state, for I might be chosen by
317 * the OOM killer while kthreadd is trying to allocate memory for
318 * new kernel thread.
319 */
320 if (unlikely(wait_for_completion_killable(&done))) {
321 /*
322 * If I was SIGKILLed before kthreadd (or new kernel thread)
323 * calls complete(), leave the cleanup of this structure to
324 * that thread.
325 */
326 if (xchg(&create->done, NULL))
327 return ERR_PTR(-EINTR);
328 /*
329 * kthreadd (or new kernel thread) will call complete()
330 * shortly.
331 */
332 wait_for_completion(&done);
333 }
So the caller of kthread_run(), in this case it is
bch_cache_allocator_start() will receive -EINTR, and returns error to
its caller bch_cache_set_alloc(). Then the registration will fail and
ignore what the kthread routine does in parallel.
Therefore I need to explicitly call pending_signal() before calling
kthread_run().
--
Coly Li