x86/mm: Reduce debug overhead of __virt_to_maddr()
authorAndrew Cooper <andrew.cooper3@citrix.com>
Wed, 16 Aug 2017 12:01:03 +0000 (13:01 +0100)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Thu, 17 Aug 2017 11:22:48 +0000 (12:22 +0100)
__virt_to_maddr() is used very frequently, but has a large footprint due to
its assertions and comparasons.

Rearange its logic to drop one assertion entirely, encoding its check in a
second assertion (with no additional branch, and the comparason performed with
a 32bit immediate rather than requiring a movabs).

Bloat-o-meter net report is:
  add/remove: 0/0 grow/shrink: 1/72 up/down: 3/-2169 (-2166)

along with a reduction of 32 assertion frames (895 down to 861)

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
xen/include/asm-x86/x86_64/page.h

index 947e52bd14dacc59ad80a0ddb2ebd9ed1e7f7968..a9ba6f0a563f34e362759dd01c123f2638f55013 100644 (file)
@@ -51,13 +51,16 @@ extern unsigned long xen_virt_end;
 
 static inline unsigned long __virt_to_maddr(unsigned long va)
 {
-    ASSERT(va >= XEN_VIRT_START);
     ASSERT(va < DIRECTMAP_VIRT_END);
     if ( va >= DIRECTMAP_VIRT_START )
         va -= DIRECTMAP_VIRT_START;
     else
     {
-        ASSERT(va < XEN_VIRT_END);
+        BUILD_BUG_ON(XEN_VIRT_END - XEN_VIRT_START != GB(1));
+        /* Signed, so ((long)XEN_VIRT_START >> 30) fits in an imm32. */
+        ASSERT(((long)va >> (PAGE_ORDER_1G + PAGE_SHIFT)) ==
+               ((long)XEN_VIRT_START >> (PAGE_ORDER_1G + PAGE_SHIFT)));
+
         va += xen_phys_start - XEN_VIRT_START;
     }
     return (va & ma_va_bottom_mask) |