All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 0/6] panic: sys_info: Refactor and fix a potential issue
@ 2025-10-30 11:44 Andy Shevchenko
  2025-10-30 11:44 ` [PATCH v3 1/6] panic: sys_info: Capture si_bits_global before iterating over it Andy Shevchenko
                   ` (6 more replies)
  0 siblings, 7 replies; 15+ messages in thread
From: Andy Shevchenko @ 2025-10-30 11:44 UTC (permalink / raw)
  To: Feng Tang, Andy Shevchenko, linux-kernel; +Cc: Andrew Morton

While targeting the compilation issue due to dangling variable,
I have noticed more opportunities for refactoring that helps to
avoid above mentioned compilation issue in a cleaner way and
also fixes a potential problem with global variable access.
Please, give it a try.

Changelog v3:
- addressed an issue with empty parameter returned (Feng)
- gathered tags (Feng)

Changelog v2:
v2: https://lore.kernel.org/r/20251029111202.3217870-2-andriy.shevchenko@linux.intel.com
- rebased on top of the current codebase
- addressed an issue when converting to match_string() (Feng)
- Cc'ed to Petr (requested by Feng)

v1: https://lore.kernel.org/r/20250711095413.1472448-1-andriy.shevchenko@linux.intel.com

Andy Shevchenko (6):
  panic: sys_info: Capture si_bits_global before iterating over it
  panic: sys_info: Align constant definition names with parameters
  panic: sys_info: Replace struct sys_info_name with plain array of
    strings
  panic: sys_info: Rewrite a fix for a compilation error (`make W=1`)
  panic: sys_info: Deduplicate local variable 'table; assignments
  panic: sys_info: Factor out read and write handlers

 include/linux/sys_info.h |   2 +-
 kernel/panic.c           |   2 +-
 lib/sys_info.c           | 138 +++++++++++++++++++++------------------
 3 files changed, 78 insertions(+), 64 deletions(-)

-- 
2.50.1


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v3 1/6] panic: sys_info: Capture si_bits_global before iterating over it
  2025-10-30 11:44 [PATCH v3 0/6] panic: sys_info: Refactor and fix a potential issue Andy Shevchenko
@ 2025-10-30 11:44 ` Andy Shevchenko
  2025-10-30 11:44 ` [PATCH v3 2/6] panic: sys_info: Align constant definition names with parameters Andy Shevchenko
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 15+ messages in thread
From: Andy Shevchenko @ 2025-10-30 11:44 UTC (permalink / raw)
  To: Feng Tang, Andy Shevchenko, linux-kernel; +Cc: Andrew Morton

The for-loop might re-read the content of the memory the si_bits_global
points to on each iteration. Instead, just capture it for the sake of
consistency and use that instead.

