Re: [PATCH] EDAC, {skx|i10nm}_edac: Fix randconfig build error

2019-03-22 Thread Borislav Petkov
On Thu, Mar 21, 2019 at 03:13:39PM -0700, Luck, Tony wrote:
> 
> From: Qiuxu Zhuo 
> 
> Kbuild failed on the kernel configurations below:

...

I've massaged this into the below and running randconfigs now:

---
From: Qiuxu Zhuo 
Date: Thu, 21 Mar 2019 15:13:39 -0700
Subject: [PATCH] EDAC, skx, i10nm: Make skx_common.c a pure library

The following Kconfig constellations fail randconfig builds:

  CONFIG_ACPI_NFIT=y
  CONFIG_EDAC_DEBUG=y
  CONFIG_EDAC_SKX=m
  CONFIG_EDAC_I10NM=y

or

  CONFIG_ACPI_NFIT=y
  CONFIG_EDAC_DEBUG=y
  CONFIG_EDAC_SKX=y
  CONFIG_EDAC_I10NM=m

with:
  ...
  CC [M]  drivers/edac/skx_common.o
  ...
  .../skx_common.o:.../skx_common.c:672: undefined reference to `__this_module'

That is because if one of the two drivers - skx_edac or i10nm_edac - is
built-in and the other one is a module, the shared file skx_common.c
gets linked into a module object by kbuild. Therefore, when linking that
same file into vmlinux, the '__this_module' symbol used in debugfs isn't
defined, leading to the above error.

Fix it by moving all debugfs code from skx_common.c to both skx_base.c
and i10nm_base.c respectively. Thus, skx_common.c doesn't refer to
'__this_module' symbol anymore.

Clarify its purpose at the top of the file for future reference, while
at it.

 [ bp: Make text more readable. ]

Fixes: d4dc89d069aa ("EDAC, i10nm: Add a driver for Intel 10nm server 
processors")
Reported-by: Arnd Bergmann 
Signed-off-by: Qiuxu Zhuo 
Signed-off-by: Tony Luck 
Signed-off-by: Borislav Petkov 
Cc: James Morse 
Cc: Mauro Carvalho Chehab 
Cc: linux-edac 
Link: https://lkml.kernel.org/r/20190321221339.GA32323@agluck-desk
---
 drivers/edac/i10nm_base.c | 52 +--
 drivers/edac/skx_base.c   | 50 +-
 drivers/edac/skx_common.c | 57 +++
 drivers/edac/skx_common.h |  8 --
 4 files changed, 109 insertions(+), 58 deletions(-)

diff --git a/drivers/edac/i10nm_base.c b/drivers/edac/i10nm_base.c
index c334fb7c63df..6f06aec4877c 100644
--- a/drivers/edac/i10nm_base.c
+++ b/drivers/edac/i10nm_base.c
@@ -181,6 +181,54 @@ static struct notifier_block i10nm_mce_dec = {
.priority   = MCE_PRIO_EDAC,
 };
 
+#ifdef CONFIG_EDAC_DEBUG
+/*
+ * Debug feature.
+ * Exercise the address decode logic by writing an address to
+ * /sys/kernel/debug/edac/i10nm_test/addr.
+ */
+static struct dentry *i10nm_test;
+
+static int debugfs_u64_set(void *data, u64 val)
+{
+   struct mce m;
+
+   pr_warn_once("Fake error to 0x%llx injected via debugfs\n", val);
+
+   memset(, 0, sizeof(m));
+   /* ADDRV + MemRd + Unknown channel */
+   m.status = MCI_STATUS_ADDRV + 0x90;
+   /* One corrected error */
+   m.status |= BIT_ULL(MCI_STATUS_CEC_SHIFT);
+   m.addr = val;
+   skx_mce_check_error(NULL, 0, );
+
+   return 0;
+}
+DEFINE_SIMPLE_ATTRIBUTE(fops_u64_wo, NULL, debugfs_u64_set, "%llu\n");
+
+static void setup_i10nm_debug(void)
+{
+   i10nm_test = edac_debugfs_create_dir("i10nm_test");
+   if (!i10nm_test)
+   return;
+
+   if (!edac_debugfs_create_file("addr", 0200, i10nm_test,
+ NULL, _u64_wo)) {
+   debugfs_remove(i10nm_test);
+   i10nm_test = NULL;
+   }
+}
+
+static void teardown_i10nm_debug(void)
+{
+   debugfs_remove_recursive(i10nm_test);
+}
+#else
+static inline void setup_i10nm_debug(void) {}
+static inline void teardown_i10nm_debug(void) {}
+#endif /*CONFIG_EDAC_DEBUG*/
+
 static int __init i10nm_init(void)
 {
u8 mc = 0, src_id = 0, node_id = 0;
@@ -249,7 +297,7 @@ static int __init i10nm_init(void)
 
opstate_init();
mce_register_decode_chain(_mce_dec);
-   setup_skx_debug("i10nm_test");
+   setup_i10nm_debug();
 
i10nm_printk(KERN_INFO, "%s\n", I10NM_REVISION);
 
@@ -262,7 +310,7 @@ static int __init i10nm_init(void)
 static void __exit i10nm_exit(void)
 {
edac_dbg(2, "\n");
-   teardown_skx_debug();
+   teardown_i10nm_debug();
mce_unregister_decode_chain(_mce_dec);
skx_adxl_put();
skx_remove();
diff --git a/drivers/edac/skx_base.c b/drivers/edac/skx_base.c
index adae4c848ca1..a5c8fa3a249a 100644
--- a/drivers/edac/skx_base.c
+++ b/drivers/edac/skx_base.c
@@ -540,6 +540,54 @@ static struct notifier_block skx_mce_dec = {
.priority   = MCE_PRIO_EDAC,
 };
 
+#ifdef CONFIG_EDAC_DEBUG
+/*
+ * Debug feature.
+ * Exercise the address decode logic by writing an address to
+ * /sys/kernel/debug/edac/skx_test/addr.
+ */
+static struct dentry *skx_test;
+
+static int debugfs_u64_set(void *data, u64 val)
+{
+   struct mce m;
+
+   pr_warn_once("Fake error to 0x%llx injected via debugfs\n", val);
+
+   memset(, 0, sizeof(m));
+   /* ADDRV + MemRd + Unknown channel */
+   m.status = MCI_STATUS_ADDRV + 0x90;
+   /* One corrected error */
+   m.status |= BIT_ULL(MCI_STATUS_CEC_SHIFT);
+   

Re: [PATCH] EDAC, {skx|i10nm}_edac: Fix randconfig build error

2019-03-22 Thread Arnd Bergmann
On Fri, Mar 22, 2019 at 6:55 PM Luck, Tony  wrote:
>
> On Fri, Mar 22, 2019 at 03:00:25PM +0100, Arnd Bergmann wrote:
> > Sorry, this was my mistake, my email was garbled. The patch was
> > correct though: the idea here is not to change the Kconfig symbols
> > but to change the Makefile to do the right thing even when Kconfig
> > is set wrong.
>
> Well this does seem like a "clever" way out of the randconfig
> problem.  New patch applies and when I set .config to have:
>
> CONFIG_EDAC_DEBUG=y
> CONFIG_EDAC_SKX=y
> CONFIG_EDAC_I10NM=m
> CONFIG_EDAC_SKX_COMMON=y
>
> I don't see any build errors.
>
> There are lots of "skx_" symbols in System.map
>
> But I'm not at all sure what happened to the I10NM driver.
>
> I don't see it mentioned in the output from "make".
>
> It didn't get built as a module (no ".ko" file for it).
>
> It doesn't seem to be built in (no ".o" in drivers/edac/built-in.a)
>
> So I added a #error line to the start of i10nm_edac.c and
> ran "make" again.  Nothing.

Oops, I guess my testing method was also insufficient,
I only checked that the bug was gone, not that it actually
worked.

> So, I don't think this is doing what you think it should
> do.  Even if it did, it would seem very confusing to a user
> that asked for "one module, one built-in" in Kconfig, but
> found both built-in.
>
> Boris: I'm voting for Qiuxu's most recent solution (moving
> all the EDAC_DEBUG bits out of skx_common.c).

Yes, that's probably best then. My patch was likely close to
another correct solution, but I've screwed it up twice now ;-)

 Arnd


Re: [PATCH] EDAC, {skx|i10nm}_edac: Fix randconfig build error

2019-03-22 Thread Luck, Tony
On Fri, Mar 22, 2019 at 03:00:25PM +0100, Arnd Bergmann wrote:
> Sorry, this was my mistake, my email was garbled. The patch was
> correct though: the idea here is not to change the Kconfig symbols
> but to change the Makefile to do the right thing even when Kconfig
> is set wrong.

Well this does seem like a "clever" way out of the randconfig
problem.  New patch applies and when I set .config to have:

CONFIG_EDAC_DEBUG=y
CONFIG_EDAC_SKX=y
CONFIG_EDAC_I10NM=m
CONFIG_EDAC_SKX_COMMON=y

I don't see any build errors.

There are lots of "skx_" symbols in System.map

But I'm not at all sure what happened to the I10NM driver.

I don't see it mentioned in the output from "make".

It didn't get built as a module (no ".ko" file for it).

It doesn't seem to be built in (no ".o" in drivers/edac/built-in.a)

So I added a #error line to the start of i10nm_edac.c and
ran "make" again.  Nothing.

So, I don't think this is doing what you think it should
do.  Even if it did, it would seem very confusing to a user
that asked for "one module, one built-in" in Kconfig, but
found both built-in.

Boris: I'm voting for Qiuxu's most recent solution (moving
all the EDAC_DEBUG bits out of skx_common.c).

-Tony


[PATCH] EDAC, {skx|i10nm}_edac: Fix randconfig build error

2019-03-22 Thread Arnd Bergmann
Configurations with CONFIG_EDAC_SKX and CONFIG_EDAC_I10NM
both enabled, but only one of them built-in and the other
being a loadable module fail to link because the common
file is built the wrong way:

skx_common.c:672: undefined reference to `__this_module'

