+++ /dev/null
-From 0e2c09011d4de4161f615ff860a605a9186cf62a Mon Sep 17 00:00:00 2001
-From: Atish Patra <atish.patra@wdc.com>
-Date: Wed, 17 Jun 2020 13:37:32 -0700
-Subject: RISC-V: Acquire mmap lock before invoking walk_page_range
-
-From: Atish Patra <atish.patra@wdc.com>
-
-commit 0e2c09011d4de4161f615ff860a605a9186cf62a upstream.
-
-As per walk_page_range documentation, mmap lock should be acquired by the
-caller before invoking walk_page_range. mmap_assert_locked gets triggered
-without that. The details can be found here.
-
-http://lists.infradead.org/pipermail/linux-riscv/2020-June/010335.html
-
-Fixes: 395a21ff859c(riscv: add ARCH_HAS_SET_DIRECT_MAP support)
-Signed-off-by: Atish Patra <atish.patra@wdc.com>
-Reviewed-by: Michel Lespinasse <walken@google.com>
-Reviewed-by: Zong Li <zong.li@sifive.com>
-Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-
----
- arch/riscv/mm/pageattr.c | 14 ++++++++++++--
- 1 file changed, 12 insertions(+), 2 deletions(-)
-
---- a/arch/riscv/mm/pageattr.c
-+++ b/arch/riscv/mm/pageattr.c
-@@ -151,6 +151,7 @@ int set_memory_nx(unsigned long addr, in
-
- int set_direct_map_invalid_noflush(struct page *page)
- {
-+ int ret;
- unsigned long start = (unsigned long)page_address(page);
- unsigned long end = start + PAGE_SIZE;
- struct pageattr_masks masks = {
-@@ -158,11 +159,16 @@ int set_direct_map_invalid_noflush(struc
- .clear_mask = __pgprot(_PAGE_PRESENT)
- };
-
-- return walk_page_range(&init_mm, start, end, &pageattr_ops, &masks);
-+ mmap_read_lock(&init_mm);
-+ ret = walk_page_range(&init_mm, start, end, &pageattr_ops, &masks);
-+ mmap_read_unlock(&init_mm);
-+
-+ return ret;
- }
-
- int set_direct_map_default_noflush(struct page *page)
- {
-+ int ret;
- unsigned long start = (unsigned long)page_address(page);
- unsigned long end = start + PAGE_SIZE;
- struct pageattr_masks masks = {
-@@ -170,7 +176,11 @@ int set_direct_map_default_noflush(struc
- .clear_mask = __pgprot(0)
- };
-
-- return walk_page_range(&init_mm, start, end, &pageattr_ops, &masks);
-+ mmap_read_lock(&init_mm);
-+ ret = walk_page_range(&init_mm, start, end, &pageattr_ops, &masks);
-+ mmap_read_unlock(&init_mm);
-+
-+ return ret;
- }
-
- void __kernel_map_pages(struct page *page, int numpages, int enable)