mirror of
https://github.com/torvalds/linux.git
synced 2024-11-25 13:41:51 +00:00
x86/mm: Ensure forced page table splitting
There are a few kernel users like kfence that require 4k pages to work correctly and do not support large mappings. They use set_memory_4k() to break down those large mappings. That, in turn relies on cpa_data->force_split option to indicate to set_memory code that it should split page tables regardless of whether the need to be. But, a recent change added an optimization which would return early if a set_memory request came in that did not change permissions. It did not consult ->force_split and would mistakenly optimize away the splitting that set_memory_4k() needs. This broke kfence. Skip the same-permission optimization when ->force_split is set. Fixes: 127960a05548 ("x86/mm: Inhibit _PAGE_NX changes from cpa_process_alias()") Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com> Tested-by: Marco Elver <elver@google.com> Cc: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lore.kernel.org/all/CA+G9fYuFxZTxkeS35VTZMXwQvohu73W3xbZ5NtjebsVvH6hCuA@mail.gmail.com/
This commit is contained in:
parent
1cfaac2400
commit
3e844d842d
@ -1727,7 +1727,8 @@ static int __change_page_attr_set_clr(struct cpa_data *cpa, int primary)
|
||||
/*
|
||||
* No changes, easy!
|
||||
*/
|
||||
if (!(pgprot_val(cpa->mask_set) | pgprot_val(cpa->mask_clr)))
|
||||
if (!(pgprot_val(cpa->mask_set) | pgprot_val(cpa->mask_clr)) &&
|
||||
!cpa->force_split)
|
||||
return ret;
|
||||
|
||||
while (rempages) {
|
||||
|
Loading…
Reference in New Issue
Block a user