On Tue, 2022-06-14 at 15:39 +0900, Hyeonggon Yoo wrote: > Currently CPA is not used for user mappings (only pgd of init_mm > or and efi_mm is used). For simplicity, always fail when user address > is passed. > > Note that efi_mm uses 1:1 mapping so its address should not be > considered as user address. > > Signed-off-by: Hyeonggon Yoo <42.hyeyoo@xxxxxxxxx> > --- > arch/x86/mm/pat/set_memory.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/arch/x86/mm/pat/set_memory.c > b/arch/x86/mm/pat/set_memory.c > index 1abd5438f126..67cf969fed0d 100644 > --- a/arch/x86/mm/pat/set_memory.c > +++ b/arch/x86/mm/pat/set_memory.c > @@ -20,6 +20,7 @@ > #include <linux/kernel.h> > #include <linux/cc_platform.h> > #include <linux/set_memory.h> > +#include <linux/efi.h> > > #include <asm/e820/api.h> > #include <asm/processor.h> > @@ -1514,6 +1515,11 @@ static int __change_page_attr(struct cpa_data > *cpa, int primary) I guess having it here instead of __change_page_attr_set_clr() will result in the direct map alias addresses getting checked as well. Since these are determined inside of CPA, I'm not sure if it's needed as much. > pte_t *kpte, old_pte; > > address = __cpa_addr(cpa, cpa->curpage); > + > + if (WARN((IS_ENABLED(CONFIG_EFI) ? cpa->pgd != efi_mm.pgd : > true) Could it be? (!IS_ENABLED(CONFIG_EFI) || cpa->pgd != efi_mm.pgd) > + && address <= TASK_SIZE_MAX, > + KERN_WARNING "CPA: Got a user address")) > + return -EINVAL; > repeat: > kpte = _lookup_address_cpa(cpa, address, &level); > if (!kpte)