EDAC/Intel: Do not load EDAC driver when running as a guest
authorLuck, Tony <tony.luck@intel.com>
Tue, 15 Jun 2021 17:44:19 +0000 (10:44 -0700)
committerTony Luck <tony.luck@intel.com>
Fri, 18 Jun 2021 01:23:14 +0000 (18:23 -0700)
There's little to no point in loading an EDAC driver running in a guest:
1) The CPU model reported by CPUID may not represent actual h/w
2) The hypervisor likely does not pass in access to memory controller devices
3) Hypervisors generally do not pass corrected error details to guests

Add a check in each of the Intel EDAC drivers for X86_FEATURE_HYPERVISOR
and simply return -ENODEV in the init routine.

Acked-by: Borislav Petkov <bp@suse.de>
Signed-off-by: Tony Luck <tony.luck@intel.com>
Link: https://lore.kernel.org/r/20210615174419.GA1087688@agluck-desk2.amr.corp.intel.com
drivers/edac/i10nm_base.c
drivers/edac/pnd2_edac.c
drivers/edac/sb_edac.c
drivers/edac/skx_base.c

index fb7e72d3fd2cd5b39a50c3a92a916289cd545158..6ce0ed2ffaaf12ffb2e19911282e86c5f5365630 100644 (file)
@@ -414,6 +414,9 @@ static int __init i10nm_init(void)
        if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
                return -EBUSY;
 
+       if (cpu_feature_enabled(X86_FEATURE_HYPERVISOR))
+               return -ENODEV;
+
        id = x86_match_cpu(i10nm_cpuids);
        if (!id)
                return -ENODEV;
index 928f63a374c78cdc98d89ceefa5e543ce368351a..c94ca1f790c4371ee1fc1821c57a96f958b92a49 100644 (file)
@@ -1554,6 +1554,9 @@ static int __init pnd2_init(void)
        if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
                return -EBUSY;
 
+       if (cpu_feature_enabled(X86_FEATURE_HYPERVISOR))
+               return -ENODEV;
+
        id = x86_match_cpu(pnd2_cpuids);
        if (!id)
                return -ENODEV;
index 93daa4297f2e0596d9999613edf54c017491d86f..4c626fcd4dcbb5f43f1aa40749e9d561d8815116 100644 (file)
@@ -3510,6 +3510,9 @@ static int __init sbridge_init(void)
        if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
                return -EBUSY;
 
+       if (cpu_feature_enabled(X86_FEATURE_HYPERVISOR))
+               return -ENODEV;
+
        id = x86_match_cpu(sbridge_cpuids);
        if (!id)
                return -ENODEV;
index 6a4f0b27c65457267018b01d8f341d18e06c8a82..4dbd46575bfb47e6e2ff07aae2481307e415a852 100644 (file)
@@ -656,6 +656,9 @@ static int __init skx_init(void)
        if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
                return -EBUSY;
 
+       if (cpu_feature_enabled(X86_FEATURE_HYPERVISOR))
+               return -ENODEV;
+
        id = x86_match_cpu(skx_cpuids);
        if (!id)
                return -ENODEV;