Message ID | 20210827180056.610170-1-trondmy@kernel.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | NFS: Always provide aligned buffers to the RPC read layers | expand |
On Fri, Aug 27, 2021 at 02:00:56PM -0400, trondmy@kernel.org wrote: > From: Trond Myklebust <trond.myklebust@hammerspace.com> > > Instead of messing around with XDR padding in the RDMA layer, we should > just give the RPC layer an aligned buffer. Try to avoid creating extra > RPC calls by aligning to the smaller value of ALIGN(len, rsize) and > PAGE_SIZE. I've bisected this change to be the cause of xfstests generic/525 getting stuck when tested against a standard Linux NFS server. It was stuck in a repeated request loop in kernel mode, and killable. I posted a patch with a full explanation in a reply.
diff --git a/fs/nfs/read.c b/fs/nfs/read.c index 9f39e0a1a38b..08d6cc57cbc3 100644 --- a/fs/nfs/read.c +++ b/fs/nfs/read.c @@ -293,15 +293,19 @@ static int readpage_async_filler(void *data, struct page *page) { struct nfs_readdesc *desc = data; + struct inode *inode = page_file_mapping(page)->host; + unsigned int rsize = NFS_SERVER(inode)->rsize; struct nfs_page *new; - unsigned int len; + unsigned int len, aligned_len; int error; len = nfs_page_length(page); if (len == 0) return nfs_return_empty_page(page); - new = nfs_create_request(desc->ctx, page, 0, len); + aligned_len = min_t(unsigned int, ALIGN(len, rsize), PAGE_SIZE); + + new = nfs_create_request(desc->ctx, page, 0, aligned_len); if (IS_ERR(new)) goto out_error;