Re: [PATCH v4 4/4] sunrpc: eliminate a modulus operation from the enqueueing codepath
NeilBrown <[email protected]>
| Newsgroups | gmane.linux.nfs,gmane.linux.kernel |
|---|---|
| Message-ID | <[email protected]> |
On Thu, 02 Jul 2026, Jeff Layton wrote: > Currently we do this to determine the pool to enqueue on: > > pidx = m->to_pool[cpu_to_node(raw_smp_processor_id())] % serv->sv_nrpools; > > ...but a modulus is rather expensive. Replace this instead with an > explicit check for running off the end of the array. > > This situation should never occur, but if it does, just fall back to > pool 0. > > This trades a ~20-30 cycle operation that isn't pipelined and > monopolizes the divider for a ~1 cycle well-predicted branch. I would rather discard ->sv_nrpools as described in previous reply, then this modulus would disappear as it isn't needed. Thanks, NeilBrown > > Signed-off-by: Jeff Layton <[email protected]> > --- > net/sunrpc/svc.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c > index ae93a6f51087..ed841ea09079 100644 > --- a/net/sunrpc/svc.c > +++ b/net/sunrpc/svc.c > @@ -252,7 +252,9 @@ struct svc_pool *svc_pool_for_cpu(struct svc_serv *serv) > if (serv->sv_nrpools <= 1) > return serv->sv_pools; > > - pidx = m->to_pool[cpu_to_node(raw_smp_processor_id())] % serv->sv_nrpools; > + pidx = m->to_pool[cpu_to_node(raw_smp_processor_id())]; > + if (pidx >= serv->sv_nrpools) > + pidx = 0; > > /* > * Threads are spread evenly across the pools, but when there are > > -- > 2.54.0 > >