This overrides the way the modules are built, building
both into the zImage file if that happens.

Signed-off-by: Arnd Bergmann 
---
 drivers/edac/Kconfig  | 9 +
 drivers/edac/Makefile | 8 ++--
 2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/drivers/edac/Kconfig b/drivers/edac/Kconfig
index 47eb4d13ed5f..70080926329f 100644
--- a/drivers/edac/Kconfig
+++ b/drivers/edac/Kconfig
@@ -235,6 +235,7 @@ config EDAC_SKX
depends on ACPI_NFIT || !ACPI_NFIT # if ACPI_NFIT=m, EDAC_SKX can't be y
select DMI
select ACPI_ADXL
+   select EDAC_SKX_COMMON
help
  Support for error detection and correction the Intel
  Skylake server Integrated Memory Controllers. If your
@@ -247,12 +248,20 @@ config EDAC_I10NM
depends on ACPI_NFIT || !ACPI_NFIT # if ACPI_NFIT=m, EDAC_I10NM can't 
be y
select DMI
select ACPI_ADXL
+   select EDAC_SKX_COMMON
help
  Support for error detection and correction the Intel
  10nm server Integrated Memory Controllers. If your
  system has non-volatile DIMMs you should also manually
  select CONFIG_ACPI_NFIT.
 
+config EDAC_SKX_COMMON
+   tristate
+   help
+ This is an internal helper symbol to ensure that all variants
+ of the EDAC_SKX driver are either built-in or modular, as mixing
+ the two causes link time problems.
+
 config EDAC_PND2
tristate "Intel Pondicherry2"
depends on PCI && X86_64 && X86_MCE_INTEL
diff --git a/drivers/edac/Makefile b/drivers/edac/Makefile
index 89ad4a84a0f6..0f363309f662 100644
--- a/drivers/edac/Makefile
+++ b/drivers/edac/Makefile
@@ -58,10 +58,14 @@ layerscape_edac_mod-y   := 
fsl_ddr_edac.o layerscape_edac.o
 obj-$(CONFIG_EDAC_LAYERSCAPE)  += layerscape_edac_mod.o
 
 skx_edac-y := skx_common.o skx_base.o
-obj-$(CONFIG_EDAC_SKX) += skx_edac.o
+ifdef CONFIG_EDAC_SKX
+obj-$(CONFIG_EDAC_SKX_COMMON)  += skx_edac.o
+endif
 
 i10nm_edac-y   := skx_common.o i10nm_base.o
-obj-$(CONFIG_EDAC_I10NM)   += i10nm_edac.o
+ifdef CONFIG_EDAC_I10NM
+obj-$(CONFIG_EDAC_SKX_COMMON)) += i10nm_edac.o
+endif
 
 obj-$(CONFIG_EDAC_MV64X60) += mv64x60_edac.o
 obj-$(CONFIG_EDAC_CELL)+= cell_edac.o
-- 
2.20.0



Re: [PATCH] EDAC, {skx|i10nm}_edac: Fix randconfig build error

