diff options
Diffstat (limited to 'arch/powerpc/mm/fault.c')
| -rw-r--r-- | arch/powerpc/mm/fault.c | 11 | 
1 files changed, 8 insertions, 3 deletions
diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c index 2bef19cc1b98..af46aa88422b 100644 --- a/arch/powerpc/mm/fault.c +++ b/arch/powerpc/mm/fault.c @@ -271,11 +271,16 @@ static bool access_error(bool is_write, bool is_exec, struct vm_area_struct *vma  	}  	/* -	 * Check for a read fault.  This could be caused by a read on an -	 * inaccessible page (i.e. PROT_NONE), or a Radix MMU execute-only page. +	 * VM_READ, VM_WRITE and VM_EXEC all imply read permissions, as +	 * defined in protection_map[].  Read faults can only be caused by +	 * a PROT_NONE mapping, or with a PROT_EXEC-only mapping on Radix.  	 */ -	if (unlikely(!(vma->vm_flags & VM_READ))) +	if (unlikely(!vma_is_accessible(vma)))  		return true; + +	if (unlikely(radix_enabled() && ((vma->vm_flags & VM_ACCESS_FLAGS) == VM_EXEC))) +		return true; +  	/*  	 * We should ideally do the vma pkey access check here. But in the  	 * fault path, handle_mm_fault() also does the same check. To avoid  |