mm/memory_hotplug: add pgprot_t to mhp_params
Quoted 24 lines · Logan Gunthorpe
devm_memremap_pages()is currently used by the PCI P2PDMA code to create struct page mappings for IO memory. At present, these mappings are created withPAGE_KERNELwhich implies setting the PAT bits to be WB. However, on x86, an mtrr register will typically override this and force the cache type to be UC-. In the case firmware doesn't set this register it is effectively WB and will typically result in a machine check exception when it's accessed.Other arches are not currently likely to function correctly seeing they don't have any MTRR registers to fall back on.
To solve this, provide a way to specify the pgprot value explicitly to
arch_add_memory().Of the arches that support
MEMORY_HOTPLUG:x86_64, and arm64 need a simple change to pass thepgprot_tdown to their respective functions which set up the page tables. Forx86_32, set the page tables explicitly using_set_memory_prot()(seeing they are already mapped). For ia64, s390 and sh, reject anything butPAGE_KERNELsettings -- this should be fine, for now, seeing these architectures don't supportZONE_DEVICE.A check in
__add_pages()is also added to ensure the pgprot parameter was set for all arches.
...
arch/sh/mm/init.c int arch_add_memory(int nid, u64 start, u64 size, · line 416
Quoted 10 lines
arch/sh/mm/init.c +2
-0@@ -412,6 +412,9 @@ int arch_add_memory(int nid, u64 start, u64 size,unsigned long nr_pages = size >>PAGE_SHIFT ;int ret; + if (WARN_ON_ONCE(params->pgprot.pgprot != PAGE_KERNEL.pgprot) +return -EINVAL ;
Compile test ?
Guenter