On 2020/2/20 12:32 上午, Christoph Hellwig wrote: > On Thu, Feb 13, 2020 at 10:12:05PM +0800, Coly Li wrote: >> + /* >> + * 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