Reviewed-by: Feng Tang <feng.tang@linux.alibaba.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 lib/sys_info.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/lib/sys_info.c b/lib/sys_info.c
index 496f9151c9b6..d542a024406a 100644
--- a/lib/sys_info.c
+++ b/lib/sys_info.c
@@ -58,11 +58,11 @@ int sysctl_sys_info_handler(const struct ctl_table *ro_table, int write,
 	char names[sizeof(sys_info_avail)];
 	struct ctl_table table;
 	unsigned long *si_bits_global;
+	unsigned long si_bits;
 
 	si_bits_global = ro_table->data;
 
 	if (write) {
-		unsigned long si_bits;
 		int ret;
 
 		table = *ro_table;
@@ -81,9 +81,12 @@ int sysctl_sys_info_handler(const struct ctl_table *ro_table, int write,
 		char *delim = "";
 		int i, len = 0;
 
+		/* The access to the global value is not synchronized. */
+		si_bits = READ_ONCE(*si_bits_global);
+
 		names[0] = '\0';
 		for (i = 0; i < ARRAY_SIZE(si_names); i++) {
-			if (*si_bits_global & si_names[i].bit) {
+			if (si_bits & si_names[i].bit) {
 				len += scnprintf(names + len, sizeof(names) - len,
 					"%s%s", delim, si_names[i].name);
 				delim = ",";
-- 
2.50.1


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v3 2/6] panic: sys_info: Align constant definition names with parameters
  2025-10-30 11:44 [PATCH v3 0/6] panic: sys_info: Refactor and fix a potential issue Andy Shevchenko
  2025-10-30 11:44 ` [PATCH v3 1/6] panic: sys_info: Capture si_bits_global before iterating over it Andy Shevchenko
@ 2025-10-30 11:44 ` Andy Shevchenko
  2025-10-30 11:44 ` [PATCH v3 3/6] panic: sys_info: Replace struct sys_info_name with plain array of strings Andy Shevchenko
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 15+ messages in thread
From: Andy Shevchenko @ 2025-10-30 11:44 UTC (permalink / raw)
  To: Feng Tang, Andy Shevchenko, linux-kernel; +Cc: Andrew Morton

Align constant definition names with parameters to make it easier
to map. It's also better to maintain and extend the names while
keeping their uniqueness.

Reviewed-by: Feng Tang <feng.tang@linux.alibaba.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 include/linux/sys_info.h | 2 +-
 kernel/panic.c           | 2 +-
 lib/sys_info.c           | 4 ++--
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/include/linux/sys_info.h b/include/linux/sys_info.h
index 89d77dc4f2ed..a5bc3ea3d44b 100644
--- a/include/linux/sys_info.h
+++ b/include/linux/sys_info.h
@@ -14,7 +14,7 @@
 #define SYS_INFO_LOCKS			0x00000008
 #define SYS_INFO_FTRACE			0x00000010
 #define SYS_INFO_PANIC_CONSOLE_REPLAY	0x00000020
-#define SYS_INFO_ALL_CPU_BT		0x00000040
+#define SYS_INFO_ALL_BT			0x00000040
 #define SYS_INFO_BLOCKED_TASKS		0x00000080
 
 void sys_info(unsigned long si_mask);
diff --git a/kernel/panic.c b/kernel/panic.c
index 341c66948dcb..0d52210a9e2b 100644
--- a/kernel/panic.c
+++ b/kernel/panic.c
@@ -401,7 +401,7 @@ static void panic_trigger_all_cpu_backtrace(void)
  */
 static void panic_other_cpus_shutdown(bool crash_kexec)
 {
-	if (panic_print & SYS_INFO_ALL_CPU_BT)
+	if (panic_print & SYS_INFO_ALL_BT)
 		panic_trigger_all_cpu_backtrace();
 
 	/*
diff --git a/lib/sys_info.c b/lib/sys_info.c
index d542a024406a..6b0188b30227 100644
--- a/lib/sys_info.c
+++ b/lib/sys_info.c
@@ -23,7 +23,7 @@ static const struct sys_info_name  si_names[] = {
 	{ SYS_INFO_TIMERS,		"timers" },
 	{ SYS_INFO_LOCKS,		"locks" },
 	{ SYS_INFO_FTRACE,		"ftrace" },
-	{ SYS_INFO_ALL_CPU_BT,		"all_bt" },
+	{ SYS_INFO_ALL_BT,		"all_bt" },
 	{ SYS_INFO_BLOCKED_TASKS,	"blocked_tasks" },
 };
 
@@ -118,7 +118,7 @@ void sys_info(unsigned long si_mask)
 	if (si_mask & SYS_INFO_FTRACE)
 		ftrace_dump(DUMP_ALL);
 
-	if (si_mask & SYS_INFO_ALL_CPU_BT)
+	if (si_mask & SYS_INFO_ALL_BT)
 		trigger_all_cpu_backtrace();
 
 	if (si_mask & SYS_INFO_BLOCKED_TASKS)
-- 
2.50.1


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v3 3/6] panic: sys_info: Replace struct sys_info_name with plain array of strings
  2025-10-30 11:44 [PATCH v3 0/6] panic: sys_info: Refactor and fix a potential issue Andy Shevchenko
  2025-10-30 11:44 ` [PATCH v3 1/6] panic: sys_info: Capture si_bits_global before iterating over it Andy Shevchenko
  2025-10-30 11:44 ` [PATCH v3 2/6] panic: sys_info: Align constant definition names with parameters Andy Shevchenko
@ 2025-10-30 11:44 ` Andy Shevchenko
  2025-10-31  3:06   ` Andrew Morton
  2025-10-30 11:44 ` [PATCH v3 4/6] panic: sys_info: Rewrite a fix for a compilation error (`make W=1`) Andy Shevchenko
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 15+ messages in thread
From: Andy Shevchenko @ 2025-10-30 11:44 UTC (permalink / raw)
  To: Feng Tang, Andy Shevchenko, linux-kernel; +Cc: Andrew Morton

There is no need to keep a custom structure just for the need of
a plain array of strings. Replace struct sys_info_name with plain
array of strings.

With that done, simplify the code, in particular, naturally use
for_each_set_bit() when iterating over si_bits_global bitmap.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 lib/sys_info.c | 44 ++++++++++++++++++++------------------------
 1 file changed, 20 insertions(+), 24 deletions(-)

diff --git a/lib/sys_info.c b/lib/sys_info.c
index 6b0188b30227..29a63238b31d 100644
--- a/lib/sys_info.c
+++ b/lib/sys_info.c
@@ -1,30 +1,29 @@
 // SPDX-License-Identifier: GPL-2.0-only
-#include <linux/sched/debug.h>
+#include <linux/bitops.h>
 #include <linux/console.h>
+#include <linux/log2.h>
 #include <linux/kernel.h>
 #include <linux/ftrace.h>
-#include <linux/sysctl.h>
 #include <linux/nmi.h>
+#include <linux/sched/debug.h>
+#include <linux/string.h>
+#include <linux/sysctl.h>
 
 #include <linux/sys_info.h>
 
-struct sys_info_name {
-	unsigned long bit;
-	const char *name;
-};
-
 /*
  * When 'si_names' gets updated,  please make sure the 'sys_info_avail'
  * below is updated accordingly.
  */
-static const struct sys_info_name  si_names[] = {
-	{ SYS_INFO_TASKS,		"tasks" },
-	{ SYS_INFO_MEM,			"mem" },
-	{ SYS_INFO_TIMERS,		"timers" },
-	{ SYS_INFO_LOCKS,		"locks" },
-	{ SYS_INFO_FTRACE,		"ftrace" },
-	{ SYS_INFO_ALL_BT,		"all_bt" },
-	{ SYS_INFO_BLOCKED_TASKS,	"blocked_tasks" },
+static const char * const si_names[] = {
+	[ilog2(SYS_INFO_TASKS)]			= "tasks",
+	[ilog2(SYS_INFO_MEM)]			= "mem",
+	[ilog2(SYS_INFO_TIMERS)]		= "timers",
+	[ilog2(SYS_INFO_LOCKS)]			= "locks",
+	[ilog2(SYS_INFO_FTRACE)]		= "ftrace",
+	[ilog2(SYS_INFO_PANIC_CONSOLE_REPLAY)]	= "",
+	[ilog2(SYS_INFO_ALL_BT)]		= "all_bt",
+	[ilog2(SYS_INFO_BLOCKED_TASKS)]		= "blocked_tasks",
 };
 
 /* Expecting string like "xxx_sys_info=tasks,mem,timers,locks,ftrace,..." */
@@ -36,12 +35,9 @@ unsigned long sys_info_parse_param(char *str)
 
 	s = str;
 	while ((name = strsep(&s, ",")) && *name) {
-		for (i = 0; i < ARRAY_SIZE(si_names); i++) {
-			if (!strcmp(name, si_names[i].name)) {
-				si_bits |= si_names[i].bit;
-				break;
-			}
-		}
+		i = match_string(si_names, ARRAY_SIZE(si_names), name);
+		if (i >= 0)
+			__set_bit(i, &si_bits);
 	}
 
 	return si_bits;
@@ -85,10 +81,10 @@ int sysctl_sys_info_handler(const struct ctl_table *ro_table, int write,
 		si_bits = READ_ONCE(*si_bits_global);
 
 		names[0] = '\0';
-		for (i = 0; i < ARRAY_SIZE(si_names); i++) {
-			if (si_bits & si_names[i].bit) {
+		for_each_set_bit(i, &si_bits, ARRAY_SIZE(si_names)) {
+			if (*si_names[i]) {
 				len += scnprintf(names + len, sizeof(names) - len,
-					"%s%s", delim, si_names[i].name);
+						 "%s%s", delim, si_names[i]);
 				delim = ",";
 			}
 		}
-- 
2.50.1


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v3 4/6] panic: sys_info: Rewrite a fix for a compilation error (`make W=1`)
  2025-10-30 11:44 [PATCH v3 0/6] panic: sys_info: Refactor and fix a potential issue Andy Shevchenko
                   ` (2 preceding siblings ...)
  2025-10-30 11:44 ` [PATCH v3 3/6] panic: sys_info: Replace struct sys_info_name with plain array of strings Andy Shevchenko
@ 2025-10-30 11:44 ` Andy Shevchenko
  2025-10-30 11:44 ` [PATCH v3 5/6] panic: sys_info: Deduplicate local variable 'table; assignments Andy Shevchenko
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 15+ messages in thread
From: Andy Shevchenko @ 2025-10-30 11:44 UTC (permalink / raw)
  To: Feng Tang, Andy Shevchenko, linux-kernel; +Cc: Andrew Morton

Compiler was not happy about dead variable in use:

lib/sys_info.c:52:19: error: variable 'sys_info_avail' is not needed and will not be emitted [-Werror,-Wunneeded-internal-declaration]
   52 | static const char sys_info_avail[] = "tasks,mem,timers,locks,ftrace,all_bt,blocked_tasks";
      |                   ^~~~~~~~~~~~~~

This was fixed by adding __maybe_unused attribute that just hides the issue
and didn't actually fix the root cause. Rewrite the fix by moving the local
variable from stack to a heap.

As a side effect this drops unneeded "synchronisation" of duplicative info
and also makes code ready for the further refactoring.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 lib/sys_info.c | 28 ++++++++++++++++------------
 1 file changed, 16 insertions(+), 12 deletions(-)

diff --git a/lib/sys_info.c b/lib/sys_info.c
index 29a63238b31d..eb5c1226bfc8 100644
--- a/lib/sys_info.c
+++ b/lib/sys_info.c
@@ -1,5 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0-only
+#include <linux/array_size.h>
 #include <linux/bitops.h>
+#include <linux/cleanup.h>
 #include <linux/console.h>
 #include <linux/log2.h>
 #include <linux/kernel.h>
@@ -11,10 +13,6 @@
 
 #include <linux/sys_info.h>
 
-/*
- * When 'si_names' gets updated,  please make sure the 'sys_info_avail'
- * below is updated accordingly.
- */
 static const char * const si_names[] = {
 	[ilog2(SYS_INFO_TASKS)]			= "tasks",
 	[ilog2(SYS_INFO_MEM)]			= "mem",
@@ -45,25 +43,32 @@ unsigned long sys_info_parse_param(char *str)
 
 #ifdef CONFIG_SYSCTL
 
-static const char sys_info_avail[] __maybe_unused = "tasks,mem,timers,locks,ftrace,all_bt,blocked_tasks";
-
 int sysctl_sys_info_handler(const struct ctl_table *ro_table, int write,
 					  void *buffer, size_t *lenp,
 					  loff_t *ppos)
 {
-	char names[sizeof(sys_info_avail)];
 	struct ctl_table table;
 	unsigned long *si_bits_global;
 	unsigned long si_bits;
+	unsigned int i;
+	size_t maxlen;
 
 	si_bits_global = ro_table->data;
 
+	maxlen = 0;
+	for (i = 0; i < ARRAY_SIZE(si_names); i++)
+		maxlen += strlen(si_names[i]) + 1;
+
+	char *names __free(kfree) = kzalloc(maxlen, GFP_KERNEL);
+	if (!names)
+		return -ENOMEM;
+
 	if (write) {
 		int ret;
 
 		table = *ro_table;
 		table.data = names;
-		table.maxlen = sizeof(names);
+		table.maxlen = maxlen;
 		ret = proc_dostring(&table, write, buffer, lenp, ppos);
 		if (ret)
 			return ret;
@@ -74,16 +79,15 @@ int sysctl_sys_info_handler(const struct ctl_table *ro_table, int write,
 		return 0;
 	} else {
 		/* for 'read' operation */
+		unsigned int len = 0;
 		char *delim = "";
-		int i, len = 0;
 
 		/* The access to the global value is not synchronized. */
 		si_bits = READ_ONCE(*si_bits_global);
 
-		names[0] = '\0';
 		for_each_set_bit(i, &si_bits, ARRAY_SIZE(si_names)) {
 			if (*si_names[i]) {
-				len += scnprintf(names + len, sizeof(names) - len,
+				len += scnprintf(names + len, maxlen - len,
 						 "%s%s", delim, si_names[i]);
 				delim = ",";
 			}
@@ -91,7 +95,7 @@ int sysctl_sys_info_handler(const struct ctl_table *ro_table, int write,
 
 		table = *ro_table;
 		table.data = names;
-		table.maxlen = sizeof(names);
+		table.maxlen = maxlen;
 		return proc_dostring(&table, write, buffer, lenp, ppos);
 	}
 }
-- 
2.50.1


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v3 5/6] panic: sys_info: Deduplicate local variable 'table; assignments
  2025-10-30 11:44 [PATCH v3 0/6] panic: sys_info: Refactor and fix a potential issue Andy Shevchenko
                   ` (3 preceding siblings ...)
  2025-10-30 11:44 ` [PATCH v3 4/6] panic: sys_info: Rewrite a fix for a compilation error (`make W=1`) Andy Shevchenko
@ 2025-10-30 11:44 ` Andy Shevchenko
  2025-10-30 11:44 ` [PATCH v3 6/6] panic: sys_info: Factor out read and write handlers Andy Shevchenko
  2025-10-30 14:07 ` [PATCH v3 0/6] panic: sys_info: Refactor and fix a potential issue Andy Shevchenko
  6 siblings, 0 replies; 15+ messages in thread
From: Andy Shevchenko @ 2025-10-30 11:44 UTC (permalink / raw)
  To: Feng Tang, Andy Shevchenko, linux-kernel; +Cc: Andrew Morton

The both handlers use the local 'table' variable and assign
the same data to it, deduplicate that.

Reviewed-by: Feng Tang <feng.tang@linux.alibaba.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 lib/sys_info.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/lib/sys_info.c b/lib/sys_info.c
index eb5c1226bfc8..94526de8482b 100644
--- a/lib/sys_info.c
+++ b/lib/sys_info.c
@@ -63,12 +63,13 @@ int sysctl_sys_info_handler(const struct ctl_table *ro_table, int write,
 	if (!names)
 		return -ENOMEM;
 
+	table = *ro_table;
+	table.data = names;
+	table.maxlen = maxlen;
+
 	if (write) {
 		int ret;
 
-		table = *ro_table;
-		table.data = names;
-		table.maxlen = maxlen;
 		ret = proc_dostring(&table, write, buffer, lenp, ppos);
 		if (ret)
 			return ret;
@@ -93,9 +94,6 @@ int sysctl_sys_info_handler(const struct ctl_table *ro_table, int write,
 			}
 		}
 
-		table = *ro_table;
-		table.data = names;
-		table.maxlen = maxlen;
 		return proc_dostring(&table, write, buffer, lenp, ppos);
 	}
 }
-- 
2.50.1


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v3 6/6] panic: sys_info: Factor out read and write handlers
  2025-10-30 11:44 [PATCH v3 0/6] panic: sys_info: Refactor and fix a potential issue Andy Shevchenko
                   ` (4 preceding siblings ...)
  2025-10-30 11:44 ` [PATCH v3 5/6] panic: sys_info: Deduplicate local variable 'table; assignments Andy Shevchenko
@ 2025-10-30 11:44 ` Andy Shevchenko
  2025-10-31  3:16   ` Andrew Morton
  2025-10-30 14:07 ` [PATCH v3 0/6] panic: sys_info: Refactor and fix a potential issue Andy Shevchenko
  6 siblings, 1 reply; 15+ messages in thread
From: Andy Shevchenko @ 2025-10-30 11:44 UTC (permalink / raw)
  To: Feng Tang, Andy Shevchenko, linux-kernel; +Cc: Andrew Morton

For the sake of the code readability and easier maintenance
factor out read and write sys_info handlers.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 lib/sys_info.c | 79 +++++++++++++++++++++++++++++---------------------
 1 file changed, 46 insertions(+), 33 deletions(-)

diff --git a/lib/sys_info.c b/lib/sys_info.c
index 94526de8482b..874b9471a068 100644
--- a/lib/sys_info.c
+++ b/lib/sys_info.c
@@ -43,18 +43,56 @@ unsigned long sys_info_parse_param(char *str)
 
 #ifdef CONFIG_SYSCTL
 
+static int sys_info_write_handler(struct ctl_table *table,
+				  void *buffer, size_t *lenp, loff_t *ppos,
+				  unsigned long *si_bits_global)
+{
+	unsigned long si_bits;
+	int ret;
+
+	ret = proc_dostring(table, 1, buffer, lenp, ppos);
+	if (ret)
+		return ret;
+
+	si_bits = sys_info_parse_param(table->data);
+
+	/* The access to the global value is not synchronized. */
+	WRITE_ONCE(*si_bits_global, si_bits);
+
+	return 0;
+}
+
+static int sys_info_read_handler(struct ctl_table *table,
+				 void *buffer, size_t *lenp, loff_t *ppos,
+				 unsigned long *si_bits_global)
+{
+	unsigned long si_bits;
+	unsigned int len = 0;
+	char *delim = "";
+	unsigned int i;
+
+	/* The access to the global value is not synchronized. */
+	si_bits = READ_ONCE(*si_bits_global);
+
+	for_each_set_bit(i, &si_bits, ARRAY_SIZE(si_names)) {
+		if (*si_names[i]) {
+			len += scnprintf(table->data + len, table->maxlen - len,
+					 "%s%s", delim, si_names[i]);
+			delim = ",";
+		}
+	}
+
+	return proc_dostring(table, 0, buffer, lenp, ppos);
+}
+
 int sysctl_sys_info_handler(const struct ctl_table *ro_table, int write,
 					  void *buffer, size_t *lenp,
 					  loff_t *ppos)
 {
 	struct ctl_table table;
-	unsigned long *si_bits_global;
-	unsigned long si_bits;
 	unsigned int i;
 	size_t maxlen;
 
-	si_bits_global = ro_table->data;
-
 	maxlen = 0;
 	for (i = 0; i < ARRAY_SIZE(si_names); i++)
 		maxlen += strlen(si_names[i]) + 1;
@@ -67,35 +105,10 @@ int sysctl_sys_info_handler(const struct ctl_table *ro_table, int write,
 	table.data = names;
 	table.maxlen = maxlen;
 
-	if (write) {
-		int ret;
-
-		ret = proc_dostring(&table, write, buffer, lenp, ppos);
-		if (ret)
-			return ret;
-
-		si_bits = sys_info_parse_param(names);
-		/* The access to the global value is not synchronized. */
-		WRITE_ONCE(*si_bits_global, si_bits);
-		return 0;
-	} else {
-		/* for 'read' operation */
-		unsigned int len = 0;
-		char *delim = "";
-
-		/* The access to the global value is not synchronized. */
-		si_bits = READ_ONCE(*si_bits_global);
-
-		for_each_set_bit(i, &si_bits, ARRAY_SIZE(si_names)) {
-			if (*si_names[i]) {
-				len += scnprintf(names + len, maxlen - len,
-						 "%s%s", delim, si_names[i]);
-				delim = ",";
-			}
-		}
-
-		return proc_dostring(&table, write, buffer, lenp, ppos);
-	}
+	if (write)
+		return sys_info_write_handler(&table, buffer, lenp, ppos, ro_table->data);
+	else
+		return sys_info_read_handler(&table, buffer, lenp, ppos, ro_table->data);
 }
 #endif
 
-- 
2.50.1


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [PATCH v3 0/6] panic: sys_info: Refactor and fix a potential issue
  2025-10-30 11:44 [PATCH v3 0/6] panic: sys_info: Refactor and fix a potential issue Andy Shevchenko
                   ` (5 preceding siblings ...)
  2025-10-30 11:44 ` [PATCH v3 6/6] panic: sys_info: Factor out read and write handlers Andy Shevchenko
@ 2025-10-30 14:07 ` Andy Shevchenko
  2025-10-30 15:48   ` Petr Mladek
  6 siblings, 1 reply; 15+ messages in thread
From: Andy Shevchenko @ 2025-10-30 14:07 UTC (permalink / raw)
  To: Feng Tang, linux-kernel; +Cc: Andrew Morton, Petr Mladek

On Thu, Oct 30, 2025 at 12:44:16PM +0100, Andy Shevchenko wrote:

+Cc: Petr, sorry, forgot to add you to the Cc list.

> While targeting the compilation issue due to dangling variable,
> I have noticed more opportunities for refactoring that helps to
> avoid above mentioned compilation issue in a cleaner way and
> also fixes a potential problem with global variable access.
> Please, give it a try.
> 
> Changelog v3:
> - addressed an issue with empty parameter returned (Feng)
> - gathered tags (Feng)
> 
> Changelog v2:
> v2: https://lore.kernel.org/r/20251029111202.3217870-2-andriy.shevchenko@linux.intel.com
> - rebased on top of the current codebase
> - addressed an issue when converting to match_string() (Feng)
> - Cc'ed to Petr (requested by Feng)
> 
> v1: https://lore.kernel.org/r/20250711095413.1472448-1-andriy.shevchenko@linux.intel.com

-- 
With Best Regards,
Andy Shevchenko



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v3 0/6] panic: sys_info: Refactor and fix a potential issue
  2025-10-30 14:07 ` [PATCH v3 0/6] panic: sys_info: Refactor and fix a potential issue Andy Shevchenko
@ 2025-10-30 15:48   ` Petr Mladek
  2025-10-31  7:56     ` Andy Shevchenko
  0 siblings, 1 reply; 15+ messages in thread
From: Petr Mladek @ 2025-10-30 15:48 UTC (permalink / raw)
  To: Andy Shevchenko; +Cc: Feng Tang, linux-kernel, Andrew Morton

On Thu 2025-10-30 16:07:47, Andy Shevchenko wrote:
> On Thu, Oct 30, 2025 at 12:44:16PM +0100, Andy Shevchenko wrote:
> 
> +Cc: Petr, sorry, forgot to add you to the Cc list.

Thank you for Cc-ing me.

> > While targeting the compilation issue due to dangling variable,
> > I have noticed more opportunities for refactoring that helps to
> > avoid above mentioned compilation issue in a cleaner way and
> > also fixes a potential problem with global variable access.
> > Please, give it a try.
> > 
> > Changelog v3:
> > - addressed an issue with empty parameter returned (Feng)
> > - gathered tags (Feng)

I like all the changes and do not see any problem there.
For the entire patchset, feel free to use:

Reviewed-by: Petr Mladek <pmladek@suse.com>

Best Regards,
Petr

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v3 3/6] panic: sys_info: Replace struct sys_info_name with plain array of strings
  2025-10-30 11:44 ` [PATCH v3 3/6] panic: sys_info: Replace struct sys_info_name with plain array of strings Andy Shevchenko
@ 2025-10-31  3:06   ` Andrew Morton
  2025-10-31  7:23     ` Andy Shevchenko
  0 siblings, 1 reply; 15+ messages in thread
From: Andrew Morton @ 2025-10-31  3:06 UTC (permalink / raw)
  To: Andy Shevchenko; +Cc: Feng Tang, linux-kernel, Petr Mladek

On Thu, 30 Oct 2025 12:44:19 +0100 Andy Shevchenko <andriy.shevchenko@linux.intel.com> wrote:

> There is no need to keep a custom structure just for the need of
> a plain array of strings. Replace struct sys_info_name with plain
> array of strings.
> 
> With that done, simplify the code, in particular, naturally use
> for_each_set_bit() when iterating over si_bits_global bitmap.
> 
> ...
>
> -static const struct sys_info_name  si_names[] = {
> -	{ SYS_INFO_TASKS,		"tasks" },
> -	{ SYS_INFO_MEM,			"mem" },
> -	{ SYS_INFO_TIMERS,		"timers" },
> -	{ SYS_INFO_LOCKS,		"locks" },
> -	{ SYS_INFO_FTRACE,		"ftrace" },
> -	{ SYS_INFO_ALL_BT,		"all_bt" },
> -	{ SYS_INFO_BLOCKED_TASKS,	"blocked_tasks" },
> +static const char * const si_names[] = {
> +	[ilog2(SYS_INFO_TASKS)]			= "tasks",
> +	[ilog2(SYS_INFO_MEM)]			= "mem",
> +	[ilog2(SYS_INFO_TIMERS)]		= "timers",
> +	[ilog2(SYS_INFO_LOCKS)]			= "locks",
> +	[ilog2(SYS_INFO_FTRACE)]		= "ftrace",
> +	[ilog2(SYS_INFO_PANIC_CONSOLE_REPLAY)]	= "",
> +	[ilog2(SYS_INFO_ALL_BT)]		= "all_bt",
> +	[ilog2(SYS_INFO_BLOCKED_TASKS)]		= "blocked_tasks",
>  };

We have this const_ilog2() which appears to exist to work around a
sparse shortcoming.  But only net/ethtool/common.c uses it - plenty of
other sites do what you've done.

Which makes me wonder whether const_ilog2() can be removed, switch
everything over to ilog2().

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v3 6/6] panic: sys_info: Factor out read and write handlers
  2025-10-30 11:44 ` [PATCH v3 6/6] panic: sys_info: Factor out read and write handlers Andy Shevchenko
@ 2025-10-31  3:16   ` Andrew Morton
  2025-10-31  7:22     ` Andy Shevchenko
  0 siblings, 1 reply; 15+ messages in thread
From: Andrew Morton @ 2025-10-31  3:16 UTC (permalink / raw)
  To: Andy Shevchenko; +Cc: Feng Tang, linux-kernel

On Thu, 30 Oct 2025 12:44:22 +0100 Andy Shevchenko <andriy.shevchenko@linux.intel.com> wrote:

> For the sake of the code readability and easier maintenance
> factor out read and write sys_info handlers.
> 
> ...
>
> --- a/lib/sys_info.c
> +++ b/lib/sys_info.c
> @@ -43,18 +43,56 @@ unsigned long sys_info_parse_param(char *str)
>  
>  #ifdef CONFIG_SYSCTL
>  
> +static int sys_info_write_handler(struct ctl_table *table,
> +				  void *buffer, size_t *lenp, loff_t *ppos,
> +				  unsigned long *si_bits_global)
> +{

checkpatch wanted this:

--- a/lib/sys_info.c~panic-sys_info-factor-out-read-and-write-handlers-checkpatch-fixes
+++ a/lib/sys_info.c
@@ -43,7 +43,7 @@ unsigned long sys_info_parse_param(char
 
 #ifdef CONFIG_SYSCTL
 
-static int sys_info_write_handler(struct ctl_table *table,
+static int sys_info_write_handler(const struct ctl_table *table,
 				  void *buffer, size_t *lenp, loff_t *ppos,
 				  unsigned long *si_bits_global)
 {
@@ -62,7 +62,7 @@ static int sys_info_write_handler(struct
 	return 0;
 }
 
-static int sys_info_read_handler(struct ctl_table *table,
+static int sys_info_read_handler(const struct ctl_table *table,
 				 void *buffer, size_t *lenp, loff_t *ppos,
 				 unsigned long *si_bits_global)
 {
_


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v3 6/6] panic: sys_info: Factor out read and write handlers
  2025-10-31  3:16   ` Andrew Morton
@ 2025-10-31  7:22     ` Andy Shevchenko
  2025-10-31  7:25       ` Andy Shevchenko
  0 siblings, 1 reply; 15+ messages in thread
From: Andy Shevchenko @ 2025-10-31  7:22 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Feng Tang, linux-kernel

On Thu, Oct 30, 2025 at 08:16:12PM -0700, Andrew Morton wrote:
> On Thu, 30 Oct 2025 12:44:22 +0100 Andy Shevchenko <andriy.shevchenko@linux.intel.com> wrote:

...

> checkpatch wanted this:

Makes sense. Have you applied this update to your tree already? Or should I
send (re-send) a formal patch?

> --- a/lib/sys_info.c~panic-sys_info-factor-out-read-and-write-handlers-checkpatch-fixes
> +++ a/lib/sys_info.c
> @@ -43,7 +43,7 @@ unsigned long sys_info_parse_param(char
>  
>  #ifdef CONFIG_SYSCTL
>  
> -static int sys_info_write_handler(struct ctl_table *table,
> +static int sys_info_write_handler(const struct ctl_table *table,
>  				  void *buffer, size_t *lenp, loff_t *ppos,
>  				  unsigned long *si_bits_global)
>  {
> @@ -62,7 +62,7 @@ static int sys_info_write_handler(struct
>  	return 0;
>  }
>  
> -static int sys_info_read_handler(struct ctl_table *table,
> +static int sys_info_read_handler(const struct ctl_table *table,
>  				 void *buffer, size_t *lenp, loff_t *ppos,
>  				 unsigned long *si_bits_global)
>  {

Thank you for the review!

-- 
With Best Regards,
Andy Shevchenko



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v3 3/6] panic: sys_info: Replace struct sys_info_name with plain array of strings
  2025-10-31  3:06   ` Andrew Morton
@ 2025-10-31  7:23     ` Andy Shevchenko
  0 siblings, 0 replies; 15+ messages in thread
From: Andy Shevchenko @ 2025-10-31  7:23 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Feng Tang, linux-kernel, Petr Mladek

On Thu, Oct 30, 2025 at 08:06:16PM -0700, Andrew Morton wrote:
> On Thu, 30 Oct 2025 12:44:19 +0100 Andy Shevchenko <andriy.shevchenko@linux.intel.com> wrote:

...

> > -static const struct sys_info_name  si_names[] = {
> > -	{ SYS_INFO_TASKS,		"tasks" },
> > -	{ SYS_INFO_MEM,			"mem" },
> > -	{ SYS_INFO_TIMERS,		"timers" },
> > -	{ SYS_INFO_LOCKS,		"locks" },
> > -	{ SYS_INFO_FTRACE,		"ftrace" },
> > -	{ SYS_INFO_ALL_BT,		"all_bt" },
> > -	{ SYS_INFO_BLOCKED_TASKS,	"blocked_tasks" },
> > +static const char * const si_names[] = {
> > +	[ilog2(SYS_INFO_TASKS)]			= "tasks",
> > +	[ilog2(SYS_INFO_MEM)]			= "mem",
> > +	[ilog2(SYS_INFO_TIMERS)]		= "timers",
> > +	[ilog2(SYS_INFO_LOCKS)]			= "locks",
> > +	[ilog2(SYS_INFO_FTRACE)]		= "ftrace",
> > +	[ilog2(SYS_INFO_PANIC_CONSOLE_REPLAY)]	= "",
> > +	[ilog2(SYS_INFO_ALL_BT)]		= "all_bt",
> > +	[ilog2(SYS_INFO_BLOCKED_TASKS)]		= "blocked_tasks",
> >  };
> 
> We have this const_ilog2() which appears to exist to work around a
> sparse shortcoming.  But only net/ethtool/common.c uses it - plenty of
> other sites do what you've done.
> 
> Which makes me wonder whether const_ilog2() can be removed, switch
> everything over to ilog2().

Good question. I haven't noticed sparse errors, I always use make W=1 C=1 for
my local builds.

-- 
With Best Regards,
Andy Shevchenko



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v3 6/6] panic: sys_info: Factor out read and write handlers
  2025-10-31  7:22     ` Andy Shevchenko
@ 2025-10-31  7:25       ` Andy Shevchenko
  0 siblings, 0 replies; 15+ messages in thread
From: Andy Shevchenko @ 2025-10-31  7:25 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Feng Tang, linux-kernel

On Fri, Oct 31, 2025 at 09:22:16AM +0200, Andy Shevchenko wrote:
> On Thu, Oct 30, 2025 at 08:16:12PM -0700, Andrew Morton wrote:
> > On Thu, 30 Oct 2025 12:44:22 +0100 Andy Shevchenko <andriy.shevchenko@linux.intel.com> wrote:

...

> > checkpatch wanted this:
> 
> Makes sense. Have you applied this update to your tree already? Or should I
> send (re-send) a formal patch?

Never mind, I see it's there, thanks!

> Thank you for the review!

-- 
With Best Regards,
Andy Shevchenko



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v3 0/6] panic: sys_info: Refactor and fix a potential issue
  2025-10-30 15:48   ` Petr Mladek
@ 2025-10-31  7:56     ` Andy Shevchenko
  0 siblings, 0 replies; 15+ messages in thread
From: Andy Shevchenko @ 2025-10-31  7:56 UTC (permalink / raw)
  To: Petr Mladek; +Cc: Feng Tang, linux-kernel, Andrew Morton

On Thu, Oct 30, 2025 at 04:48:03PM +0100, Petr Mladek wrote:
> On Thu 2025-10-30 16:07:47, Andy Shevchenko wrote:
> > On Thu, Oct 30, 2025 at 12:44:16PM +0100, Andy Shevchenko wrote:
> > 
> > +Cc: Petr, sorry, forgot to add you to the Cc list.
> 
> Thank you for Cc-ing me.
> 
> > > While targeting the compilation issue due to dangling variable,
> > > I have noticed more opportunities for refactoring that helps to
> > > avoid above mentioned compilation issue in a cleaner way and
> > > also fixes a potential problem with global variable access.
> > > Please, give it a try.
> > > 
> > > Changelog v3:
> > > - addressed an issue with empty parameter returned (Feng)
> > > - gathered tags (Feng)
> 
> I like all the changes and do not see any problem there.
> For the entire patchset, feel free to use:
> 
> Reviewed-by: Petr Mladek <pmladek@suse.com>

Thank you!

-- 
With Best Regards,
Andy Shevchenko



^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2025-10-31  7:56 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-10-30 11:44 [PATCH v3 0/6] panic: sys_info: Refactor and fix a potential issue Andy Shevchenko
2025-10-30 11:44 ` [PATCH v3 1/6] panic: sys_info: Capture si_bits_global before iterating over it Andy Shevchenko
2025-10-30 11:44 ` [PATCH v3 2/6] panic: sys_info: Align constant definition names with parameters Andy Shevchenko
2025-10-30 11:44 ` [PATCH v3 3/6] panic: sys_info: Replace struct sys_info_name with plain array of strings Andy Shevchenko
2025-10-31  3:06   ` Andrew Morton
2025-10-31  7:23     ` Andy Shevchenko
2025-10-30 11:44 ` [PATCH v3 4/6] panic: sys_info: Rewrite a fix for a compilation error (`make W=1`) Andy Shevchenko
2025-10-30 11:44 ` [PATCH v3 5/6] panic: sys_info: Deduplicate local variable 'table; assignments Andy Shevchenko
2025-10-30 11:44 ` [PATCH v3 6/6] panic: sys_info: Factor out read and write handlers Andy Shevchenko
2025-10-31  3:16   ` Andrew Morton
2025-10-31  7:22     ` Andy Shevchenko
2025-10-31  7:25       ` Andy Shevchenko
2025-10-30 14:07 ` [PATCH v3 0/6] panic: sys_info: Refactor and fix a potential issue Andy Shevchenko
2025-10-30 15:48   ` Petr Mladek
2025-10-31  7:56     ` Andy Shevchenko

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.