On Mon, Apr 20, 2020 at 07:18:29PM +0200, Uladzislau Rezki wrote: > On Mon, Apr 20, 2020 at 11:38:36AM -0400, Joel Fernandes (Google) wrote: > > From: Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx> > > > > There is no need to use xchg(), the access is serialized by krcp->lock. > > The xchg() function adds some atomic barriers which remain hidden in > > x86's disassembly but are visible on ARM for instance. > > > > Replace xchg() with a load + store. > > > > Acked-by: Joel Fernandes (Google) <joel@xxxxxxxxxxxxxxxxx> > > Signed-off-by: Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx> > > --- > > kernel/rcu/tree.c | 3 ++- > > 1 file changed, 2 insertions(+), 1 deletion(-) > > > > diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c > > index cd61649e1b001..f6eb3aee0935e 100644 > > --- a/kernel/rcu/tree.c > > +++ b/kernel/rcu/tree.c > > @@ -3088,7 +3088,8 @@ kfree_call_rcu_add_ptr_to_bulk(struct kfree_rcu_cpu *krcp, > > /* Check if a new block is required. */ > > if (!krcp->bhead || > > krcp->bhead->nr_records == KFREE_BULK_MAX_ENTR) { > > - bnode = xchg(&krcp->bcached, NULL); > > + bnode = krcp->bcached; > > + krcp->bcached = NULL; > > if (!bnode) { > > WARN_ON_ONCE(sizeof(struct kfree_rcu_bulk_data) > PAGE_SIZE); > > > > > But we populate the cache without holding the krcp->lock. That is why it > is xchg here. See below: > > <snip> > if (cmpxchg(&krcp->bcached, NULL, bhead)) > free_page((unsigned long) bhead); > <snip> > > we do not hold any krcp->lock here, we do not need it. You are right. This patch is not helpful in this situation even though it does not break things. Let us drop this patch. Please review the other 3 and provide your Reviewed-by tag if they look Ok to you, thanks. For the workqueue one that Paul asked us to look into - we are continuing to discuss there if we need to move it outside the lock or not. If we decide to move it outside lock, we can add that as one more patch to this series and I'll send a v2. thanks, - Joel