Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

smb3: display max smb3 requests in flight at any one time

Displayed in /proc/fs/cifs/Stats once for each
socket we are connected to.

This allows us to find out what the maximum number of
requests that had been in flight (at any one time). Note that
/proc/fs/cifs/Stats can be reset if you want to look for
maximum over a small period of time.

Sample output (immediately after mount):

Resources in use
CIFS Session: 1
Share (unique mount targets): 2
SMB Request/Response Buffer: 1 Pool size: 5
SMB Small Req/Resp Buffer: 1 Pool size: 30
Operations (MIDs): 0

0 session 0 share reconnects
Total vfs operations: 5 maximum at one time: 2

Max requests in flight: 2
1) \\localhost\scratch
SMBs: 18
Bytes read: 0 Bytes written: 0
...

Signed-off-by: Steve French <stfrench@microsoft.com>
Reviewed-by: Pavel Shilovsky <pshilov@microsoft.com>

+10
+2
fs/cifs/cifs_debug.c
··· 452 452 list_for_each(tmp1, &cifs_tcp_ses_list) { 453 453 server = list_entry(tmp1, struct TCP_Server_Info, 454 454 tcp_ses_list); 455 + server->max_in_flight = 0; 455 456 #ifdef CONFIG_CIFS_STATS2 456 457 for (i = 0; i < NUMBER_OF_SMB2_COMMANDS; i++) { 457 458 atomic_set(&server->num_cmds[i], 0); ··· 527 526 list_for_each(tmp1, &cifs_tcp_ses_list) { 528 527 server = list_entry(tmp1, struct TCP_Server_Info, 529 528 tcp_ses_list); 529 + seq_printf(m, "\nMax requests in flight: %d", server->max_in_flight); 530 530 #ifdef CONFIG_CIFS_STATS2 531 531 seq_puts(m, "\nTotal time spent processing by command. Time "); 532 532 seq_printf(m, "units are jiffies (%d per second)\n", HZ);
+1
fs/cifs/cifsglob.h
··· 677 677 unsigned int credits; /* send no more requests at once */ 678 678 unsigned int max_credits; /* can override large 32000 default at mnt */ 679 679 unsigned int in_flight; /* number of requests on the wire to server */ 680 + unsigned int max_in_flight; /* max number of requests that were on wire */ 680 681 spinlock_t req_lock; /* protect the two values above */ 681 682 struct mutex srv_mutex; 682 683 struct task_struct *tsk;
+1
fs/cifs/connect.c
··· 2728 2728 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay; 2729 2729 tcp_ses->rdma = volume_info->rdma; 2730 2730 tcp_ses->in_flight = 0; 2731 + tcp_ses->max_in_flight = 0; 2731 2732 tcp_ses->credits = 1; 2732 2733 init_waitqueue_head(&tcp_ses->response_q); 2733 2734 init_waitqueue_head(&tcp_ses->request_q);
+2
fs/cifs/smb2ops.c
··· 203 203 credits->instance = server->reconnect_instance; 204 204 server->credits -= credits->value; 205 205 server->in_flight++; 206 + if (server->in_flight > server->max_in_flight) 207 + server->max_in_flight = server->in_flight; 206 208 break; 207 209 } 208 210 }
+4
fs/cifs/transport.c
··· 532 532 if ((flags & CIFS_TIMEOUT_MASK) == CIFS_NON_BLOCKING) { 533 533 /* oplock breaks must not be held up */ 534 534 server->in_flight++; 535 + if (server->in_flight > server->max_in_flight) 536 + server->max_in_flight = server->in_flight; 535 537 *credits -= 1; 536 538 *instance = server->reconnect_instance; 537 539 spin_unlock(&server->req_lock); ··· 610 608 if ((flags & CIFS_TIMEOUT_MASK) != CIFS_BLOCKING_OP) { 611 609 *credits -= num_credits; 612 610 server->in_flight += num_credits; 611 + if (server->in_flight > server->max_in_flight) 612 + server->max_in_flight = server->in_flight; 613 613 *instance = server->reconnect_instance; 614 614 } 615 615 spin_unlock(&server->req_lock);