From: Chris Horn <chris.horn@xxxxxxx> If libcfs_debug_mb parameter is specified to insmod (i.e. set before module is initialized) then it does not get initialized correctly. libcfs_param_debug_mb_set() expects cfs_trace_get_debug_mb() to return zero if the module has not been initialized yet, but cfs_trace_get_debug_mb() will return 1 in this case. Modify cfs_trace_get_debug_mb() to return zero as expected. A related issue is that in this case we need to call cfs_trace_get_debug_mb() after cfs_tracefile_init() so that libcfs_debug_mb gets the same value it would get if we had set it after module init. When libcfs_debug_mb is specified to insmod, libcfs_debug_init() divides its value by num_possible_cpus(), but this is already done in libcfs_param_debug_mb_set(). Fixes: 205b154f3b ("lustre: always range-check libcfs_debug_mb setting.") HPE-bug-id: LUS-10839 WC-bug-id: https://jira.whamcloud.com/browse/LU-15689 Lustre-commit: d38ef181d8250b083 ("LU-15689 libcfs: libcfs_debug_mb set incorrectly on init") Signed-off-by: Chris Horn <chris.horn@xxxxxxx> Reviewed-on: https://review.whamcloud.com/46925 Reviewed-by: Neil Brown <neilb@xxxxxxx> Reviewed-by: James Simmons <jsimmons@xxxxxxxxxxxxx> Reviewed-by: Oleg Drokin <green@xxxxxxxxxxxxx> Signed-off-by: James Simmons <jsimmons@xxxxxxxxxxxxx> --- net/lnet/libcfs/debug.c | 9 +++------ net/lnet/libcfs/tracefile.c | 5 ++++- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/net/lnet/libcfs/debug.c b/net/lnet/libcfs/debug.c index f8ff5f7..c00e6da 100644 --- a/net/lnet/libcfs/debug.c +++ b/net/lnet/libcfs/debug.c @@ -544,12 +544,10 @@ int libcfs_debug_init(unsigned long bufsize) /* If libcfs_debug_mb is uninitialized then just make the * total buffers smp_num_cpus * TCD_MAX_PAGES */ - if (max < num_possible_cpus()) { + if (max < num_possible_cpus()) max = TCD_MAX_PAGES; - } else { - max = max / num_possible_cpus(); + else max <<= (20 - PAGE_SHIFT); - } rc = cfs_tracefile_init(max); if (rc) @@ -557,8 +555,7 @@ int libcfs_debug_init(unsigned long bufsize) libcfs_register_panic_notifier(); kernel_param_lock(THIS_MODULE); - if (libcfs_debug_mb == 0) - libcfs_debug_mb = cfs_trace_get_debug_mb(); + libcfs_debug_mb = cfs_trace_get_debug_mb(); kernel_param_unlock(THIS_MODULE); return rc; } diff --git a/net/lnet/libcfs/tracefile.c b/net/lnet/libcfs/tracefile.c index 948eaaa..f0b7a2e 100644 --- a/net/lnet/libcfs/tracefile.c +++ b/net/lnet/libcfs/tracefile.c @@ -1000,7 +1000,10 @@ int cfs_trace_get_debug_mb(void) up_read(&cfs_tracefile_sem); - return (total_pages >> (20 - PAGE_SHIFT)) + 1; + if (total_pages) + return (total_pages >> (20 - PAGE_SHIFT)) + 1; + else + return 0; } static int tracefiled(void *arg) -- 1.8.3.1
![]() |