Messages in this thread Patch in this message | | | From | Hyeonggon Yoo <> | Subject | [PATCH] x86/mm/cpa: set PAGE_KERNEL in __set_pages_p() | Date | Fri, 6 May 2022 14:19:39 +0900 |
| |
__set_pages_np() not only clears _PAGE_PRESENT and _PAGE_RW, but also clears _PAGE_GLOBAL to avoid confusing _PAGE_GLOBAL as _PAGE_PROTNONE when the PTE is not present.
Common usage for __set_pages_p() is to call it after __set_pages_np(). Therefore calling __set_pages_p() after __set_pages_np() clears _PAGE_GLOBAL, making it unable to globally shared in TLB.
As they are called by set_direct_map_{invalid,default}_noflush(), pages in direct map cannot be globally shared in TLB after being used by vmalloc, secretmem, and hibernation.
So set PAGE_KERNEL isntead of __pgprot(_PAGE_PRESENT | _PAGE_RW) in __set_pages_p().
Signed-off-by: Hyeonggon Yoo <42.hyeyoo@gmail.com> --- arch/x86/mm/pat/set_memory.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/x86/mm/pat/set_memory.c b/arch/x86/mm/pat/set_memory.c index abf5ed76e4b7..fcb6147c4cd4 100644 --- a/arch/x86/mm/pat/set_memory.c +++ b/arch/x86/mm/pat/set_memory.c @@ -2177,7 +2177,7 @@ static int __set_pages_p(struct page *page, int numpages) struct cpa_data cpa = { .vaddr = &tempaddr, .pgd = NULL, .numpages = numpages, - .mask_set = __pgprot(_PAGE_PRESENT | _PAGE_RW), + .mask_set = PAGE_KERNEL, .mask_clr = __pgprot(0), .flags = 0}; -- 2.32.0
| |