Skip to content

Commit d85a143

Browse files
committed
xtensa: fix NOMMU build with lock_mm_and_find_vma() conversion
It turns out that xtensa has a really odd configuration situation: you can do a no-MMU config, but still have the page fault code enabled. Which doesn't sound all that sensible, but it turns out that xtensa can have protection faults even without the MMU, and we have this: config PFAULT bool "Handle protection faults" if EXPERT && !MMU default y help Handle protection faults. MMU configurations must enable it. noMMU configurations may disable it if used memory map never generates protection faults or faults are always fatal. If unsure, say Y. which completely violated my expectations of the page fault handling. End result: Guenter reports that the xtensa no-MMU builds all fail with arch/xtensa/mm/fault.c: In function ‘do_page_fault’: arch/xtensa/mm/fault.c:133:8: error: implicit declaration of function ‘lock_mm_and_find_vma’ because I never exposed the new lock_mm_and_find_vma() function for the no-MMU case. Doing so is simple enough, and fixes the problem. Reported-and-tested-by: Guenter Roeck <[email protected]> Fixes: a050ba1 ("mm/fault: convert remaining simple cases to lock_mm_and_find_vma()") Signed-off-by: Linus Torvalds <[email protected]>
1 parent b25f62c commit d85a143

File tree

2 files changed

+14
-2
lines changed

2 files changed

+14
-2
lines changed

include/linux/mm.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2323,6 +2323,9 @@ void pagecache_isize_extended(struct inode *inode, loff_t from, loff_t to);
23232323
void truncate_pagecache_range(struct inode *inode, loff_t offset, loff_t end);
23242324
int generic_error_remove_page(struct address_space *mapping, struct page *page);
23252325

2326+
struct vm_area_struct *lock_mm_and_find_vma(struct mm_struct *mm,
2327+
unsigned long address, struct pt_regs *regs);
2328+
23262329
#ifdef CONFIG_MMU
23272330
extern vm_fault_t handle_mm_fault(struct vm_area_struct *vma,
23282331
unsigned long address, unsigned int flags,
@@ -2334,8 +2337,6 @@ void unmap_mapping_pages(struct address_space *mapping,
23342337
pgoff_t start, pgoff_t nr, bool even_cows);
23352338
void unmap_mapping_range(struct address_space *mapping,
23362339
loff_t const holebegin, loff_t const holelen, int even_cows);
2337-
struct vm_area_struct *lock_mm_and_find_vma(struct mm_struct *mm,
2338-
unsigned long address, struct pt_regs *regs);
23392340
#else
23402341
static inline vm_fault_t handle_mm_fault(struct vm_area_struct *vma,
23412342
unsigned long address, unsigned int flags,

mm/nommu.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -630,6 +630,17 @@ struct vm_area_struct *find_vma(struct mm_struct *mm, unsigned long addr)
630630
}
631631
EXPORT_SYMBOL(find_vma);
632632

633+
/*
634+
* At least xtensa ends up having protection faults even with no
635+
* MMU.. No stack expansion, at least.
636+
*/
637+
struct vm_area_struct *lock_mm_and_find_vma(struct mm_struct *mm,
638+
unsigned long addr, struct pt_regs *regs)
639+
{
640+
mmap_read_lock(mm);
641+
return vma_lookup(mm, addr);
642+
}
643+
633644
/*
634645
* expand a stack to a given address
635646
* - not supported under NOMMU conditions

0 commit comments

Comments
 (0)