smb3: add way to control slow response threshold for logging and stats
/proc/fs/cifs/Stats when CONFIG_CIFS_STATS2 is enabled logs 'slow' responses, but depending on the server you are debugging a one second timeout may be too fast, so allow setting it to a larger number of seconds via new module parameter /sys/module/cifs/parameters/slow_rsp_threshold or via modprobe: slow_rsp_threshold:Amount of time (in seconds) to wait before logging that a response is delayed. Default: 1 (if set to 0 disables msg). (uint) Recommended values are 0 (disabled) to 32767 (9 hours) with the default remaining as 1 second. Signed-off-by: Steve French <stfrench@microsoft.com> Reviewed-by: Aurelien Aptel <aaptel@suse.com>
This commit is contained in:
Родитель
1c3a13a38a
Коммит
00778e2294
|
@ -81,6 +81,14 @@ module_param(cifs_max_pending, uint, 0444);
|
|||
MODULE_PARM_DESC(cifs_max_pending, "Simultaneous requests to server for "
|
||||
"CIFS/SMB1 dialect (N/A for SMB3) "
|
||||
"Default: 32767 Range: 2 to 32767.");
|
||||
#ifdef CONFIG_CIFS_STATS2
|
||||
unsigned int slow_rsp_threshold = 1;
|
||||
module_param(slow_rsp_threshold, uint, 0644);
|
||||
MODULE_PARM_DESC(slow_rsp_threshold, "Amount of time (in seconds) to wait "
|
||||
"before logging that a response is delayed. "
|
||||
"Default: 1 (if set to 0 disables msg).");
|
||||
#endif /* STATS2 */
|
||||
|
||||
module_param(enable_oplocks, bool, 0644);
|
||||
MODULE_PARM_DESC(enable_oplocks, "Enable or disable oplocks. Default: y/Y/1");
|
||||
|
||||
|
@ -1418,6 +1426,11 @@ init_cifs(void)
|
|||
#ifdef CONFIG_CIFS_STATS2
|
||||
atomic_set(&totBufAllocCount, 0);
|
||||
atomic_set(&totSmBufAllocCount, 0);
|
||||
if (slow_rsp_threshold < 1)
|
||||
cifs_dbg(FYI, "slow_response_threshold msgs disabled\n");
|
||||
else if (slow_rsp_threshold > 32767)
|
||||
cifs_dbg(VFS,
|
||||
"slow response threshold set higher than recommended (0 to 32767)\n");
|
||||
#endif /* CONFIG_CIFS_STATS2 */
|
||||
|
||||
atomic_set(&midCount, 0);
|
||||
|
|
|
@ -1715,6 +1715,7 @@ GLOBAL_EXTERN atomic_t bufAllocCount; /* current number allocated */
|
|||
#ifdef CONFIG_CIFS_STATS2
|
||||
GLOBAL_EXTERN atomic_t totBufAllocCount; /* total allocated over all time */
|
||||
GLOBAL_EXTERN atomic_t totSmBufAllocCount;
|
||||
extern unsigned int slow_rsp_threshold; /* number of secs before logging */
|
||||
#endif
|
||||
GLOBAL_EXTERN atomic_t smBufAllocCount;
|
||||
GLOBAL_EXTERN atomic_t midCount;
|
||||
|
|
|
@ -113,9 +113,18 @@ DeleteMidQEntry(struct mid_q_entry *midEntry)
|
|||
cifs_small_buf_release(midEntry->resp_buf);
|
||||
#ifdef CONFIG_CIFS_STATS2
|
||||
now = jiffies;
|
||||
/* commands taking longer than one second are indications that
|
||||
something is wrong, unless it is quite a slow link or server */
|
||||
if (time_after(now, midEntry->when_alloc + HZ) &&
|
||||
/*
|
||||
* commands taking longer than one second (default) can be indications
|
||||
* that something is wrong, unless it is quite a slow link or a very
|
||||
* busy server. Note that this calc is unlikely or impossible to wrap
|
||||
* as long as slow_rsp_threshold is not set way above recommended max
|
||||
* value (32767 ie 9 hours) and is generally harmless even if wrong
|
||||
* since only affects debug counters - so leaving the calc as simple
|
||||
* comparison rather than doing multiple conversions and overflow
|
||||
* checks
|
||||
*/
|
||||
if ((slow_rsp_threshold != 0) &&
|
||||
time_after(now, midEntry->when_alloc + (slow_rsp_threshold * HZ)) &&
|
||||
(midEntry->command != command)) {
|
||||
/* smb2slowcmd[NUMBER_OF_SMB2_COMMANDS] counts by command */
|
||||
if ((le16_to_cpu(midEntry->command) < NUMBER_OF_SMB2_COMMANDS) &&
|
||||
|
|
Загрузка…
Ссылка в новой задаче