On Tue, Jul 04, 2023 at 10:56:08AM +1000, NeilBrown wrote: > On Tue, 04 Jul 2023, Chuck Lever wrote: > > From: Chuck Lever <chuck.lever@xxxxxxxxxx> > > > > Consumers of sp_lock now all run in process context. We can avoid > > the overhead of disabling bottom halves when taking this lock. > > "now" suggests that something has recently changed so that sp_lock isn't > taken in bh context. What was that change - I don't see it. > > I think svc_data_ready() is called in bh, and that calls > svc_xprt_enqueue() which take sp_lock to add the xprt to ->sp_sockets. > > Is that not still the case? Darn, I forgot about that one. I'll drop this patch. > NeilBrown > > > > > > Signed-off-by: Chuck Lever <chuck.lever@xxxxxxxxxx> > > --- > > net/sunrpc/svc_xprt.c | 14 +++++++------- > > 1 file changed, 7 insertions(+), 7 deletions(-) > > > > diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c > > index ecbccf0d89b9..8ced7591ce07 100644 > > --- a/net/sunrpc/svc_xprt.c > > +++ b/net/sunrpc/svc_xprt.c > > @@ -472,9 +472,9 @@ void svc_xprt_enqueue(struct svc_xprt *xprt) > > pool = svc_pool_for_cpu(xprt->xpt_server); > > > > percpu_counter_inc(&pool->sp_sockets_queued); > > - spin_lock_bh(&pool->sp_lock); > > + spin_lock(&pool->sp_lock); > > list_add_tail(&xprt->xpt_ready, &pool->sp_sockets); > > - spin_unlock_bh(&pool->sp_lock); > > + spin_unlock(&pool->sp_lock); > > > > rqstp = svc_pool_wake_idle_thread(xprt->xpt_server, pool); > > if (!rqstp) { > > @@ -496,14 +496,14 @@ static struct svc_xprt *svc_xprt_dequeue(struct svc_pool *pool) > > if (list_empty(&pool->sp_sockets)) > > goto out; > > > > - spin_lock_bh(&pool->sp_lock); > > + spin_lock(&pool->sp_lock); > > if (likely(!list_empty(&pool->sp_sockets))) { > > xprt = list_first_entry(&pool->sp_sockets, > > struct svc_xprt, xpt_ready); > > list_del_init(&xprt->xpt_ready); > > svc_xprt_get(xprt); > > } > > - spin_unlock_bh(&pool->sp_lock); > > + spin_unlock(&pool->sp_lock); > > out: > > return xprt; > > } > > @@ -1116,15 +1116,15 @@ static struct svc_xprt *svc_dequeue_net(struct svc_serv *serv, struct net *net) > > for (i = 0; i < serv->sv_nrpools; i++) { > > pool = &serv->sv_pools[i]; > > > > - spin_lock_bh(&pool->sp_lock); > > + spin_lock(&pool->sp_lock); > > list_for_each_entry_safe(xprt, tmp, &pool->sp_sockets, xpt_ready) { > > if (xprt->xpt_net != net) > > continue; > > list_del_init(&xprt->xpt_ready); > > - spin_unlock_bh(&pool->sp_lock); > > + spin_unlock(&pool->sp_lock); > > return xprt; > > } > > - spin_unlock_bh(&pool->sp_lock); > > + spin_unlock(&pool->sp_lock); > > } > > return NULL; > > } > > > > > > >