2019-03-22 Thread Arnd Bergmann
On Fri, Mar 15, 2019 at 10:28 PM Luck, Tony  wrote:
>
> > Basically I cheat Kconfig, so if one driver is built-in and
> > the other is a loadable module, we compile both as built-in.
>
> My mail client may have munged that path. Both "git am" and "patch -p1"
> barf when I try to apply it.  Since it was small I tried to replicate 
> manually,
> but I must have messed up something because Kconfig still seems content
> to let me have CONFIG_EDAC_SKX=y with CONFIG_EDAC_I10NM=m
>
> :-(

Sorry, this was my mistake, my email was garbled. The patch was
correct though: the idea here is not to change the Kconfig symbols
but to change the Makefile to do the right thing even when Kconfig
is set wrong.

  Arnd


[PATCH] EDAC, {skx|i10nm}_edac: Fix randconfig build error

2019-03-21 Thread Luck, Tony


From: Qiuxu Zhuo 

Kbuild failed on the kernel configurations below:

  CONFIG_ACPI_NFIT=y
  CONFIG_EDAC_DEBUG=y
  CONFIG_EDAC_SKX=m
  CONFIG_EDAC_I10NM=y
 or
  CONFIG_ACPI_NFIT=y
  CONFIG_EDAC_DEBUG=y
  CONFIG_EDAC_SKX=y
  CONFIG_EDAC_I10NM=m

Failed log:
  ...
  CC [M]  drivers/edac/skx_common.o
  ...
  .../skx_common.o:.../skx_common.c:672: undefined reference to `__this_module'

That is because if one of the two drivers {skx|i10nm}_edac is built-in
and the other one is built as a module, the shared file skx_common.c is
built to an object in module style by kbuild. Therefore, when linking for
vmlinux, the '__this_module' symbol used in debugfs isn't defined.

Fix it by moving all debugfs code from skx_common.c to {skx|i10nm}_base.c
respectively. Thus, skx_common.c is a module independent file which doesn't
refer to '__this_module' symbol anymore.

Fixes: d4dc89d069aa ("EDAC, i10nm: Add a driver for Intel 10nm server 
processors")
Reported-by: Arnd Bergmann 
Signed-off-by: Qiuxu Zhuo 
Signed-off-by: Tony Luck 
---

Arnd: I couldn't get your Kconfig trick (to disallow mixing module with
builtin) working.  Qiuxu made this better cleanup of the skx_common.c file that
moves out all of the debugfs bits, and adds a comment to the top of the
file warning future developers of the mixed mode issue.

 drivers/edac/i10nm_base.c | 52 +--
 drivers/edac/skx_base.c   | 50 -
 drivers/edac/skx_common.c | 51 +-
 drivers/edac/skx_common.h |  8 --
 4 files changed, 105 insertions(+), 56 deletions(-)

diff --git a/drivers/edac/i10nm_base.c b/drivers/edac/i10nm_base.c
index c334fb7c63df..6f06aec4877c 100644
--- a/drivers/edac/i10nm_base.c
+++ b/drivers/edac/i10nm_base.c
@@ -181,6 +181,54 @@ static struct notifier_block i10nm_mce_dec = {
.priority   = MCE_PRIO_EDAC,
 };
 
+#ifdef CONFIG_EDAC_DEBUG
+/*
+ * Debug feature.
+ * Exercise the address decode logic by writing an address to
+ * /sys/kernel/debug/edac/i10nm_test/addr.
+ */
+static struct dentry *i10nm_test;
+
+static int debugfs_u64_set(void *data, u64 val)
+{
+   struct mce m;
+
+   pr_warn_once("Fake error to 0x%llx injected via debugfs\n", val);
+
+   memset(, 0, sizeof(m));
+   /* ADDRV + MemRd + Unknown channel */
+   m.status = MCI_STATUS_ADDRV + 0x90;
+   /* One corrected error */
+   m.status |= BIT_ULL(MCI_STATUS_CEC_SHIFT);
+   m.addr = val;
+   skx_mce_check_error(NULL, 0, );
+
+   return 0;
+}
+DEFINE_SIMPLE_ATTRIBUTE(fops_u64_wo, NULL, debugfs_u64_set, "%llu\n");
+
+static void setup_i10nm_debug(void)
+{
+   i10nm_test = edac_debugfs_create_dir("i10nm_test");
+   if (!i10nm_test)
+   return;
+
+   if (!edac_debugfs_create_file("addr", 0200, i10nm_test,
+ NULL, _u64_wo)) {
+   debugfs_remove(i10nm_test);
+   i10nm_test = NULL;
+   }
+}
+
+static void teardown_i10nm_debug(void)
+{
+   debugfs_remove_recursive(i10nm_test);
+}
+#else
+static inline void setup_i10nm_debug(void) {}
+static inline void teardown_i10nm_debug(void) {}
+#endif /*CONFIG_EDAC_DEBUG*/
+
 static int __init i10nm_init(void)
 {
u8 mc = 0, src_id = 0, node_id = 0;
@@ -249,7 +297,7 @@ static int __init i10nm_init(void)
 
opstate_init();
mce_register_decode_chain(_mce_dec);
-   setup_skx_debug("i10nm_test");
+   setup_i10nm_debug();
 
i10nm_printk(KERN_INFO, "%s\n", I10NM_REVISION);
 
@@ -262,7 +310,7 @@ static int __init i10nm_init(void)
 static void __exit i10nm_exit(void)
 {
edac_dbg(2, "\n");
-   teardown_skx_debug();
+   teardown_i10nm_debug();
mce_unregister_decode_chain(_mce_dec);
skx_adxl_put();
skx_remove();
diff --git a/drivers/edac/skx_base.c b/drivers/edac/skx_base.c
index adae4c848ca1..a5c8fa3a249a 100644
--- a/drivers/edac/skx_base.c
+++ b/drivers/edac/skx_base.c
@@ -540,6 +540,54 @@ static struct notifier_block skx_mce_dec = {
.priority   = MCE_PRIO_EDAC,
 };
 
+#ifdef CONFIG_EDAC_DEBUG
+/*
+ * Debug feature.
+ * Exercise the address decode logic by writing an address to
+ * /sys/kernel/debug/edac/skx_test/addr.
+ */
+static struct dentry *skx_test;
+
+static int debugfs_u64_set(void *data, u64 val)
+{
+   struct mce m;
+
+   pr_warn_once("Fake error to 0x%llx injected via debugfs\n", val);
+
+   memset(, 0, sizeof(m));
+   /* ADDRV + MemRd + Unknown channel */
+   m.status = MCI_STATUS_ADDRV + 0x90;
+   /* One corrected error */
+   m.status |= BIT_ULL(MCI_STATUS_CEC_SHIFT);
+   m.addr = val;
+   skx_mce_check_error(NULL, 0, );
+
+   return 0;
+}
+DEFINE_SIMPLE_ATTRIBUTE(fops_u64_wo, NULL, debugfs_u64_set, "%llu\n");
+
+static void setup_skx_debug(void)
+{
+   skx_test = edac_debugfs_create_dir("skx_test");
+   if (!skx_test)
+   return;
+
+   if 

RE: [PATCH] EDAC, {skx|i10nm}_edac: Fix randconfig build error

2019-03-15 Thread Luck, Tony
> Basically I cheat Kconfig, so if one driver is built-in and
> the other is a loadable module, we compile both as built-in.

My mail client may have munged that path. Both "git am" and "patch -p1"
barf when I try to apply it.  Since it was small I tried to replicate manually,
but I must have messed up something because Kconfig still seems content
to let me have CONFIG_EDAC_SKX=y with CONFIG_EDAC_I10NM=m

:-(

-Tony


Re: [PATCH] EDAC, {skx|i10nm}_edac: Fix randconfig build error

2019-03-15 Thread Arnd Bergmann
On Fri, Mar 15, 2019 at 7:11 PM Luck, Tony  wrote:
>
> On Fri, Mar 15, 2019 at 07:02:06PM +0100, Borislav Petkov wrote:
> > On Fri, Mar 15, 2019 at 10:49:56AM -0700, Luck, Tony wrote:
> > > Yes - Qiuxu did that already ... patch reposted below.
> >
> > ... to which Arnd said that it were fragile because it might break if it
> > includes a THIS_MODULE reference. So I'd say we won't do that then. And
> > keep it strictly a library.
> >
> > Right?
>
> What is your definition of "library"?
>
> fsl_ddr_edac.c seems to have the same potential for breakage
> if someone makes a change to that, then it will hit the same
> problem.

I think they are a bit safer because CONFIG_EDAC_LAYERSCAPE and
CONFIG_EDAC_MPC85XX are mutually exclusive (one is only
on powerpc, the other is only on ARM). It would break though if
one were to make them build with CONFIG_COMPILE_TEST,
or if another driver gets added that for ARM.

I just thought about a possible Kconfig solution some more, and
had this idea:

diff --git a/drivers/edac/Kconfig b/drivers/edac/Kconfig
index 47eb4d13ed5f..70080926329f 100644
--- a/drivers/edac/Kconfig
+++ b/drivers/edac/Kconfig
@@ -235,6 +235,7 @@ config EDAC_SKX
depends on ACPI_NFIT || !ACPI_NFIT # if ACPI_NFIT=m, EDAC_SKX can't be y
select DMI
select ACPI_ADXL
+   select EDAC_SKX_COMMON
help
  Support for error detection and correction the Intel
  Skylake server Integrated Memory Controllers. If your
@@ -247,12 +248,20 @@ config EDAC_I10NM
depends on ACPI_NFIT || !ACPI_NFIT # if ACPI_NFIT=m,
EDAC_I10NM can't be y
select DMI
select ACPI_ADXL
+   select EDAC_SKX_COMMON
help
  Support for error detection and correction the Intel
  10nm server Integrated Memory Controllers. If your
  system has non-volatile DIMMs you should also manually
  select CONFIG_ACPI_NFIT.

+config EDAC_SKX_COMMON
+   tristate
+   help
+ This is an internal helper symbol to ensure that all variants
+ of the EDAC_SKX driver are either built-in or modular, as mixing
+ the two causes link time problems.
+
 config EDAC_PND2
tristate "Intel Pondicherry2"
depends on PCI && X86_64 && X86_MCE_INTEL
diff --git a/drivers/edac/Makefile b/drivers/edac/Makefile
index 89ad4a84a0f6..01134051f5bf 100644
--- a/drivers/edac/Makefile
+++ b/drivers/edac/Makefile
@@ -58,10 +58,14 @@ layerscape_edac_mod-y   :=
fsl_ddr_edac.o layerscape_edac.o
 obj-$(CONFIG_EDAC_LAYERSCAPE)  += layerscape_edac_mod.o

 skx_edac-y := skx_common.o skx_base.o
-obj-$(CONFIG_EDAC_SKX) += skx_edac.o
+ifdef CONFIG_EDAC_SKX
+obj-$(CONFIG_EDAC_SKX_COMMON)  += skx_edac.o
+endif

 i10nm_edac-y   := skx_common.o i10nm_base.o
+ifdef CONFIG_EDAC_I10NM
 obj-$(CONFIG_EDAC_SKX_COMMON)   += i10nm_edac.o
+endif

 obj-$(CONFIG_EDAC_MV64X60) += mv64x60_edac.o
 obj-$(CONFIG_EDAC_CELL)+= cell_edac.o

Basically I cheat Kconfig, so if one driver is built-in and
the other is a loadable module, we compile both as built-in.


Arnd


Re: [PATCH] EDAC, {skx|i10nm}_edac: Fix randconfig build error

2019-03-15 Thread Luck, Tony
On Fri, Mar 15, 2019 at 07:02:06PM +0100, Borislav Petkov wrote:
> On Fri, Mar 15, 2019 at 10:49:56AM -0700, Luck, Tony wrote:
> > Yes - Qiuxu did that already ... patch reposted below.
> 
> ... to which Arnd said that it were fragile because it might break if it
> includes a THIS_MODULE reference. So I'd say we won't do that then. And
> keep it strictly a library.
> 
> Right?

What is your definition of "library"?

fsl_ddr_edac.c seems to have the same potential for breakage
if someone makes a change to that, then it will hit the same
problem.

-Tony


Re: [PATCH] EDAC, {skx|i10nm}_edac: Fix randconfig build error

2019-03-15 Thread Borislav Petkov
On Fri, Mar 15, 2019 at 10:49:56AM -0700, Luck, Tony wrote:
> Yes - Qiuxu did that already ... patch reposted below.

... to which Arnd said that it were fragile because it might break if it
includes a THIS_MODULE reference. So I'd say we won't do that then. And
keep it strictly a library.

Right?

-- 
Regards/Gruss,
Boris.

Good mailing practices for 400: avoid top-posting and trim the reply.


Re: [PATCH] EDAC, {skx|i10nm}_edac: Fix randconfig build error

2019-03-15 Thread Luck, Tony
On Fri, Mar 15, 2019 at 06:37:20PM +0100, Borislav Petkov wrote:
> I think the shared code should not have any reference to modules because
> it is supposed to be a library. Can you move the THIS_MODULE out of the
> common file and into the actual module?


Yes - Qiuxu did that already ... patch reposted below.

-Tony


>From f9c656177e07fe5e978b09e5795a2a84a27bd54c Mon Sep 17 00:00:00 2001
From: Qiuxu Zhuo 
Date: Wed, 6 Mar 2019 09:59:14 +0800
Subject: [PATCH] EDAC, {skx|i10nm}_edac: Fix randconfig build error

Kbuild failed on the kernel configurations below:

  CONFIG_ACPI_NFIT=y
  CONFIG_EDAC_DEBUG=y
  CONFIG_EDAC_SKX=m
  CONFIG_EDAC_I10NM=y
 or
  CONFIG_ACPI_NFIT=y
  CONFIG_EDAC_DEBUG=y
  CONFIG_EDAC_SKX=y
  CONFIG_EDAC_I10NM=m

Failed log:
  ...
  CC [M]  drivers/edac/skx_common.o
  ...
  .../skx_common.o:.../skx_common.c:672: undefined reference to `__this_module'

That is because if one of the two drivers {skx|i10nm}_edac is built-in
and the other one is built as a module, the shared file skx_common.c is
always built to an object in module style by kbuild. Therefore, when
linking for vmlinux, the '__this_module' symbol isn't defined.

Fix it by moving the DEFINE_SIMPLE_ATTRIBUTE() from skx_common.c to
skx_base.c and i10nm_base.c, where the '__this_module' is always defined
whatever it's built-in or built as a module.

Test the patch with following configurations:

  CONFIG_ACPI_NFIT=y
  CONFIG_EDAC_DEBUG=[y|n]

  ++
  |  skx_edac  |  i10nm_edac  | Build  |
  ||--||
  | m  |  m   |   ok   |
  ||--||
  | m  |  y   |   ok   |
  ||--||
  | y  |  m   |   ok   |
  ||--||
  | y  |  y   |   ok   |
  ++

Fixes: d4dc89d069aa ("EDAC, i10nm: Add a driver for Intel 10nm server 
processors")
Reported-by: Arnd Bergmann 
Signed-off-by: Qiuxu Zhuo 
Signed-off-by: Tony Luck 
---
 drivers/edac/i10nm_base.c | 4 +++-
 drivers/edac/skx_base.c   | 4 +++-
 drivers/edac/skx_common.c | 7 +++
 drivers/edac/skx_common.h | 7 +--
 4 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/drivers/edac/i10nm_base.c b/drivers/edac/i10nm_base.c
index c334fb7c63df..57ae2c6d5958 100644
--- a/drivers/edac/i10nm_base.c
+++ b/drivers/edac/i10nm_base.c
@@ -181,6 +181,8 @@ static struct notifier_block i10nm_mce_dec = {
.priority   = MCE_PRIO_EDAC,
 };
 
+DEFINE_SIMPLE_ATTRIBUTE(fops_u64_wo, NULL, debugfs_u64_set, "%llu\n");
+
 static int __init i10nm_init(void)
 {
u8 mc = 0, src_id = 0, node_id = 0;
@@ -249,7 +251,7 @@ static int __init i10nm_init(void)
 
opstate_init();
mce_register_decode_chain(_mce_dec);
-   setup_skx_debug("i10nm_test");
+   setup_skx_debug("i10nm_test", _u64_wo);
 
i10nm_printk(KERN_INFO, "%s\n", I10NM_REVISION);
 
diff --git a/drivers/edac/skx_base.c b/drivers/edac/skx_base.c
index adae4c848ca1..1748f627ca6c 100644
--- a/drivers/edac/skx_base.c
+++ b/drivers/edac/skx_base.c
@@ -540,6 +540,8 @@ static struct notifier_block skx_mce_dec = {
.priority   = MCE_PRIO_EDAC,
 };
 
+DEFINE_SIMPLE_ATTRIBUTE(fops_u64_wo, NULL, debugfs_u64_set, "%llu\n");
+
 /*
  * skx_init:
  * make sure we are running on the correct cpu model
@@ -619,7 +621,7 @@ static int __init skx_init(void)
/* Ensure that the OPSTATE is set correctly for POLL or NMI */
opstate_init();
 
-   setup_skx_debug("skx_test");
+   setup_skx_debug("skx_test", _u64_wo);
 
mce_register_decode_chain(_mce_dec);
 
diff --git a/drivers/edac/skx_common.c b/drivers/edac/skx_common.c
index 0e96e7b5b0a7..f75af7ff5515 100644
--- a/drivers/edac/skx_common.c
+++ b/drivers/edac/skx_common.c
@@ -653,7 +653,7 @@ void skx_remove(void)
  */
 static struct dentry *skx_test;
 
-static int debugfs_u64_set(void *data, u64 val)
+int debugfs_u64_set(void *data, u64 val)
 {
struct mce m;
 
@@ -669,16 +669,15 @@ static int debugfs_u64_set(void *data, u64 val)
 
return 0;
 }
-DEFINE_SIMPLE_ATTRIBUTE(fops_u64_wo, NULL, debugfs_u64_set, "%llu\n");
 
-void setup_skx_debug(const char *dirname)
+void setup_skx_debug(const char *dirname, const struct file_operations *fops)
 {
skx_test = edac_debugfs_create_dir(dirname);
if (!skx_test)
return;
 
if (!edac_debugfs_create_file("addr", 0200, skx_test,
- NULL, _u64_wo)) {
+ NULL, fops)) {
debugfs_remove(skx_test);
skx_test = NULL;
}
diff --git a/drivers/edac/skx_common.h b/drivers/edac/skx_common.h
index d25374e34d4f..637867e0952c 100644
--- a/drivers/edac/skx_common.h
+++ b/drivers/edac/skx_common

Re: [PATCH] EDAC, {skx|i10nm}_edac: Fix randconfig build error

2019-03-15 Thread Borislav Petkov
On Fri, Mar 15, 2019 at 08:57:18AM -0700, Luck, Tony wrote:
> fsl_ddr_edac.c looks to be doing exactly what we are doing with
> skx_common.c. They just get away with it for now because they don't
> have a reference to THIS_MODULE since they don't set up anything
> in sysfs.
> 
> If this is your goal, then Qiuxu's patch that moves the problem
> piece out of skx_common.c does what you are asking for.

My goal is to not make it too complex and this way burden future
maintainability, without introducing the craziest randconfig build
fixes.

I think the shared code should not have any reference to modules because
it is supposed to be a library. Can you move the THIS_MODULE out of the
common file and into the actual module?

-- 
Regards/Gruss,
Boris.

Good mailing practices for 400: avoid top-posting and trim the reply.


Re: [PATCH] EDAC, {skx|i10nm}_edac: Fix randconfig build error

2019-03-15 Thread Luck, Tony
On Fri, Mar 15, 2019 at 10:43:42AM +0100, Borislav Petkov wrote:
> On Thu, Mar 14, 2019 at 02:59:52PM -0700, Luck, Tony wrote:
> > I made a patch based on option #3. Rough steps were:
> > 
> > $ cat skx_common.c >> skx_common.h
> 
> That doesn't look real clean to me. So we have fsl_ddr_edac.c which
> gets linked in in two drivers and I think you could librarize that
> skx_common.c the same way and have the function exports in the wrapper
> drivers skx_edac and i10nm_edac calling those "library" functions in
> skx_common.c. IMNSVHO.

fsl_ddr_edac.c looks to be doing exactly what we are doing with
skx_common.c. They just get away with it for now because they don't
have a reference to THIS_MODULE since they don't set up anything
in sysfs.

If this is your goal, then Qiuxu's patch that moves the problem
piece out of skx_common.c does what you are asking for.

-Tony


Re: [PATCH] EDAC, {skx|i10nm}_edac: Fix randconfig build error

2019-03-15 Thread Borislav Petkov
On Thu, Mar 14, 2019 at 02:59:52PM -0700, Luck, Tony wrote:
> I made a patch based on option #3. Rough steps were:
> 
> $ cat skx_common.c >> skx_common.h

That doesn't look real clean to me. So we have fsl_ddr_edac.c which
gets linked in in two drivers and I think you could librarize that
skx_common.c the same way and have the function exports in the wrapper
drivers skx_edac and i10nm_edac calling those "library" functions in
skx_common.c. IMNSVHO.

Thx.

-- 
Regards/Gruss,
Boris.

Good mailing practices for 400: avoid top-posting and trim the reply.


Re: [PATCH] EDAC, {skx|i10nm}_edac: Fix randconfig build error

2019-03-14 Thread Luck, Tony
On Thu, Mar 14, 2019 at 12:04:13PM +0100, Borislav Petkov wrote:
> On Thu, Mar 14, 2019 at 08:09:06AM +0100, Arnd Bergmann wrote:
> > > So where should we go. Proposed solutions are piling up:
> > >
> > > 1) Make skx_common a module
> > > [downside: have to EXPORT everything in it]
> > > 2) Move module-ish bits out of skx_common
> > > [downside: perhaps fragile]
> > > 3) #include skx_common.c into {skx,i10nm}_edac.c
> > > [downside: no patch yet, bigger code size]
> > 
> > Sorry to add on to the already long list, but one more idea after
> > looking at the two files:
> > 
> > 4) Have a single driver module, with the skx_common.c containing
> > the top-level module_init/module_exit functions that call into the
> > hardware specific versions.
> > 
> > This is the opposite of the usual recommendation (the driver
> > is already structured nicely otherwise), but it would be cheap
> > way out here.
> 
> This is what I think right now: if this is going to become such a pain,
> then we better keep those two drivers completely separate. Who cares if
> there's some code duplication?! Better that than some obscure randconfig
> build breakages and fixes introducing more ugliness. IOW, we should keep
> it simple.
> 
> Unless, Tony, you want to be able to make changes to the common code in
> one place and don't want to patch both. Then I'd librarize the common
> functionality, i.e., do something along the lines of 2).

