Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f2ed480f authored by Aneesh Kumar K.V's avatar Aneesh Kumar K.V Committed by Michael Ellerman
Browse files

powerpc/mm/keys: Update documentation and remove unnecessary check



Adds more code comments. We also remove an unnecessary pkey check
after we check for pkey error in this patch.

Signed-off-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent b9ee31e1
Loading
Loading
Loading
Loading
+12 −16
Original line number Diff line number Diff line
@@ -297,7 +297,12 @@ static bool access_error(bool is_write, bool is_exec,

	if (unlikely(!(vma->vm_flags & (VM_READ | VM_EXEC | VM_WRITE))))
		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
	 * these multiple checks, we skip it here and handle access error due
	 * to pkeys later.
	 */
	return false;
}

@@ -518,26 +523,17 @@ static int __do_page_fault(struct pt_regs *regs, unsigned long address,

#ifdef CONFIG_PPC_MEM_KEYS
	/*
	 * if the HPTE is not hashed, hardware will not detect
	 * a key fault. Lets check if we failed because of a
	 * software detected key fault.
	 * we skipped checking for access error due to key earlier.
	 * Check that using handle_mm_fault error return.
	 */
	if (unlikely(fault & VM_FAULT_SIGSEGV) &&
		!arch_vma_access_permitted(vma, flags & FAULT_FLAG_WRITE,
			is_exec, 0)) {
		/*
		 * The PGD-PDT...PMD-PTE tree may not have been fully setup.
		 * Hence we cannot walk the tree to locate the PTE, to locate
		 * the key. Hence let's use vma_pkey() to get the key; instead
		 * of get_mm_addr_key().
		 */
		!arch_vma_access_permitted(vma, is_write, is_exec, 0)) {

		int pkey = vma_pkey(vma);

		if (likely(pkey)) {
		up_read(&mm->mmap_sem);
		return bad_key_fault_exception(regs, address, pkey);
	}
	}
#endif /* CONFIG_PPC_MEM_KEYS */

	major |= fault & VM_FAULT_MAJOR;
+4 −7
Original line number Diff line number Diff line
@@ -119,18 +119,15 @@ int pkey_initialize(void)
#else
	os_reserved = 0;
#endif
	initial_allocation_mask = ~0x0;
	pkey_amr_uamor_mask = ~0x0ul;
	pkey_iamr_mask = ~0x0ul;
	/*
	 * Bits are in LE format. NOTE: 1, 0 are reserved.
	 * key 0, 1 are reserved.
	 * key 0 is the default key, which allows read/write/execute.
	 * key 1 is recommended not to be used. PowerISA(3.0) page 1015,
	 * programming note.
	 */
	initial_allocation_mask = ~0x0;

	/* register mask is in BE format */
	pkey_amr_uamor_mask = ~0x0ul;
	pkey_iamr_mask = ~0x0ul;

	for (i = 2; i < (pkeys_total - os_reserved); i++) {
		initial_allocation_mask &= ~(0x1 << i);
		pkey_amr_uamor_mask &= ~(0x3ul << pkeyshift(i));