Chuck, Are there pre-reqs for this series? I had tried to apply the patches on top of 5-19-rc6 but I get the following compile error: fs/nfsd/nfs4proc.c: In function ‘nfsd4_setup_inter_ssc’: fs/nfsd/nfs4proc.c:1539:34: error: passing argument 1 of ‘nfsd4_interssc_connect’ from incompatible pointer type [-Werror=incompatible-pointer-types] status = nfsd4_interssc_connect(©->cp_src, rqstp, mount); ^~~~~~~~~~~~~ fs/nfsd/nfs4proc.c:1414:43: note: expected ‘struct nl4_server *’ but argument is of type ‘struct nl4_server **’ nfsd4_interssc_connect(struct nl4_server *nss, struct svc_rqst *rqstp, ~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[2]: *** [scripts/Makefile.build:249: fs/nfsd/nfs4proc.o] Error 1 make[1]: *** [scripts/Makefile.build:466: fs/nfsd] Error 2 make: *** [Makefile:1843: fs] Error 2 On Fri, Jul 22, 2022 at 4:36 PM Chuck Lever <chuck.lever@xxxxxxxxxx> wrote: > > While testing NFSD for-next, I noticed svc_generic_init_request() > was an unexpected hot spot on NFSv4 workloads. Drilling into the > perf report, it shows that the hot path in there is: > > 1208 memset(rqstp->rq_argp, 0, procp->pc_argsize); > 1209 memset(rqstp->rq_resp, 0, procp->pc_ressize); > > For an NFSv4 COMPOUND, > > procp->pc_argsize = sizeof(nfsd4_compoundargs), > > struct nfsd4_compoundargs on my system is more than 17KB! This is > due to the size of the iops field: > > struct nfsd4_op iops[8]; > > Each struct nfsd4_op contains a union of the arguments for each > NFSv4 operation. Each argument is typically less than 128 bytes > except that struct nfsd4_copy and struct nfsd4_copy_notify are both > larger than 2KB each. > > I'm not yet totally convinced this series never orphans memory, but > it does reduce the size of nfsd4_compoundargs to just over 4KB. This > is still due to struct nfsd4_copy being almost 500 bytes. I don't > see more low-hanging fruit there, though. > > --- > > Chuck Lever (11): > NFSD: Shrink size of struct nfsd4_copy_notify > NFSD: Shrink size of struct nfsd4_copy > NFSD: Reorder the fields in struct nfsd4_op > NFSD: Make nfs4_put_copy() static > NFSD: Make boolean fields in struct nfsd4_copy into atomic bit flags > NFSD: Refactor nfsd4_cleanup_inter_ssc() (1/2) > NFSD: Refactor nfsd4_cleanup_inter_ssc() (2/2) > NFSD: Refactor nfsd4_do_copy() > NFSD: Remove kmalloc from nfsd4_do_async_copy() > NFSD: Add nfsd4_send_cb_offload() > NFSD: Move copy offload callback arguments into a separate structure > > > fs/nfsd/nfs4callback.c | 37 +++++---- > fs/nfsd/nfs4proc.c | 165 +++++++++++++++++++++-------------------- > fs/nfsd/nfs4xdr.c | 30 +++++--- > fs/nfsd/state.h | 1 - > fs/nfsd/xdr4.h | 54 ++++++++++---- > 5 files changed, 163 insertions(+), 124 deletions(-) > > -- > Chuck Lever >