There's a lot of common code. Patching the same thing in two
different files seems like make-work (and a recipe for things
to be forgotten/missed).

I made a patch based on option #3. Rough steps were:

$ cat skx_common.c >> skx_common.h
$ git rm skx_common.c
$ git mv skx_base.c skx_edac.c
$ git mv i10nm_base.c i10nm_edac.c
$ edit Makefile for changes of names
$ edit skx_common.h to add "static" everywhere
$ edit to fix the build issues

Not entirely happy with some of the bits in that last step.

Patch looks like this:


>From b9e9723c95b667d28d81ea53b35447e1ce8f3244 Mon Sep 17 00:00:00 2001
From: Tony Luck 
Date: Thu, 14 Mar 2019 10:45:34 -0700
Subject: [PATCH] fix corner cases for randconfig

---
 drivers/edac/Makefile   |   2 -
 drivers/edac/{i10nm_base.c => i10nm_edac.c} |   5 +
 drivers/edac/skx_common.c   | 691 
 drivers/edac/skx_common.h   | 685 ++-
 drivers/edac/{skx_base.c => skx_edac.c} |   9 +-
 5 files changed, 676 insertions(+), 716 deletions(-)
 rename drivers/edac/{i10nm_base.c => i10nm_edac.c} (98%)
 delete mode 100644 drivers/edac/skx_common.c
 rename drivers/edac/{skx_base.c => skx_edac.c} (98%)

