powerpc/mm/keys: Update documentation and remove unnecessary check
authorAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Wed, 7 Mar 2018 13:36:45 +0000 (19:06 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 4 Apr 2018 05:23:09 +0000 (15:23 +1000)
Adds more code comments. We also remove an unnecessary pkey check
after we check for pkey error in this patch.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/mm/fault.c
arch/powerpc/mm/pkeys.c

index 866446cf2d9abd5ae1b0a5ebc1076e16feca3f4c..c01d627e687ae1952c297f4f7b1225a62fc8956c 100644 (file)
@@ -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,25 +523,16 @@ good_area:
 
 #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);
-               }
+               up_read(&mm->mmap_sem);
+               return bad_key_fault_exception(regs, address, pkey);
        }
 #endif /* CONFIG_PPC_MEM_KEYS */
 
index 328737b4d73c6cebe9c4f99aee19a97de1d56c30..0eafdf01edc7d4bdaf04a7c1021ab19a3b5e808d 100644 (file)
@@ -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));