Skip to content

Commit 391ac0a

Browse files
committed
EDAC/skx_common: Use driver decoder first
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2124913 Tested: sanity, by me commit fe32f36 Author: Qiuxu Zhuo <qiuxu.zhuo@intel.com> Date: Thu Sep 1 12:43:08 2022 -0700 EDAC/skx_common: Use driver decoder first The performance of driver decoder[1] is better than the performance of firmware decoder[2], especially on frequent correctable errors. So use the driver decoder first, fall back to firmware decoder if the driver decoder is unavailable. Also rename the function pointer skx_decode to driver_decode (better name to contrast with adxl_decode). [1] Decode errors by extracting error information from registers of memory controllers and/or MCA bank registers. [2] Decode errors by calling ACPI DSM methods. Co-developed-by: Youquan Song <youquan.song@intel.com> Signed-off-by: Youquan Song <youquan.song@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/20220901194310.115427-1-tony.luck@intel.com/ Signed-off-by: Aristeu Rozanski <arozansk@redhat.com>
1 parent 583301b commit 391ac0a

File tree

3 files changed

+17
-9
lines changed

3 files changed

+17
-9
lines changed

drivers/edac/skx_base.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -714,8 +714,13 @@ static int __init skx_init(void)
714714

715715
skx_set_decode(skx_decode, skx_show_retry_rd_err_log);
716716

717-
if (nvdimm_count && skx_adxl_get() == -ENODEV)
718-
skx_printk(KERN_NOTICE, "Only decoding DDR4 address!\n");
717+
if (nvdimm_count && skx_adxl_get() != -ENODEV) {
718+
skx_set_decode(NULL, skx_show_retry_rd_err_log);
719+
} else {
720+
if (nvdimm_count)
721+
skx_printk(KERN_NOTICE, "Only decoding DDR4 address!\n");
722+
skx_set_decode(skx_decode, skx_show_retry_rd_err_log);
723+
}
719724

720725
/* Ensure that the OPSTATE is set correctly for POLL or NMI */
721726
opstate_init();

drivers/edac/skx_common.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ static char *adxl_msg;
4040
static unsigned long adxl_nm_bitmap;
4141

4242
static char skx_msg[MSG_SIZE];
43-
static skx_decode_f skx_decode;
43+
static skx_decode_f driver_decode;
4444
static skx_show_retry_log_f skx_show_retry_rd_err_log;
4545
static u64 skx_tolm, skx_tohm;
4646
static LIST_HEAD(dev_edac_list);
@@ -173,6 +173,8 @@ static bool skx_adxl_decode(struct decoded_addr *res, bool error_in_1st_level_me
173173
break;
174174
}
175175

176+
res->decoded_by_adxl = true;
177+
176178
return true;
177179
}
178180

@@ -183,7 +185,7 @@ void skx_set_mem_cfg(bool mem_cfg_2lm)
183185

184186
void skx_set_decode(skx_decode_f decode, skx_show_retry_log_f show_retry_log)
185187
{
186-
skx_decode = decode;
188+
driver_decode = decode;
187189
skx_show_retry_rd_err_log = show_retry_log;
188190
}
189191

@@ -588,7 +590,7 @@ static void skx_mce_output_error(struct mem_ctl_info *mci,
588590
break;
589591
}
590592
}
591-
if (adxl_component_count) {
593+
if (res->decoded_by_adxl) {
592594
len = snprintf(skx_msg, MSG_SIZE, "%s%s err_code:0x%04x:0x%04x %s",
593595
overflow ? " OVERFLOW" : "",
594596
(uncorrected_error && recoverable) ? " recoverable" : "",
@@ -648,11 +650,11 @@ int skx_mce_check_error(struct notifier_block *nb, unsigned long val,
648650
memset(&res, 0, sizeof(res));
649651
res.addr = mce->addr;
650652

651-
if (adxl_component_count) {
652-
if (!skx_adxl_decode(&res, skx_error_in_1st_level_mem(mce)))
653+
/* Try driver decoder first */
654+
if (!(driver_decode && driver_decode(&res))) {
655+
/* Then try firmware decoder (ACPI DSM methods) */
656+
if (!(adxl_component_count && skx_adxl_decode(&res, skx_error_in_1st_level_mem(mce))))
653657
return NOTIFY_DONE;
654-
} else if (!skx_decode || !skx_decode(&res)) {
655-
return NOTIFY_DONE;
656658
}
657659

658660
mci = res.dev->imc[res.imc].mci;

drivers/edac/skx_common.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ struct decoded_addr {
136136
int column;
137137
int bank_address;
138138
int bank_group;
139+
bool decoded_by_adxl;
139140
};
140141

141142
struct res_config {

0 commit comments

Comments
 (0)