diff --git a/drivers/edac/Makefile b/drivers/edac/Makefile
index 89ad4a84a0f6..5d8d88574d3c 100644
--- a/drivers/edac/Makefile
+++ b/drivers/edac/Makefile
@@ -57,10 +57,8 @@ obj-$(CONFIG_EDAC_MPC85XX)   += mpc85xx_edac_mod.o
 layerscape_edac_mod-y  := fsl_ddr_edac.o layerscape_edac.o
 obj-$(CONFIG_EDAC_LAYERSCAPE)  += layerscape_edac_mod.o
 
-skx_edac-y := skx_common.o skx_base.o
 obj-$(CONFIG_EDAC_SKX) += skx_edac.o
 
-i10nm_edac-y   := skx_common.o i10nm_base.o
 obj-$(CONFIG_EDAC_I10NM)   += i10nm_edac.o
 
 obj-$(CONFIG_EDAC_MV64X60) += mv64x60_edac.o
diff --git a/drivers/edac/i10nm_base.c b/drivers/edac/i10nm_edac.c
similarity index 98%
rename from drivers/edac/i10nm_base.c
rename to drivers/edac/i10nm_edac.c
index c334fb7c63df..45c6497f35c5 100644
--- a/drivers/edac/i10nm_base.c
+++ b/drivers/edac/i10nm_edac.c
@@ -10,6 +10,11 @@
 #include 
 #include 
 #include "edac_module.h"
