[PATCH 27/28] lnet: libcfs: libcfs_debug_mb set incorrectly on init

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [linux Cryptography]     [Asterisk App Development]     [PJ SIP]     [Gnu Gatekeeper]     [IETF Sipping]     [Info Cyrus]     [ALSA User]     [Fedora Linux Users]     [Linux SCTP]     [DCCP]     [Gimp]     [Yosemite News]     [Deep Creek Hot Springs]     [Yosemite Campsites]     [ISDN Cause Codes]

  Powered by Linux