• Dan Williams's avatar
    x86/memory_failure: Introduce {set, clear}_mce_nospec() · 284ce401
    Dan Williams authored
    Currently memory_failure() returns zero if the error was handled. On
    that result mce_unmap_kpfn() is called to zap the page out of the kernel
    linear mapping to prevent speculative fetches of potentially poisoned
    memory. However, in the case of dax mapped devmap pages the page may be
    in active permanent use by the device driver, so it cannot be unmapped
    from the kernel.
    
    Instead of marking the page not present, marking the page UC should
    be sufficient for preventing poison from being pre-fetched into the
    cache. Convert mce_unmap_pfn() to set_mce_nospec() remapping the page as
    UC, to hide it from speculative accesses.
    
    Given that that persistent memory errors can be cleared by the driver,
    include a facility to restore the page to cacheable operation,
    clear_mce_nospec().
    
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: <linux-edac@vger.kernel.org>
    Cc: <x86@kernel.org>
    Acked-by: default avatarTony Luck <tony.luck@intel.com>
    Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
    Acked-by: default avatarIngo Molnar <mingo@redhat.com>
    Signed-off-by: default avatarDave Jiang <dave.jiang@intel.com>
    284ce401
mce.c 56.2 KB