+
+struct decoded_addr;
+typedef bool (*skx_decode_f)(struct decoded_addr *res);
+static skx_decode_f skx_decode;
+
 #include "skx_common.h"
 
 #define I10NM_REVISION "v0.0.3"
diff --git a/drivers/edac/skx_common.c b/drivers/edac/skx_common.c
deleted file mode 100644
index 0e96e7b5b0a7..
--- a/drivers/edac/skx_common.c
+++ /dev/null
@@ -1,691 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Common codes for both the skx_edac driver and Intel 10nm server EDAC driver.
- * Originally split out from the skx_edac driver.
- *
- * Copyright (c) 2018, Intel Corporation.
- */
-
-#include 
-#include 
-#include 
-#include 
-#include 
-#include "edac_module.h"
-#include "skx_common.h"
-
-static const char * const component_names[] = {
-   [INDEX_SOCKET]  = "ProcessorSocketId",
-   [INDEX_MEMCTRL] = "MemoryControllerId",
-   [INDEX_CHANNEL] = "ChannelId",
-   [INDEX_DIMM]= "DimmSlotId",
-};
-
-static int component_indices[ARRAY_SIZE(component_names)];
-static int adxl_component_count;
-static const char * const *adxl_component_names;
-static u64 *adxl_values;
-static char *adxl_msg;
-
-static char skx_msg[MSG_SIZE];
-static skx_decode_f skx_decode;
-static u64 skx_tolm, skx_tohm;
-static LIST_HEAD(dev_edac_list);
-
-int __init skx_adxl_get(void)
-{
-   

Re: [PATCH] EDAC, {skx|i10nm}_edac: Fix randconfig build error

2019-03-14 Thread Borislav Petkov
On Thu, Mar 14, 2019 at 08:09:06AM +0100, Arnd Bergmann wrote:
> > So where should we go. Proposed solutions are piling up:
> >
> > 1) Make skx_common a module
> > [downside: have to EXPORT everything in it]
> > 2) Move module-ish bits out of skx_common
> > [downside: perhaps fragile]
> > 3) #include skx_common.c into {skx,i10nm}_edac.c
> > [downside: no patch yet, bigger code size]
> 
> Sorry to add on to the already long list, but one more idea after
> looking at the two files:
> 
> 4) Have a single driver module, with the skx_common.c containing
> the top-level module_init/module_exit functions that call into the
> hardware specific versions.
> 
> This is the opposite of the usual recommendation (the driver
> is already structured nicely otherwise), but it would be cheap
> way out here.

