Skip to content
  • Jack Steiner's avatar
    cpusets: new round-robin rotor for SLAB allocations · 6adef3eb
    Jack Steiner authored
    
    
    We have observed several workloads running on multi-node systems where
    memory is assigned unevenly across the nodes in the system.  There are
    numerous reasons for this but one is the round-robin rotor in
    cpuset_mem_spread_node().
    
    For example, a simple test that writes a multi-page file will allocate
    pages on nodes 0 2 4 6 ...  Odd nodes are skipped.  (Sometimes it
    allocates on odd nodes & skips even nodes).
    
    An example is shown below.  The program "lfile" writes a file consisting
    of 10 pages.  The program then mmaps the file & uses get_mempolicy(...,
    MPOL_F_NODE) to determine the nodes where the file pages were allocated.
    The output is shown below:
    
    	# ./lfile
    	 allocated on nodes: 2 4 6 0 1 2 6 0 2
    
    There is a single rotor that is used for allocating both file pages & slab
    pages.  Writing the file allocates both a data page & a slab page
    (buffer_head).  This advances the RR rotor 2 nodes for each page
    allocated.
    
    A quick confirmation seems to confirm this is the cause of the uneven
    allocation:
    
    	# echo 0 >/dev/cpuset/memory_spread_slab
    	# ./lfile
    	 allocated on nodes: 6 7 8 9 0 1 2 3 4 5
    
    This patch introduces a second rotor that is used for slab allocations.
    
    Signed-off-by: default avatarJack Steiner <steiner@sgi.com>
    Acked-by: default avatarChristoph Lameter <cl@linux-foundation.org>
    Cc: Pekka Enberg <penberg@cs.helsinki.fi>
    Cc: Paul Menage <menage@google.com>
    Cc: Jack Steiner <steiner@sgi.com>
    Cc: Robin Holt <holt@sgi.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    6adef3eb