Re: [PATCH 12/12] closures: fix a race on wakeup from closure_sync

Coly Li
2019-07-16T10:47:43Z

Hi Kent,

On 2019/6/11 3:14 上午, Kent Overstreet wrote:
> Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Acked-by: Coly Li <colyli@suse.de>

And also I receive report for suspicious closure race condition in
bcache, and people ask for having this patch into Linux v5.3.

So before this patch gets merged into upstream, I plan to rebase it to
drivers/md/bcache/closure.c at this moment. Of cause the author is you.

When lib/closure.c merged into upstream, I will rebase all closure usage
from bcache to use lib/closure.{c,h}.

Thanks in advance.

Coly Li

> ---
> lib/closure.c | 10 ++++++++--
> 1 file changed, 8 insertions(+), 2 deletions(-)
>
> diff --git a/lib/closure.c b/lib/closure.c
> index 46cfe4c382..3e6366c262 100644
> --- a/lib/closure.c
> +++ b/lib/closure.c
> @@ -104,8 +104,14 @@ struct closure_syncer {
>
> static void closure_sync_fn(struct closure *cl)
> {
> - cl->s->done = 1;
> - wake_up_process(cl->s->task);
> + struct closure_syncer *s = cl->s;
> + struct task_struct *p;
> +
> + rcu_read_lock();
> + p = READ_ONCE(s->task);
> + s->done = 1;
> + wake_up_process(p);
> + rcu_read_unlock();
> }
>
> void __sched __closure_sync(struct closure *cl)
>

--

Coly Li