]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
mm: rearrange vm_area_struct for fewer cache misses
authorRik van Riel <riel@surriel.com>
Fri, 9 Nov 2012 03:04:23 +0000 (14:04 +1100)
committerStephen Rothwell <sfr@canb.auug.org.au>
Wed, 14 Nov 2012 04:54:59 +0000 (15:54 +1100)
The kernel walks the VMA rbtree in various places, including the page
fault path.  However, the vm_rb node spanned two cache lines, on 64 bit
systems with 64 byte cache lines (most x86 systems).

Rearrange vm_area_struct a little, so all the information we need to do a
VMA tree walk is in the first cache line.

Signed-off-by: Michel Lespinasse <walken@google.com>
Signed-off-by: Rik van Riel <riel@redhat.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: Russell King <linux@arm.linux.org.uk>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Paul Mundt <lethal@linux-sh.org>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Chris Metcalf <cmetcalf@tilera.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
include/linux/mm_types.h

index 9d6ade5d4543a5438938008880a8e61216d0cdf5..a52c83730753ff9e636c45c711ed7ccf8b2ac59d 100644 (file)
@@ -226,7 +226,8 @@ struct vm_region {
  * library, the executable area etc).
  */
 struct vm_area_struct {
-       struct mm_struct * vm_mm;       /* The address space we belong to. */
+       /* The first cache line has the info for VMA tree walking. */
+
        unsigned long vm_start;         /* Our start address within vm_mm. */
        unsigned long vm_end;           /* The first byte after our end address
                                           within vm_mm. */
@@ -234,9 +235,6 @@ struct vm_area_struct {
        /* linked list of VM areas per task, sorted by address */
        struct vm_area_struct *vm_next, *vm_prev;
 
-       pgprot_t vm_page_prot;          /* Access permissions of this VMA. */
-       unsigned long vm_flags;         /* Flags, see mm.h. */
-
        struct rb_node vm_rb;
 
        /*
@@ -247,6 +245,12 @@ struct vm_area_struct {
         */
        unsigned long rb_subtree_gap;
 
+       /* Second cache line starts here. */
+
+       struct mm_struct * vm_mm;       /* The address space we belong to. */
+       pgprot_t vm_page_prot;          /* Access permissions of this VMA. */
+       unsigned long vm_flags;         /* Flags, see mm.h. */
+
        /*
         * For areas with an address space and backing store,
         * linkage into the address_space->i_mmap interval tree, or