mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-07-05 21:35:46 +02:00
EDAC/sb_edac: Fix the compile warning of large frame size
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
This commit is contained in:
parent
7a33c144c2
commit
43247abd09
|
@ -29,6 +29,8 @@
|
||||||
|
|
||||||
/* Static vars */
|
/* Static vars */
|
||||||
static LIST_HEAD(sbridge_edac_list);
|
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
|
* 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 mem_ctl_info *new_mci;
|
||||||
struct sbridge_pvt *pvt = mci->pvt_info;
|
struct sbridge_pvt *pvt = mci->pvt_info;
|
||||||
enum hw_event_mc_err_type tp_event;
|
enum hw_event_mc_err_type tp_event;
|
||||||
char *optype, msg[256], msg_full[512];
|
|
||||||
bool ripv = GET_BITFIELD(m->mcgstatus, 0, 0);
|
bool ripv = GET_BITFIELD(m->mcgstatus, 0, 0);
|
||||||
bool overflow = GET_BITFIELD(m->status, 62, 62);
|
bool overflow = GET_BITFIELD(m->status, 62, 62);
|
||||||
bool uncorrected_error = GET_BITFIELD(m->status, 61, 61);
|
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.
|
* aligned address reported by patrol scrubber.
|
||||||
*/
|
*/
|
||||||
u32 lsb = GET_BITFIELD(m->misc, 0, 5);
|
u32 lsb = GET_BITFIELD(m->misc, 0, 5);
|
||||||
|
char *optype, *area_type = "DRAM";
|
||||||
long channel_mask, first_channel;
|
long channel_mask, first_channel;
|
||||||
u8 rank = 0xff, socket, ha;
|
u8 rank = 0xff, socket, ha;
|
||||||
int rc, dimm;
|
int rc, dimm;
|
||||||
char *area_type = "DRAM";
|
|
||||||
|
|
||||||
if (pvt->info.type != SANDY_BRIDGE)
|
if (pvt->info.type != SANDY_BRIDGE)
|
||||||
recoverable = true;
|
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 = knl_channel_remap(m->bank == 16, channel);
|
||||||
channel_mask = 1 << channel;
|
channel_mask = 1 << channel;
|
||||||
|
|
||||||
snprintf(msg, sizeof(msg),
|
snprintf(sb_msg, sizeof(sb_msg),
|
||||||
"%s%s err_code:%04x:%04x channel:%d (DIMM_%c)",
|
"%s%s err_code:%04x:%04x channel:%d (DIMM_%c)",
|
||||||
overflow ? " OVERFLOW" : "",
|
overflow ? " OVERFLOW" : "",
|
||||||
(uncorrected_error && recoverable)
|
(uncorrected_error && recoverable)
|
||||||
? " recoverable" : " ",
|
? " recoverable" : " ",
|
||||||
mscod, errcode, channel, A + channel);
|
mscod, errcode, channel, A + channel);
|
||||||
edac_mc_handle_error(tp_event, mci, core_err_cnt,
|
edac_mc_handle_error(tp_event, mci, core_err_cnt,
|
||||||
m->addr >> PAGE_SHIFT, m->addr & ~PAGE_MASK, 0,
|
m->addr >> PAGE_SHIFT, m->addr & ~PAGE_MASK, 0,
|
||||||
channel, 0, -1,
|
channel, 0, -1,
|
||||||
optype, msg);
|
optype, sb_msg);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
} else if (lsb < 12) {
|
} else if (lsb < 12) {
|
||||||
rc = get_memory_error_data(mci, m->addr, &socket, &ha,
|
rc = get_memory_error_data(mci, m->addr, &socket, &ha,
|
||||||
&channel_mask, &rank,
|
&channel_mask, &rank,
|
||||||
&area_type, msg);
|
&area_type, sb_msg);
|
||||||
} else {
|
} else {
|
||||||
rc = get_memory_error_data_from_mce(mci, m, &socket, &ha,
|
rc = get_memory_error_data_from_mce(mci, m, &socket, &ha,
|
||||||
&channel_mask, msg);
|
&channel_mask, sb_msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
goto err_parsing;
|
goto err_parsing;
|
||||||
new_mci = get_mci_for_node_id(socket, ha);
|
new_mci = get_mci_for_node_id(socket, ha);
|
||||||
if (!new_mci) {
|
if (!new_mci) {
|
||||||
strcpy(msg, "Error: socket got corrupted!");
|
strscpy(sb_msg, "Error: socket got corrupted!");
|
||||||
goto err_parsing;
|
goto err_parsing;
|
||||||
}
|
}
|
||||||
mci = new_mci;
|
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)
|
if (!pvt->is_lockstep && !pvt->is_cur_addr_mirrored && !pvt->is_close_pg)
|
||||||
channel = first_channel;
|
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",
|
"%s%s area:%s err_code:%04x:%04x socket:%d ha:%d channel_mask:%ld rank:%d %s",
|
||||||
overflow ? " OVERFLOW" : "",
|
overflow ? " OVERFLOW" : "",
|
||||||
(uncorrected_error && recoverable) ? " recoverable" : "",
|
(uncorrected_error && recoverable) ? " recoverable" : "",
|
||||||
|
@ -3226,9 +3227,9 @@ static void sbridge_mce_output_error(struct mem_ctl_info *mci,
|
||||||
mscod, errcode,
|
mscod, errcode,
|
||||||
socket, ha,
|
socket, ha,
|
||||||
channel_mask,
|
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 */
|
/* 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,
|
edac_mc_handle_error(tp_event, mci, core_err_cnt,
|
||||||
m->addr >> PAGE_SHIFT, m->addr & ~PAGE_MASK, 0,
|
m->addr >> PAGE_SHIFT, m->addr & ~PAGE_MASK, 0,
|
||||||
channel, dimm, -1,
|
channel, dimm, -1,
|
||||||
optype, msg_full);
|
optype, sb_msg_full);
|
||||||
return;
|
return;
|
||||||
err_parsing:
|
err_parsing:
|
||||||
edac_mc_handle_error(tp_event, mci, core_err_cnt, 0, 0, 0,
|
edac_mc_handle_error(tp_event, mci, core_err_cnt, 0, 0, 0,
|
||||||
-1, -1, -1,
|
-1, -1, -1,
|
||||||
msg, "");
|
sb_msg, "");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user