Commit 301375e7 authored by Toshi Kani's avatar Toshi Kani Committed by Borislav Petkov

EDAC: Add owner check to the x86 platform drivers

Change x86 EDAC platform drivers to verify the module owner at the
beginning of their module init functions. This allows them to fail their
init immediately when ghes_edac is enabled. Similar change can be made
to other edac drivers if necessary.

Also, remove ".c" from module names of pnp2_edac, sb_edac, and skx_edac.
Signed-off-by: default avatarToshi Kani <toshi.kani@hpe.com>
Suggested-by: default avatarBorislav Petkov <bp@alien8.de>
Cc: Mauro Carvalho Chehab <mchehab@kernel.org>
Cc: Tony Luck <tony.luck@intel.com>
Cc: linux-edac <linux-edac@vger.kernel.org>
Link: http://lkml.kernel.org/r/20170823225447.15608-6-toshi.kani@hpe.comSigned-off-by: default avatarBorislav Petkov <bp@suse.de>
parent 3877c7d1
...@@ -3434,9 +3434,14 @@ MODULE_DEVICE_TABLE(x86cpu, amd64_cpuids); ...@@ -3434,9 +3434,14 @@ MODULE_DEVICE_TABLE(x86cpu, amd64_cpuids);
static int __init amd64_edac_init(void) static int __init amd64_edac_init(void)
{ {
const char *owner;
int err = -ENODEV; int err = -ENODEV;
int i; int i;
owner = edac_get_owner();
if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
return -EBUSY;
if (!x86_match_cpu(amd64_cpuids)) if (!x86_match_cpu(amd64_cpuids))
return -ENODEV; return -ENODEV;
......
...@@ -45,6 +45,8 @@ ...@@ -45,6 +45,8 @@
#include "edac_module.h" #include "edac_module.h"
#include "pnd2_edac.h" #include "pnd2_edac.h"
#define EDAC_MOD_STR "pnd2_edac"
#define APL_NUM_CHANNELS 4 #define APL_NUM_CHANNELS 4
#define DNV_NUM_CHANNELS 2 #define DNV_NUM_CHANNELS 2
#define DNV_MAX_DIMMS 2 /* Max DIMMs per channel */ #define DNV_MAX_DIMMS 2 /* Max DIMMs per channel */
...@@ -1355,7 +1357,7 @@ static int pnd2_register_mci(struct mem_ctl_info **ppmci) ...@@ -1355,7 +1357,7 @@ static int pnd2_register_mci(struct mem_ctl_info **ppmci)
pvt = mci->pvt_info; pvt = mci->pvt_info;
memset(pvt, 0, sizeof(*pvt)); memset(pvt, 0, sizeof(*pvt));
mci->mod_name = "pnd2_edac.c"; mci->mod_name = EDAC_MOD_STR;
mci->dev_name = ops->name; mci->dev_name = ops->name;
mci->ctl_name = "Pondicherry2"; mci->ctl_name = "Pondicherry2";
...@@ -1547,10 +1549,15 @@ MODULE_DEVICE_TABLE(x86cpu, pnd2_cpuids); ...@@ -1547,10 +1549,15 @@ MODULE_DEVICE_TABLE(x86cpu, pnd2_cpuids);
static int __init pnd2_init(void) static int __init pnd2_init(void)
{ {
const struct x86_cpu_id *id; const struct x86_cpu_id *id;
const char *owner;
int rc; int rc;
edac_dbg(2, "\n"); edac_dbg(2, "\n");
owner = edac_get_owner();
if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
return -EBUSY;
id = x86_match_cpu(pnd2_cpuids); id = x86_match_cpu(pnd2_cpuids);
if (!id) if (!id)
return -ENODEV; return -ENODEV;
......
...@@ -36,7 +36,7 @@ static LIST_HEAD(sbridge_edac_list); ...@@ -36,7 +36,7 @@ static LIST_HEAD(sbridge_edac_list);
* Alter this version for the module when modifications are made * Alter this version for the module when modifications are made
*/ */
#define SBRIDGE_REVISION " Ver: 1.1.2 " #define SBRIDGE_REVISION " Ver: 1.1.2 "
#define EDAC_MOD_STR "sbridge_edac" #define EDAC_MOD_STR "sb_edac"
/* /*
* Debug macros * Debug macros
...@@ -3155,7 +3155,7 @@ static int sbridge_register_mci(struct sbridge_dev *sbridge_dev, enum type type) ...@@ -3155,7 +3155,7 @@ static int sbridge_register_mci(struct sbridge_dev *sbridge_dev, enum type type)
MEM_FLAG_DDR4 : MEM_FLAG_DDR3; MEM_FLAG_DDR4 : MEM_FLAG_DDR3;
mci->edac_ctl_cap = EDAC_FLAG_NONE; mci->edac_ctl_cap = EDAC_FLAG_NONE;
mci->edac_cap = EDAC_FLAG_NONE; mci->edac_cap = EDAC_FLAG_NONE;
mci->mod_name = "sb_edac.c"; mci->mod_name = EDAC_MOD_STR;
mci->dev_name = pci_name(pdev); mci->dev_name = pci_name(pdev);
mci->ctl_page_to_phys = NULL; mci->ctl_page_to_phys = NULL;
...@@ -3407,10 +3407,15 @@ static void sbridge_remove(void) ...@@ -3407,10 +3407,15 @@ static void sbridge_remove(void)
static int __init sbridge_init(void) static int __init sbridge_init(void)
{ {
const struct x86_cpu_id *id; const struct x86_cpu_id *id;
const char *owner;
int rc; int rc;
edac_dbg(2, "\n"); edac_dbg(2, "\n");
owner = edac_get_owner();
if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
return -EBUSY;
id = x86_match_cpu(sbridge_cpuids); id = x86_match_cpu(sbridge_cpuids);
if (!id) if (!id)
return -ENODEV; return -ENODEV;
......
...@@ -31,6 +31,8 @@ ...@@ -31,6 +31,8 @@
#include "edac_module.h" #include "edac_module.h"
#define EDAC_MOD_STR "skx_edac"
/* /*
* Debug macros * Debug macros
*/ */
...@@ -473,7 +475,7 @@ static int skx_register_mci(struct skx_imc *imc) ...@@ -473,7 +475,7 @@ static int skx_register_mci(struct skx_imc *imc)
mci->mtype_cap = MEM_FLAG_DDR4; mci->mtype_cap = MEM_FLAG_DDR4;
mci->edac_ctl_cap = EDAC_FLAG_NONE; mci->edac_ctl_cap = EDAC_FLAG_NONE;
mci->edac_cap = EDAC_FLAG_NONE; mci->edac_cap = EDAC_FLAG_NONE;
mci->mod_name = "skx_edac.c"; mci->mod_name = EDAC_MOD_STR;
mci->dev_name = pci_name(imc->chan[0].cdev); mci->dev_name = pci_name(imc->chan[0].cdev);
mci->ctl_page_to_phys = NULL; mci->ctl_page_to_phys = NULL;
...@@ -1044,12 +1046,17 @@ static int __init skx_init(void) ...@@ -1044,12 +1046,17 @@ static int __init skx_init(void)
{ {
const struct x86_cpu_id *id; const struct x86_cpu_id *id;
const struct munit *m; const struct munit *m;
const char *owner;
int rc = 0, i; int rc = 0, i;
u8 mc = 0, src_id, node_id; u8 mc = 0, src_id, node_id;
struct skx_dev *d; struct skx_dev *d;
edac_dbg(2, "\n"); edac_dbg(2, "\n");
owner = edac_get_owner();
if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
return -EBUSY;
id = x86_match_cpu(skx_cpuids); id = x86_match_cpu(skx_cpuids);
if (!id) if (!id)
return -ENODEV; return -ENODEV;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment