diff options
author | Heiko Carstens <hca@linux.ibm.com> | 2020-09-07 17:20:05 +0200 |
---|---|---|
committer | Vasily Gorbik <gor@linux.ibm.com> | 2020-09-14 11:38:34 +0200 |
commit | da1694ad9e8d13484c8b4ecaabde0bd7b958442a (patch) | |
tree | bd504d95a0fa035b362274044c6a0f1441b593d0 /arch/s390/mm | |
parent | s390/mm,ptdump: hold memory hotplug lock while walking for kernel page table ... (diff) | |
download | linux-da1694ad9e8d13484c8b4ecaabde0bd7b958442a.tar.xz linux-da1694ad9e8d13484c8b4ecaabde0bd7b958442a.zip |
s390/mm,ptdump: hold cpa mutex while walking for kernel page table dump
This is currently only preventing that outdated information is
provided to user space. A concurrent split of huge/large pages does
modify the kernel page tables, however either the huge/large mapping
is reported or the split area is being walked.
This "fixes" also only a potential future bug, since split pages could
also be merged again if page permissions are the same for larger
memory areas.
Reviewed-by: Vasily Gorbik <gor@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
Diffstat (limited to 'arch/s390/mm')
-rw-r--r-- | arch/s390/mm/dump_pagetables.c | 3 | ||||
-rw-r--r-- | arch/s390/mm/pageattr.c | 2 |
2 files changed, 4 insertions, 1 deletions
diff --git a/arch/s390/mm/dump_pagetables.c b/arch/s390/mm/dump_pagetables.c index 3c5e4055a3d2..09c7179cb17d 100644 --- a/arch/s390/mm/dump_pagetables.c +++ b/arch/s390/mm/dump_pagetables.c @@ -1,4 +1,5 @@ // SPDX-License-Identifier: GPL-2.0 +#include <linux/set_memory.h> #include <linux/ptdump.h> #include <linux/seq_file.h> #include <linux/debugfs.h> @@ -130,7 +131,9 @@ static int ptdump_show(struct seq_file *m, void *v) }; get_online_mems(); + mutex_lock(&cpa_mutex); ptdump_walk_pgd(&st.ptdump, &init_mm, NULL); + mutex_unlock(&cpa_mutex); put_online_mems(); return 0; } diff --git a/arch/s390/mm/pageattr.c b/arch/s390/mm/pageattr.c index c5c52ec2b46f..ed8e5b3575d5 100644 --- a/arch/s390/mm/pageattr.c +++ b/arch/s390/mm/pageattr.c @@ -278,7 +278,7 @@ static int walk_p4d_level(pgd_t *pgd, unsigned long addr, unsigned long end, return rc; } -static DEFINE_MUTEX(cpa_mutex); +DEFINE_MUTEX(cpa_mutex); static int change_page_attr(unsigned long addr, unsigned long end, unsigned long flags) |