Re: [PATCH] NFS/localio: fix nfs_local_dio_misaligned tracepoint

"Anna Schumaker" <[email protected]> Tue, 21 Jul 2026 09:56:33 -0400
Newsgroups gmane.linux.nfs
Message-ID <[email protected]>
Hi Mike,

On Wed, Jul 8, 2026, at 5:36 PM, Mike Snitzer wrote:
> The intended focus of nfs_local_iters_setup_dio()'s call to
> trace_nfs_local_dio_misaligned() is on the middle segment being
> misaligned, yet the @offset passed in was local_dio->start_len.
> It would appear this was a cut-n-paste bug from the preceding
> nfs_local_iter_setup() call that passes local_dio->start_len.
>
> Fix this by passing the @offset as local_dio->middle_offset and
> calculate the start segment's offset rather than assume.
>
> Example traces, before this fix:
>
>    python3-32744   [006] .l... 132946.352360:
>    nfs_local_dio_write: fileid=00:33:1286 fhandle=0xf1f7c10b
>    offset=1048759 count=1048576 mem_align=4 offset_align=512
>    start=1048759+329 middle=1049088+1048064 end=2097152+183
>
>    python3-32744   [006] .l... 132946.352360:
>    nfs_local_dio_misaligned: fileid=00:33:1286 fhandle=0xf1f7c10b
>    offset=329 count=1048064 mem_align=4 offset_align=512
>    start=329+329 middle=1049088+1048064 end=2097152+183
>
> After this fix:
>
>    python3-32744   [006] .l... 132946.352360:
>    nfs_local_dio_write: fileid=00:33:1286 fhandle=0xf1f7c10b
>    offset=1048759 count=1048576 mem_align=4 offset_align=512
>    start=1048759+329 middle=1049088+1048064 end=2097152+183
>
>    python3-32744   [006] .l... 132946.352360:
>    nfs_local_dio_misaligned: fileid=00:33:1286 fhandle=0xf1f7c10b
>    offset=1049088 count=1048064 mem_align=4 offset_align=512
>    start=1048759+329 middle=1049088+1048064 end=2097152+183
>
> Cc: [email protected]

Do you have a fixes tag for this commit?

Thanks,
Anna

> Signed-off-by: Mike Snitzer <[email protected]>
> ---
>  fs/nfs/localio.c  | 2 +-
>  fs/nfs/nfstrace.h | 5 ++++-
>  2 files changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/fs/nfs/localio.c b/fs/nfs/localio.c
> index f42b6112a613..63c38dea50cc 100644
> --- a/fs/nfs/localio.c
> +++ b/fs/nfs/localio.c
> @@ -446,7 +446,7 @@ nfs_local_iters_setup_dio(struct nfs_local_kiocb 
> *iocb, int rw,
> 
>  	if (unlikely(!iocb->iter_is_dio_aligned[n_iters])) {
>  		trace_nfs_local_dio_misaligned(iocb->hdr->inode,
> -			local_dio->start_len, local_dio->middle_len, local_dio);
> +			local_dio->middle_offset, local_dio->middle_len, local_dio);
>  		return 0; /* no DIO-aligned IO possible */
>  	}
>  	iocb->end_iter_index = n_iters;
> diff --git a/fs/nfs/nfstrace.h b/fs/nfs/nfstrace.h
> index c70debb88aa1..2e1932962a81 100644
> --- a/fs/nfs/nfstrace.h
> +++ b/fs/nfs/nfstrace.h
> @@ -1772,7 +1772,10 @@ DECLARE_EVENT_CLASS(nfs_local_dio_class,
>  		__entry->count = count;
>  		__entry->mem_align = local_dio->mem_align;
>  		__entry->offset_align = local_dio->offset_align;
> -		__entry->start = offset;
> +		if (local_dio->start_len)
> +			__entry->start = local_dio->middle_offset - local_dio->start_len;
> +		else
> +			__entry->start = 0;
>  		__entry->start_len = local_dio->start_len;
>  		__entry->middle = local_dio->middle_offset;
>  		__entry->middle_len = local_dio->middle_len;
> -- 
> 2.43.0