]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
nfs: new tracepoint in nfs_delegation_need_return
authorJeff Layton <jlayton@kernel.org>
Wed, 18 Jun 2025 13:19:14 +0000 (09:19 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Mon, 14 Jul 2025 22:20:27 +0000 (15:20 -0700)
Add a tracepoint in the function that decides whether to return a
delegation to the server.

Reviewed-by: Benjamin Coddington <bcodding@redhat.com>
Signed-off-by: Jeff Layton <jlayton@kernel.org>
Link: https://lore.kernel.org/r/20250618-nfs-tracepoints-v2-3-540c9fb48da2@kernel.org
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/delegation.c
fs/nfs/nfs4trace.h

index 78a97d340bbd98390ca8302176c17caf08dcab4a..6f136c47eed7f1801af337f0e88f1a6bf477d0c6 100644 (file)
@@ -594,6 +594,8 @@ static bool nfs_delegation_need_return(struct nfs_delegation *delegation)
 {
        bool ret = false;
 
+       trace_nfs_delegation_need_return(delegation);
+
        if (test_and_clear_bit(NFS_DELEGATION_RETURN, &delegation->flags))
                ret = true;
        if (test_bit(NFS_DELEGATION_RETURNING, &delegation->flags) ||
index 674f15e91c544e22fc3da4cb750b4aeb8271bc07..6ab05261ce34fa1ea1c7bb5877ec901c86850c7b 100644 (file)
@@ -14,6 +14,8 @@
 #include <trace/misc/fs.h>
 #include <trace/misc/nfs.h>
 
+#include "delegation.h"
+
 #define show_nfs_fattr_flags(valid) \
        __print_flags((unsigned long)valid, "|", \
                { NFS_ATTR_FATTR_TYPE, "TYPE" }, \
@@ -985,6 +987,51 @@ DEFINE_NFS4_SET_DELEGATION_EVENT(nfs4_set_delegation);
 DEFINE_NFS4_SET_DELEGATION_EVENT(nfs4_reclaim_delegation);
 DEFINE_NFS4_SET_DELEGATION_EVENT(nfs4_detach_delegation);
 
+#define show_delegation_flags(flags) \
+       __print_flags(flags, "|", \
+               { BIT(NFS_DELEGATION_NEED_RECLAIM), "NEED_RECLAIM" }, \
+               { BIT(NFS_DELEGATION_RETURN), "RETURN" }, \
+               { BIT(NFS_DELEGATION_RETURN_IF_CLOSED), "RETURN_IF_CLOSED" }, \
+               { BIT(NFS_DELEGATION_REFERENCED), "REFERENCED" }, \
+               { BIT(NFS_DELEGATION_RETURNING), "RETURNING" }, \
+               { BIT(NFS_DELEGATION_REVOKED), "REVOKED" }, \
+               { BIT(NFS_DELEGATION_TEST_EXPIRED), "TEST_EXPIRED" }, \
+               { BIT(NFS_DELEGATION_INODE_FREEING), "INODE_FREEING" }, \
+               { BIT(NFS_DELEGATION_RETURN_DELAYED), "RETURN_DELAYED" })
+
+DECLARE_EVENT_CLASS(nfs4_delegation_event,
+               TP_PROTO(
+                       const struct nfs_delegation *delegation
+               ),
+
+               TP_ARGS(delegation),
+
+               TP_STRUCT__entry(
+                       __field(u32, fhandle)
+                       __field(unsigned int, fmode)
+                       __field(unsigned long, flags)
+               ),
+
+               TP_fast_assign(
+                       __entry->fhandle = nfs_fhandle_hash(NFS_FH(delegation->inode));
+                       __entry->fmode = delegation->type;
+                       __entry->flags = delegation->flags;
+               ),
+
+               TP_printk(
+                       "fhandle=0x%08x fmode=%s flags=%s",
+                       __entry->fhandle, show_fs_fmode_flags(__entry->fmode),
+                       show_delegation_flags(__entry->flags)
+               )
+);
+#define DEFINE_NFS4_DELEGATION_EVENT(name) \
+       DEFINE_EVENT(nfs4_delegation_event, name, \
+                       TP_PROTO( \
+                               const struct nfs_delegation *delegation \
+                       ), \
+                       TP_ARGS(delegation))
+DEFINE_NFS4_DELEGATION_EVENT(nfs_delegation_need_return);
+
 TRACE_EVENT(nfs4_delegreturn_exit,
                TP_PROTO(
                        const struct nfs4_delegreturnargs *args,