On 01/14/2018 03:42 PM, Coly Li wrote:
> Kernel thread routine bch_allocator_thread() references macro
> allocator_wait() to wait for a condition or quit to do_exit()
> when kthread_should_stop() is true. Here is the code block,
>
> 284 while (1) { \
> 285 set_current_state(TASK_INTERRUPTIBLE); \
> 286 if (cond) \
> 287 break; \
> 288 \
> 289 mutex_unlock(&(ca)->set->bucket_lock); \
> 290 if (kthread_should_stop()) \
> 291 return 0; \
> 292 \
> 293 schedule(); \
> 294 mutex_lock(&(ca)->set->bucket_lock); \
> 295 } \
> 296 __set_current_state(TASK_RUNNING); \
>
> At line 285, task state is set to TASK_INTERRUPTIBLE, if at line 290
> kthread_should_stop() is true, the kernel thread will terminate and return
> to kernel/kthread.s:kthread(), then calls do_exit() with TASK_INTERRUPTIBLE
> state. This is not a suggested behavior and a warning message will be
> reported by might_sleep() in do_exit() code path: "WARNING: do not call
> blocking ops when !TASK_RUNNING; state=1 set at [xxxx]".
>
> This patch fixes this problem by setting task state to TASK_RUNNING if
> kthread_should_stop() is true and before kernel thread returns back to
> kernel/kthread.s:kthread().
>
> Changelog:
> v2: fix the race issue in v1 patch.
> v1: initial buggy fix.
>
> Signed-off-by: Coly Li <[email protected]>
> Cc: Michael Lyle <[email protected]>
> Cc: Hannes Reinecke <[email protected]>
> Cc: Junhui Tang <[email protected]>
> ---
> drivers/md/bcache/alloc.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/md/bcache/alloc.c b/drivers/md/bcache/alloc.c
> index 6cc6c0f9c3a9..458e1d38577d 100644
> --- a/drivers/md/bcache/alloc.c
> +++ b/drivers/md/bcache/alloc.c
> @@ -287,8 +287,10 @@ do {
> \
> break; \
> \
> mutex_unlock(&(ca)->set->bucket_lock); \
> - if (kthread_should_stop()) \
> + if (kthread_should_stop()) { \
> + set_current_state(TASK_RUNNING); \
> return 0; \
> + } \
> \
> schedule(); \
> mutex_lock(&(ca)->set->bucket_lock); \
>
Might be an idea to merge it with the previous patch.
Other than that:
Reviewed-by: Hannes Reinecke <[email protected]>
Cheers,
Hannes
--
Dr. Hannes Reinecke Teamlead Storage & Networking
[email protected] +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)