This is what I think right now: if this is going to become such a pain,
then we better keep those two drivers completely separate. Who cares if
there's some code duplication?! Better that than some obscure randconfig
build breakages and fixes introducing more ugliness. IOW, we should keep
it simple.

Unless, Tony, you want to be able to make changes to the common code in
one place and don't want to patch both. Then I'd librarize the common
functionality, i.e., do something along the lines of 2).

But having two completely separate drivers is the most robust variant,
IMO.

-- 
Regards/Gruss,
Boris.

Good mailing practices for 400: avoid top-posting and trim the reply.


Re: [PATCH] EDAC, {skx|i10nm}_edac: Fix randconfig build error

2019-03-14 Thread Arnd Bergmann
On Thu, Mar 14, 2019 at 12:01 AM Luck, Tony  wrote:
>
> On Wed, Mar 06, 2019 at 09:15:13PM +0100, Arnd Bergmann wrote:
> > On Wed, Mar 6, 2019 at 6:58 PM Luck, Tony  wrote:
> > > From: Qiuxu Zhuo 
> > >
> > > This seems cleaner than adding all the EXPORTs to skx_common.c
> > > I also tried a build with the 0x8A152468-config.gz that Arnd
> > > supplied.
> >
> > It's still a bit fragile since you do something that kbuild doesn't
> > expect with having a file in both a module and built-in code
> > in some configurations. I'm fairly sure this version works today,
> > but it would break the next time that file gets changed to include
> > a reference to THIS_MODULE, or anything else that is different
> > between built-in and modular code.
> >
> > Another alternative would be to mark all symbols in this file
> > 'static' and then include skx_common.c from the other two files.
> > Of course that is also ugly and it increases the overall code size,
> > so I don't see a way to win this.
>
> Boris,
>
> So where should we go. Proposed solutions are piling up:
>
> 1) Make skx_common a module
> [downside: have to EXPORT everything in it]
> 2) Move module-ish bits out of skx_common
> [downside: perhaps fragile]
> 3) #include skx_common.c into {skx,i10nm}_edac.c
> [downside: no patch yet, bigger code size]

Sorry to add on to the already long list, but one more idea after
looking at the two files:

4) Have a single driver module, with the skx_common.c containing
the top-level module_init/module_exit functions that call into the
hardware specific versions.

This is the opposite of the usual recommendation (the driver
is already structured nicely otherwise), but it would be cheap
way out here.

  Arnd


Re: [PATCH] EDAC, {skx|i10nm}_edac: Fix randconfig build error

2019-03-13 Thread Luck, Tony
On Wed, Mar 06, 2019 at 09:15:13PM +0100, Arnd Bergmann wrote:
> On Wed, Mar 6, 2019 at 6:58 PM Luck, Tony  wrote:
> > From: Qiuxu Zhuo 
> >
> > This seems cleaner than adding all the EXPORTs to skx_common.c
> > I also tried a build with the 0x8A152468-config.gz that Arnd
> > supplied.
> 
> It's still a bit fragile since you do something that kbuild doesn't
> expect with having a file in both a module and built-in code
> in some configurations. I'm fairly sure this version works today,
> but it would break the next time that file gets changed to include
> a reference to THIS_MODULE, or anything else that is different
> between built-in and modular code.
> 
> Another alternative would be to mark all symbols in this file
> 'static' and then include skx_common.c from the other two files.
> Of course that is also ugly and it increases the overall code size,
> so I don't see a way to win this.

Boris,

So where should we go. Proposed solutions are piling up:

1) Make skx_common a module
[downside: have to EXPORT everything in it]
2) Move module-ish bits out of skx_common
[downside: perhaps fragile]
3) #include skx_common.c into {skx,i10nm}_edac.c
[downside: no patch yet, bigger code size]

-Tony


Re: [PATCH] EDAC, {skx|i10nm}_edac: Fix randconfig build error

2019-03-06 Thread Arnd Bergmann
On Wed, Mar 6, 2019 at 6:58 PM Luck, Tony  wrote:
> From: Qiuxu Zhuo 
>
> This seems cleaner than adding all the EXPORTs to skx_common.c
> I also tried a build with the 0x8A152468-config.gz that Arnd
> supplied.

