[PATCH v1] ACPI: APEI: EINJ: Allow injection on legacy persistent memory

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Legacy persistent memory, e.g. Device DAX configured like the following

  440000000-303fffffff : Persistent Memory (legacy)
      440000000-47fffffff : dax1.0
      480000000-4bfffffff : dax2.0
      4c0000000-4ffffffff : dax3.0
      500000000-53fffffff : dax4.0
      ...

can support recover from Machine Check Exception due to memory failure.
Therefore there is need to test it by injecting memory error
using EINJ to legacy persistent memory.

However, current EINJ only check if physical address falls into the
IORES_DESC_PERSISTENT_MEMORY_LEGACY region. So attempt to inject
error to "Persistent Memory (legacy)" fails with -EINVAL.

Allow EINJ to inject at physical address belongin to
IORES_DESC_PERSISTENT_MEMORY_LEGACY.

Tested on a machine configured with Device DAX:
  memmap=4G!12G nd_e820.pmem=12G,4G,mode=fsdax memmap=176G!17G
  nd_e820.pmem=17G,1G,mode=devdax,align=1G memmap=176G!209G
  nd_e820.pmem=209G,1G,mode=devdax,align=1G memmap=176G!401G
  nd_e820.pmem=401G,1G,mode=devdax,align=1G memmap=176G!593G
  nd_e820.pmem=593G,1G,mode=devdax,align=1G

Injected error at 0x35238d2000, within Device DAX region and
allocated to a userspace test process. EINJ driver now issue the
injection request to firmware, and firmware logs shows injection
at 0x35238d2000 succeeded. The userspace test process then
accessed 0x35238d2000, caused a MCE, and killed by SIGBUS.

Signed-off-by: Jiaqi Yan <jiaqiyan@xxxxxxxxxx>
---
 drivers/acpi/apei/einj-core.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/acpi/apei/einj-core.c b/drivers/acpi/apei/einj-core.c
index 2561b045acc7b..e746fa66f92ff 100644
--- a/drivers/acpi/apei/einj-core.c
+++ b/drivers/acpi/apei/einj-core.c
@@ -712,6 +712,8 @@ int einj_error_inject(u32 type, u32 flags, u64 param1, u64 param2, u64 param3,
 				!= REGION_INTERSECTS) &&
 	     (region_intersects(base_addr, size, IORESOURCE_MEM, IORES_DESC_PERSISTENT_MEMORY)
 				!= REGION_INTERSECTS) &&
+	     (region_intersects(base_addr, size, IORESOURCE_MEM, IORES_DESC_PERSISTENT_MEMORY_LEGACY)
+				!= REGION_INTERSECTS) &&
 	     (region_intersects(base_addr, size, IORESOURCE_MEM, IORES_DESC_SOFT_RESERVED)
 				!= REGION_INTERSECTS) &&
 	     !arch_is_platform_page(base_addr)))
-- 
2.51.0.268.g9569e192d0-goog





[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]
  Powered by Linux