OSDN Git Service

NFS: Avoid RCU usage in tracepoints
authorAnna Schumaker <Anna.Schumaker@Netapp.com>
Wed, 1 Nov 2017 19:48:43 +0000 (15:48 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 30 Nov 2017 08:40:46 +0000 (08:40 +0000)
commit 3944369db701f075092357b511fd9f5755771585 upstream.

There isn't an obvious way to acquire and release the RCU lock during a
tracepoint, so we can't use the rpc_peeraddr2str() function here.
Instead, rely on the client's cl_hostname, which should have similar
enough information without needing an rcu_dereference().

Reported-by: Dave Jones <davej@codemonkey.org.uk>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/nfs/nfs4trace.h

index e7c6275..71d2ca0 100644 (file)
@@ -202,17 +202,13 @@ DECLARE_EVENT_CLASS(nfs4_clientid_event,
                TP_ARGS(clp, error),
 
                TP_STRUCT__entry(
-                       __string(dstaddr,
-                               rpc_peeraddr2str(clp->cl_rpcclient,
-                                       RPC_DISPLAY_ADDR))
+                       __string(dstaddr, clp->cl_hostname)
                        __field(int, error)
                ),
 
                TP_fast_assign(
                        __entry->error = error;
-                       __assign_str(dstaddr,
-                               rpc_peeraddr2str(clp->cl_rpcclient,
-                                               RPC_DISPLAY_ADDR));
+                       __assign_str(dstaddr, clp->cl_hostname);
                ),
 
                TP_printk(
@@ -1133,9 +1129,7 @@ DECLARE_EVENT_CLASS(nfs4_inode_callback_event,
                        __field(dev_t, dev)
                        __field(u32, fhandle)
                        __field(u64, fileid)
-                       __string(dstaddr, clp ?
-                               rpc_peeraddr2str(clp->cl_rpcclient,
-                                       RPC_DISPLAY_ADDR) : "unknown")
+                       __string(dstaddr, clp ? clp->cl_hostname : "unknown")
                ),
 
                TP_fast_assign(
@@ -1148,9 +1142,7 @@ DECLARE_EVENT_CLASS(nfs4_inode_callback_event,
                                __entry->fileid = 0;
                                __entry->dev = 0;
                        }
-                       __assign_str(dstaddr, clp ?
-                               rpc_peeraddr2str(clp->cl_rpcclient,
-                                       RPC_DISPLAY_ADDR) : "unknown")
+                       __assign_str(dstaddr, clp ? clp->cl_hostname : "unknown")
                ),
 
                TP_printk(
@@ -1192,9 +1184,7 @@ DECLARE_EVENT_CLASS(nfs4_inode_stateid_callback_event,
                        __field(dev_t, dev)
                        __field(u32, fhandle)
                        __field(u64, fileid)
-                       __string(dstaddr, clp ?
-                               rpc_peeraddr2str(clp->cl_rpcclient,
-                                       RPC_DISPLAY_ADDR) : "unknown")
+                       __string(dstaddr, clp ? clp->cl_hostname : "unknown")
                        __field(int, stateid_seq)
                        __field(u32, stateid_hash)
                ),
@@ -1209,9 +1199,7 @@ DECLARE_EVENT_CLASS(nfs4_inode_stateid_callback_event,
                                __entry->fileid = 0;
                                __entry->dev = 0;
                        }
-                       __assign_str(dstaddr, clp ?
-                               rpc_peeraddr2str(clp->cl_rpcclient,
-                                       RPC_DISPLAY_ADDR) : "unknown")
+                       __assign_str(dstaddr, clp ? clp->cl_hostname : "unknown")
                        __entry->stateid_seq =
                                be32_to_cpu(stateid->seqid);
                        __entry->stateid_hash =