]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
panic: sys_info: rewrite a fix for a compilation error (`make W=1`)
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Thu, 30 Oct 2025 11:44:20 +0000 (12:44 +0100)
committerAndrew Morton <akpm@linux-foundation.org>
Thu, 20 Nov 2025 22:03:40 +0000 (14:03 -0800)
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.

Link: https://lkml.kernel.org/r/20251030132007.3742368-5-andriy.shevchenko@linux.intel.com
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Petr Mladek <pmladek@suse.com>
Cc: Feng Tang <feng.tang@linux.alibaba.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
lib/sys_info.c

index 29a63238b31d2b0781c7cec5dfc6d4d18abe8bdd..eb5c1226bfc81f2356ee102107467cd89b7f8b27 100644 (file)
@@ -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>
 
 #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);
        }
 }