]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
EDAC/sb_edac: Fix the compile warning of large frame size
authorQiuxu Zhuo <qiuxu.zhuo@intel.com>
Thu, 29 Aug 2024 12:09:03 +0000 (20:09 +0800)
committerTony Luck <tony.luck@intel.com>
Tue, 3 Sep 2024 22:09:22 +0000 (15:09 -0700)
Compiling sb_edac driver with GCC 11.4.0 and the W=1 option reported
the following warning:

  drivers/edac/sb_edac.c: In function â€˜sbridge_mce_output_error’:
  drivers/edac/sb_edac.c:3249:1: warning: the frame size of 1032 bytes is larger than 1024 bytes [-Wframe-larger-than=]

As there is no concurrent invocation of sbridge_mce_output_error(),
fix this warning by moving the large-size variables 'msg' and 'msg_full'
from the stack to the pre-allocated data segment.

[Tony: Fix checkpatch warnings for code alignment & use of strcpy()]

Reported-by: Zhang Rui <rui.zhang@intel.com>
Tested-by: Zhang Rui <rui.zhang@intel.com>
Signed-off-by: Qiuxu Zhuo <qiuxu.zhuo@intel.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
Link: https://lore.kernel.org/all/20240829120903.84152-1-qiuxu.zhuo@intel.com
drivers/edac/sb_edac.c

index e5c05a8769471e1afcda7afa10fb9ab9a29a8cfb..d5f12219598a8de92c3d12d3c68c05eb25aac789 100644 (file)
@@ -29,6 +29,8 @@
 
 /* Static vars */
 static LIST_HEAD(sbridge_edac_list);
+static char sb_msg[256];
+static char sb_msg_full[512];
 
 /*
  * Alter this version for the module when modifications are made
@@ -3079,7 +3081,6 @@ static void sbridge_mce_output_error(struct mem_ctl_info *mci,
        struct mem_ctl_info *new_mci;
        struct sbridge_pvt *pvt = mci->pvt_info;
        enum hw_event_mc_err_type tp_event;
-       char *optype, msg[256], msg_full[512];
        bool ripv = GET_BITFIELD(m->mcgstatus, 0, 0);
        bool overflow = GET_BITFIELD(m->status, 62, 62);
        bool uncorrected_error = GET_BITFIELD(m->status, 61, 61);
@@ -3095,10 +3096,10 @@ static void sbridge_mce_output_error(struct mem_ctl_info *mci,
         * aligned address reported by patrol scrubber.
         */
        u32 lsb = GET_BITFIELD(m->misc, 0, 5);
+       char *optype, *area_type = "DRAM";
        long channel_mask, first_channel;
        u8  rank = 0xff, socket, ha;
        int rc, dimm;
-       char *area_type = "DRAM";
 
        if (pvt->info.type != SANDY_BRIDGE)
                recoverable = true;
@@ -3168,32 +3169,32 @@ static void sbridge_mce_output_error(struct mem_ctl_info *mci,
                        channel = knl_channel_remap(m->bank == 16, channel);
                        channel_mask = 1 << channel;
 
-                       snprintf(msg, sizeof(msg),
-                               "%s%s err_code:%04x:%04x channel:%d (DIMM_%c)",
-                               overflow ? " OVERFLOW" : "",
-                               (uncorrected_error && recoverable)
-                               ? " recoverable" : " ",
-                               mscod, errcode, channel, A + channel);
+                       snprintf(sb_msg, sizeof(sb_msg),
+                                "%s%s err_code:%04x:%04x channel:%d (DIMM_%c)",
+                                overflow ? " OVERFLOW" : "",
+                                (uncorrected_error && recoverable)
+                                ? " recoverable" : " ",
+                                mscod, errcode, channel, A + channel);
                        edac_mc_handle_error(tp_event, mci, core_err_cnt,
                                m->addr >> PAGE_SHIFT, m->addr & ~PAGE_MASK, 0,
                                channel, 0, -1,
-                               optype, msg);
+                               optype, sb_msg);
                }
                return;
        } else if (lsb < 12) {
                rc = get_memory_error_data(mci, m->addr, &socket, &ha,
                                           &channel_mask, &rank,
-                                          &area_type, msg);
+                                          &area_type, sb_msg);
        } else {
                rc = get_memory_error_data_from_mce(mci, m, &socket, &ha,
-                                                   &channel_mask, msg);
+                                                   &channel_mask, sb_msg);
        }
 
        if (rc < 0)
                goto err_parsing;
        new_mci = get_mci_for_node_id(socket, ha);
        if (!new_mci) {
-               strcpy(msg, "Error: socket got corrupted!");
+               strscpy(sb_msg, "Error: socket got corrupted!");
                goto err_parsing;
        }
        mci = new_mci;
@@ -3218,7 +3219,7 @@ static void sbridge_mce_output_error(struct mem_ctl_info *mci,
         */
        if (!pvt->is_lockstep && !pvt->is_cur_addr_mirrored && !pvt->is_close_pg)
                channel = first_channel;
-       snprintf(msg_full, sizeof(msg_full),
+       snprintf(sb_msg_full, sizeof(sb_msg_full),
                 "%s%s area:%s err_code:%04x:%04x socket:%d ha:%d channel_mask:%ld rank:%d %s",
                 overflow ? " OVERFLOW" : "",
                 (uncorrected_error && recoverable) ? " recoverable" : "",
@@ -3226,9 +3227,9 @@ static void sbridge_mce_output_error(struct mem_ctl_info *mci,
                 mscod, errcode,
                 socket, ha,
                 channel_mask,
-                rank, msg);
+                rank, sb_msg);
 
-       edac_dbg(0, "%s\n", msg_full);
+       edac_dbg(0, "%s\n", sb_msg_full);
 
        /* FIXME: need support for channel mask */
 
@@ -3239,12 +3240,12 @@ static void sbridge_mce_output_error(struct mem_ctl_info *mci,
        edac_mc_handle_error(tp_event, mci, core_err_cnt,
                             m->addr >> PAGE_SHIFT, m->addr & ~PAGE_MASK, 0,
                             channel, dimm, -1,
-                            optype, msg_full);
+                            optype, sb_msg_full);
        return;
 err_parsing:
        edac_mc_handle_error(tp_event, mci, core_err_cnt, 0, 0, 0,
                             -1, -1, -1,
-                            msg, "");
+                            sb_msg, "");
 
 }