It's still a bit fragile since you do something that kbuild doesn't
expect with having a file in both a module and built-in code
in some configurations. I'm fairly sure this version works today,
but it would break the next time that file gets changed to include
a reference to THIS_MODULE, or anything else that is different
between built-in and modular code.

Another alternative would be to mark all symbols in this file
'static' and then include skx_common.c from the other two files.
Of course that is also ugly and it increases the overall code size,
so I don't see a way to win this.

 Arnd


[PATCH] EDAC, {skx|i10nm}_edac: Fix randconfig build error

2019-03-06 Thread Luck, Tony
From: Qiuxu Zhuo 

Kbuild failed on the kernel configurations below:

  CONFIG_ACPI_NFIT=y
  CONFIG_EDAC_DEBUG=y
  CONFIG_EDAC_SKX=m
  CONFIG_EDAC_I10NM=y
 or
  CONFIG_ACPI_NFIT=y
  CONFIG_EDAC_DEBUG=y
  CONFIG_EDAC_SKX=y
  CONFIG_EDAC_I10NM=m

Failed log:
  ...
  CC [M]  drivers/edac/skx_common.o
  ...
  .../skx_common.o:.../skx_common.c:672: undefined reference to `__this_module'

That is because if one of the two drivers {skx|i10nm}_edac is built-in
and the other one is built as a module, the shared file skx_common.c is
always built to an object in module style by kbuild. Therefore, when
linking for vmlinux, the '__this_module' symbol isn't defined.

Fix it by moving the DEFINE_SIMPLE_ATTRIBUTE() from skx_common.c to
skx_base.c and i10nm_base.c, where the '__this_module' is always defined
whatever it's built-in or built as a module.

Test the patch with following configurations:

  CONFIG_ACPI_NFIT=y
  CONFIG_EDAC_DEBUG=[y|n]

  ++
  |  skx_edac  |  i10nm_edac  | Build  |
  ||--||
  | m  |  m   |   ok   |
  ||--||
  | m  |  y   |   ok   |
  ||--||
  | y  |  m   |   ok   |
  ||--||
  | y  |  y   |   ok   |
  ++

Fixes: d4dc89d069aa ("EDAC, i10nm: Add a driver for Intel 10nm server 
processors")
Reported-by: Arnd Bergmann 
Signed-off-by: Qiuxu Zhuo 
Signed-off-by: Tony Luck 
---

This seems cleaner than adding all the EXPORTs to skx_common.c
I also tried a build with the 0x8A152468-config.gz that Arnd
supplied.

 drivers/edac/i10nm_base.c | 4 +++-
 drivers/edac/skx_base.c   | 4 +++-
 drivers/edac/skx_common.c | 7 +++
 drivers/edac/skx_common.h | 7 +--
 4 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/drivers/edac/i10nm_base.c b/drivers/edac/i10nm_base.c
index c334fb7c63df..57ae2c6d5958 100644
--- a/drivers/edac/i10nm_base.c
+++ b/drivers/edac/i10nm_base.c
@@ -181,6 +181,8 @@ static struct notifier_block i10nm_mce_dec = {
.priority   = MCE_PRIO_EDAC,
 };
 
+DEFINE_SIMPLE_ATTRIBUTE(fops_u64_wo, NULL, debugfs_u64_set, "%llu\n");
+
 static int __init i10nm_init(void)
 {
u8 mc = 0, src_id = 0, node_id = 0;
@@ -249,7 +251,7 @@ static int __init i10nm_init(void)
 
opstate_init();
mce_register_decode_chain(_mce_dec);
-   setup_skx_debug("i10nm_test");
+   setup_skx_debug("i10nm_test", _u64_wo);
 
i10nm_printk(KERN_INFO, "%s\n", I10NM_REVISION);
 
diff --git a/drivers/edac/skx_base.c b/drivers/edac/skx_base.c
index adae4c848ca1..1748f627ca6c 100644
--- a/drivers/edac/skx_base.c
+++ b/drivers/edac/skx_base.c
@@ -540,6 +540,8 @@ static struct notifier_block skx_mce_dec = {
.priority   = MCE_PRIO_EDAC,
 };
 
+DEFINE_SIMPLE_ATTRIBUTE(fops_u64_wo, NULL, debugfs_u64_set, "%llu\n");
+
 /*
  * skx_init:
  * make sure we are running on the correct cpu model
@@ -619,7 +621,7 @@ static int __init skx_init(void)
/* Ensure that the OPSTATE is set correctly for POLL or NMI */
opstate_init();
 
-   setup_skx_debug("skx_test");
+   setup_skx_debug("skx_test", _u64_wo);
 
mce_register_decode_chain(_mce_dec);
 
diff --git a/drivers/edac/skx_common.c b/drivers/edac/skx_common.c
index 0e96e7b5b0a7..f75af7ff5515 100644
--- a/drivers/edac/skx_common.c
+++ b/drivers/edac/skx_common.c
@@ -653,7 +653,7 @@ void skx_remove(void)
  */
 static struct dentry *skx_test;
 
-static int debugfs_u64_set(void *data, u64 val)
+int debugfs_u64_set(void *data, u64 val)
 {
struct mce m;
 
@@ -669,16 +669,15 @@ static int debugfs_u64_set(void *data, u64 val)
 
return 0;
 }
-DEFINE_SIMPLE_ATTRIBUTE(fops_u64_wo, NULL, debugfs_u64_set, "%llu\n");
 
-void setup_skx_debug(const char *dirname)
+void setup_skx_debug(const char *dirname, const struct file_operations *fops)
 {
skx_test = edac_debugfs_create_dir(dirname);
if (!skx_test)
return;
 
if (!edac_debugfs_create_file("addr", 0200, skx_test,
- NULL, _u64_wo)) {
+ NULL, fops)) {
debugfs_remove(skx_test);
skx_test = NULL;
}
diff --git a/drivers/edac/skx_common.h b/drivers/edac/skx_common.h
index d25374e34d4f..637867e0952c 100644
--- a/drivers/edac/skx_common.h
+++ b/drivers/edac/skx_common.h
@@ -142,10 +142,13 @@ int skx_mce_check_error(struct notifier_block *nb, 
unsigned long val,
 void skx_remove(void);
 
 #ifdef CONFIG_EDAC_DEBUG
-void setup_skx_debug(const char *dirname);
+int debugfs_u64_set(void *data, u64 val);
+void setup_skx_debug(const char *dirname, const struct file_operations *fops);
 void teardown_skx_debug(void);
 #else
-static inline void setup_skx_debug(const char *dirname) {}
+static inline int debugfs_u64_set(void *data, u64 val) {