OSDN Git Service

x86/mm/cpa: Avoid static protection checks on unmap
authorThomas Gleixner <tglx@linutronix.de>
Mon, 17 Sep 2018 14:29:13 +0000 (16:29 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 27 Sep 2018 18:39:38 +0000 (20:39 +0200)
If the new pgprot has the PRESENT bit cleared, then conflicts vs. RW/NX are
completely irrelevant.

Before:

 1G pages checked:                    2
 1G pages sameprot:                   0
 1G pages preserved:                  0
 2M pages checked:                  540
 2M pages sameprot:                 466
 2M pages preserved:                 47
 4K pages checked:               800770
 4K pages set-checked:             7668

After:

 1G pages checked:                    2
 1G pages sameprot:                   0
 1G pages preserved:                  0
 2M pages checked:                  540
 2M pages sameprot:                 466
 2M pages preserved:                 47
 4K pages checked:               800709
 4K pages set-checked:             7668

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Dave Hansen <dave.hansen@intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Bin Yang <bin.yang@intel.com>
Cc: Mark Gross <mark.gross@intel.com>
Link: https://lkml.kernel.org/r/20180917143546.245849757@linutronix.de
arch/x86/mm/pageattr.c

index cdf52eb..8f9083e 100644 (file)
@@ -526,6 +526,13 @@ static inline pgprot_t static_protections(pgprot_t prot, unsigned long start,
        pgprotval_t forbidden, res;
        unsigned long end;
 
+       /*
+        * There is no point in checking RW/NX conflicts when the requested
+        * mapping is setting the page !PRESENT.
+        */
+       if (!(pgprot_val(prot) & _PAGE_PRESENT))
+               return prot;
+
        /* Operate on the virtual address */
        end = start + npg * PAGE_SIZE - 1;