On Tue, Jun 27, 2023 at 4:28 PM David Howells <dhowells@xxxxxxxxxx> wrote: > > Looking at "ceph: add a dedicated private data for netfs rreq" you might find > the attached patch useful. It's in my list of netfs patches to push once I > get away from splice. > > David > --- > netfs: Allow the netfs to make the io (sub)request alloc larger > > Allow the network filesystem to specify extra space to be allocated on the > end of the io (sub)request. This allows cifs, for example, to use this > space rather than allocating its own cifs_readdata struct. > > Signed-off-by: David Howells <dhowells@xxxxxxxxxx> > --- > fs/netfs/objects.c | 7 +++++-- > include/linux/netfs.h | 2 ++ > 2 files changed, 7 insertions(+), 2 deletions(-) > > diff --git a/fs/netfs/objects.c b/fs/netfs/objects.c > index e41f9fc9bdd2..2f1865ff7cce 100644 > --- a/fs/netfs/objects.c > +++ b/fs/netfs/objects.c > @@ -22,7 +22,8 @@ struct netfs_io_request *netfs_alloc_request(struct address_space *mapping, > struct netfs_io_request *rreq; > int ret; > > - rreq = kzalloc(sizeof(struct netfs_io_request), GFP_KERNEL); > + rreq = kzalloc(ctx->ops->io_request_size ?: sizeof(struct netfs_io_request), > + GFP_KERNEL); > if (!rreq) > return ERR_PTR(-ENOMEM); > > @@ -116,7 +117,9 @@ struct netfs_io_subrequest *netfs_alloc_subrequest(struct netfs_io_request *rreq > { > struct netfs_io_subrequest *subreq; > > - subreq = kzalloc(sizeof(struct netfs_io_subrequest), GFP_KERNEL); > + subreq = kzalloc(rreq->netfs_ops->io_subrequest_size ?: > + sizeof(struct netfs_io_subrequest), > + GFP_KERNEL); > if (subreq) { > INIT_LIST_HEAD(&subreq->rreq_link); > refcount_set(&subreq->ref, 2); > diff --git a/include/linux/netfs.h b/include/linux/netfs.h > index b76a1548d311..442b88e39945 100644 > --- a/include/linux/netfs.h > +++ b/include/linux/netfs.h > @@ -214,6 +214,8 @@ struct netfs_io_request { > * Operations the network filesystem can/must provide to the helpers. > */ > struct netfs_request_ops { > + unsigned int io_request_size; /* Alloc size for netfs_io_request struct */ > + unsigned int io_subrequest_size; /* Alloc size for netfs_io_subrequest struct */ Yup, definitely a case for a future improvement to get rid of an extra allocation. I would suggest adding helpers for casting to and from the private area for both netfs_io_request and netfs_io_subrequest to the framework, see blk_mq_rq_to/from_pdu() for an example. Thanks, Ilya