RISC-V: Acquire mmap lock before invoking walk_page_range
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>
This commit is contained in:
committed by
Palmer Dabbelt
parent
e0d17c842c
commit
0e2c09011d
@@ -151,6 +151,7 @@ int set_memory_nx(unsigned long addr, int numpages)
|
|||||||
|
|
||||||
int set_direct_map_invalid_noflush(struct page *page)
|
int set_direct_map_invalid_noflush(struct page *page)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
unsigned long start = (unsigned long)page_address(page);
|
unsigned long start = (unsigned long)page_address(page);
|
||||||
unsigned long end = start + PAGE_SIZE;
|
unsigned long end = start + PAGE_SIZE;
|
||||||
struct pageattr_masks masks = {
|
struct pageattr_masks masks = {
|
||||||
@@ -158,11 +159,16 @@ int set_direct_map_invalid_noflush(struct page *page)
|
|||||||
.clear_mask = __pgprot(_PAGE_PRESENT)
|
.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 set_direct_map_default_noflush(struct page *page)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
unsigned long start = (unsigned long)page_address(page);
|
unsigned long start = (unsigned long)page_address(page);
|
||||||
unsigned long end = start + PAGE_SIZE;
|
unsigned long end = start + PAGE_SIZE;
|
||||||
struct pageattr_masks masks = {
|
struct pageattr_masks masks = {
|
||||||
@@ -170,7 +176,11 @@ int set_direct_map_default_noflush(struct page *page)
|
|||||||
.clear_mask = __pgprot(0)
|
.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)
|
void __kernel_map_pages(struct page *page, int numpages, int enable)
|
||||||
|
|||||||
Reference in New Issue
Block a user