Wang Jinchao <wangjinchao@xxxxxxxxxxx> wrote: > > diff --git a/kernel/padata.c b/kernel/padata.c > index 222d60195de6..79d04a97ded6 100644 > --- a/kernel/padata.c > +++ b/kernel/padata.c > @@ -1102,12 +1102,16 @@ EXPORT_SYMBOL(padata_alloc_shell); > */ > void padata_free_shell(struct padata_shell *ps) > { > + struct parallel_data *pd; > + > if (!ps) > return; > > mutex_lock(&ps->pinst->lock); > list_del(&ps->list); > - padata_free_pd(rcu_dereference_protected(ps->pd, 1)); > + pd = rcu_dereference_protected(ps->pd, 1); > + if (refcount_dec_and_test(&pd->refcnt)) > + padata_free_pd(rcu_dereference_protected(ps->pd, 1)); Why is this dereferencing ps->pd again after the refcount_dec_and_test? If this is necessary please explain it in the code because it is not at all obvious. Thanks, -- Email: Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt