smb3: add dynamic trace point to trace when credits obtained
authorSteve French <stfrench@microsoft.com>
Mon, 19 Oct 2020 23:18:15 +0000 (18:18 -0500)
committerSteve French <stfrench@microsoft.com>
Tue, 20 Oct 2020 16:50:42 +0000 (11:50 -0500)
SMB3 crediting is used for flow control, and it can be useful to
trace for problem determination how many credits were acquired
and for which operation.

Here is an example ("trace-cmd record -e *add_credits"):
cifsd-9522    [010] ....  5995.202712: smb3_add_credits:
server=localhost current_mid=0x12 credits=373 credits_to_add=10
cifsd-9522    [010] ....  5995.204040: smb3_add_credits:
server=localhost current_mid=0x15 credits=400 credits_to_add=30

Reviewed-by: Aurelien Aptel <aaptel@suse.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/cifs/smb2ops.c
fs/cifs/trace.h
fs/cifs/transport.c

index 0dfa832a3de07a33aa132fa87539f04ab66c7db9..f085fe32c342995971b826c9f8410bd8c1a99cc6 100644 (file)
@@ -72,7 +72,7 @@ smb2_add_credits(struct TCP_Server_Info *server,
        /* eg found case where write overlapping reconnect messed up credits */
        if (((optype & CIFS_OP_MASK) == CIFS_NEG_OP) && (*val != 0))
                trace_smb3_reconnect_with_invalid_credits(server->CurrentMid,
-                       server->hostname, *val);
+                       server->hostname, *val, add);
        if ((instance == 0) || (instance == server->reconnect_instance))
                *val += add;
        else
@@ -121,6 +121,8 @@ smb2_add_credits(struct TCP_Server_Info *server,
                cifs_dbg(FYI, "disabling oplocks\n");
                break;
        default:
+               trace_smb3_add_credits(server->CurrentMid,
+                       server->hostname, rc, add);
                cifs_dbg(FYI, "add %u credits total=%d\n", add, rc);
        }
 }
index eef4b08c7208fbdeb9e731648567301f87ee3249..90e0fab69bb8c1243802a5177bf169f3f2899e8c 100644 (file)
@@ -878,33 +878,39 @@ DEFINE_SMB3_RECONNECT_EVENT(partial_send_reconnect);
 DECLARE_EVENT_CLASS(smb3_credit_class,
        TP_PROTO(__u64  currmid,
                char *hostname,
-               int credits),
-       TP_ARGS(currmid, hostname, credits),
+               int credits,
+               int credits_to_add),
+       TP_ARGS(currmid, hostname, credits, credits_to_add),
        TP_STRUCT__entry(
                __field(__u64, currmid)
                __field(char *, hostname)
                __field(int, credits)
+               __field(int, credits_to_add)
        ),
        TP_fast_assign(
                __entry->currmid = currmid;
                __entry->hostname = hostname;
                __entry->credits = credits;
+               __entry->credits_to_add = credits_to_add;
        ),
-       TP_printk("server=%s current_mid=0x%llx credits=%d",
+       TP_printk("server=%s current_mid=0x%llx credits=%d credits_to_add=%d",
                __entry->hostname,
                __entry->currmid,
-               __entry->credits)
+               __entry->credits,
+               __entry->credits_to_add)
 )
 
 #define DEFINE_SMB3_CREDIT_EVENT(name)        \
 DEFINE_EVENT(smb3_credit_class, smb3_##name,  \
        TP_PROTO(__u64  currmid,                \
                char *hostname,                 \
-               int  credits),                  \
-       TP_ARGS(currmid, hostname, credits))
+               int  credits,                   \
+               int  credits_to_add),           \
+       TP_ARGS(currmid, hostname, credits, credits_to_add))
 
 DEFINE_SMB3_CREDIT_EVENT(reconnect_with_invalid_credits);
 DEFINE_SMB3_CREDIT_EVENT(credit_timeout);
+DEFINE_SMB3_CREDIT_EVENT(add_credits);
 
 #endif /* _CIFS_TRACE_H */
 
index ac7632482736711b33a468de8986eb6173578373..e27e255d40dd899a7a7c612cd560eb4e6ff481ef 100644 (file)
@@ -563,7 +563,7 @@ wait_for_free_credits(struct TCP_Server_Info *server, const int num_credits,
                        cifs_num_waiters_dec(server);
                        if (!rc) {
                                trace_smb3_credit_timeout(server->CurrentMid,
-                                       server->hostname, num_credits);
+                                       server->hostname, num_credits, 0);
                                cifs_server_dbg(VFS, "wait timed out after %d ms\n",
                                         timeout);
                                return -ENOTSUPP;
@@ -604,7 +604,8 @@ wait_for_free_credits(struct TCP_Server_Info *server, const int num_credits,
                                if (!rc) {
                                        trace_smb3_credit_timeout(
                                                server->CurrentMid,
-                                               server->hostname, num_credits);
+                                               server->hostname, num_credits,
+                                               0);
                                        cifs_server_dbg(VFS, "wait timed out after %d ms\n",
                                                 timeout);
                                        return -ENOTSUPP;