07 Oct, 2010

1 commit

  • This patch fixes the following build breakage when memory hotplug is enabled on
    UMA configurations:

    /home/test/linux-2.6/mm/slub.c: In function 'kmem_cache_init':
    /home/test/linux-2.6/mm/slub.c:3031:2: error: 'slab_memory_callback'
    undeclared (first use in this function)
    /home/test/linux-2.6/mm/slub.c:3031:2: note: each undeclared
    identifier is reported only once for each function it appears in
    make[2]: *** [mm/slub.o] Error 1
    make[1]: *** [mm] Error 2
    make: *** [sub-make] Error 2

    Reported-by: Zimny Lech
    Acked-by: Christoph Lameter
    Signed-off-by: Pekka Enberg

    Pekka Enberg
     

06 Oct, 2010

3 commits

  • There is a lot of #ifdef/#endifs that can be avoided if functions would be in different
    places. Move them around and reduce #ifdef.

    Signed-off-by: Christoph Lameter
    Signed-off-by: Pekka Enberg

    Christoph Lameter
     
  • Currently disabling CONFIG_SLUB_DEBUG also disabled SYSFS support meaning
    that the slabs cannot be tuned without DEBUG.

    Make SYSFS support independent of CONFIG_SLUB_DEBUG

    Signed-off-by: Christoph Lameter
    Signed-off-by: Pekka Enberg

    Christoph Lameter
     
  • This patch optimizes slab_free() debug check to use "c->node != NUMA_NO_NODE"
    instead of "c->node >= 0" because the former generates smaller code on x86-64:

    Before:

    4736: 48 39 70 08 cmp %rsi,0x8(%rax)
    473a: 75 26 jne 4762
    473c: 44 8b 48 10 mov 0x10(%rax),%r9d
    4740: 45 85 c9 test %r9d,%r9d
    4743: 78 1d js 4762

    After:

    4736: 48 39 70 08 cmp %rsi,0x8(%rax)
    473a: 75 23 jne 475f
    473c: 83 78 10 ff cmpl $0xffffffffffffffff,0x10(%rax)
    4740: 74 1d je 475f

    This patch also cleans up __slab_alloc() to use NUMA_NO_NODE instead of "-1"
    for enabling debugging for a per-CPU cache.

    Acked-by: Christoph Lameter
    Acked-by: David Rientjes
    Signed-off-by: Pekka Enberg

    Pekka Enberg
     

02 Oct, 2010

18 commits

  • Make kmalloc_cache_alloc_node_notrace(), kmalloc_large_node()
    and __kmalloc_node_track_caller() to be compiled only when
    CONFIG_NUMA is selected.

    Acked-by: David Rientjes
    Signed-off-by: Namhyung Kim
    Signed-off-by: Pekka Enberg

    Namhyung Kim
     
  • The unfreeze_slab() releases page's PG_locked bit but was missing
    proper annotation. The deactivate_slab() needs to be marked also
    since it calls unfreeze_slab() without grabbing the lock.

    Acked-by: David Rientjes
    Signed-off-by: Namhyung Kim
    Signed-off-by: Pekka Enberg

    Namhyung Kim
     
  • The bit-ops routines require its arg to be a pointer to unsigned long.
    This leads sparse to complain about different signedness as follows:

    mm/slub.c:2425:49: warning: incorrect type in argument 2 (different signedness)
    mm/slub.c:2425:49: expected unsigned long volatile *addr
    mm/slub.c:2425:49: got long *map

    Acked-by: Christoph Lameter
    Acked-by: David Rientjes
    Signed-off-by: Namhyung Kim
    Signed-off-by: Pekka Enberg

    Namhyung Kim
     
  • There are a couple of places where repeat the same statements when removing
    a page from the partial list. Consolidate that into __remove_partial().

    Acked-by: David Rientjes
    Signed-off-by: Christoph Lameter
    Signed-off-by: Pekka Enberg

    Christoph Lameter
     
  • Pass the actual values used for inactive and active redzoning to the
    functions that check the objects. Avoids a lot of the ? : things to
    lookup the values in the functions.

    Acked-by: David Rientjes
    Signed-off-by: Christoph Lameter
    Signed-off-by: Pekka Enberg

    Christoph Lameter
     
  • Reduce the #ifdefs and simplify bootstrap by making SMP and NUMA as much alike
    as possible. This means that there will be an additional indirection to get to
    the kmem_cache_node field under SMP.

    Acked-by: David Rientjes
    Signed-off-by: Christoph Lameter
    Signed-off-by: Pekka Enberg

    Christoph Lameter
     
  • This reverts commit 5249d039500f05a5ab379286b1d23ab9b04d3f2c. It's not needed
    after commit bbddff0545878a8649c091a9dd7c43ce91516734 ("percpu: use percpu
    allocator on UP too").

    Pekka Enberg
     
  • As explained by Linus "I'm Proud to be an American" Torvalds:

    Looking at the merging code, I actually think it's totally
    buggy. If you have something like this:

    - load module A: create slab cache A

    - load module B: create slab cache B that can merge with A

    - unload module A

    - "cat /proc/slabinfo": BOOM. Oops.

    exactly because the name is not handled correctly, and you'll have
    module B holding open a slab cache that has a name pointer that points
    to module A that no longer exists.

    This patch fixes the problem by using kstrdup() to allocate dynamic memory for
    ->name of "struct kmem_cache" as suggested by Christoph Lameter.

    Acked-by: Christoph Lameter
    Cc: David Rientjes
    Reported-by: Linus Torvalds
    Signed-off-by: Pekka Enberg

    Conflicts:

    mm/slub.c

    Pekka Enberg
     
  • Since the percpu allocator does not provide early allocation in UP mode (only
    in SMP configurations) use __get_free_page() to improvise a compound page
    allocation that can be later freed via kfree().

    Compound pages will be released when the cpu caches are resized.

    Acked-by: David Rientjes
    Signed-off-by: Christoph Lameter
    Signed-off-by: Pekka Enberg

    Christoph Lameter
     
  • Now that the kmalloc_caches array is dynamically allocated at boot,
    SLUB_RESILIENCY_TEST needs to be fixed to pass the correct type.

    Acked-by: Christoph Lameter
    Signed-off-by: David Rientjes
    Signed-off-by: Pekka Enberg

    David Rientjes
     
  • Memory hotplug allocates and frees per node structures. Use the correct name.

    Acked-by: David Rientjes
    Acked-by: Randy Dunlap
    Signed-off-by: Christoph Lameter
    Signed-off-by: Pekka Enberg

    Christoph Lameter
     
  • On Wed, 25 Aug 2010, Randy Dunlap wrote:
    > mm/slub.c:1732: error: implicit declaration of function 'slab_pre_alloc_hook'
    > mm/slub.c:1751: error: implicit declaration of function 'slab_post_alloc_hook'
    > mm/slub.c:1881: error: implicit declaration of function 'slab_free_hook'
    > mm/slub.c:1886: error: implicit declaration of function 'slab_free_hook_irq'

    Empty functions are missing if the runtime debuggability option is compiled
    out.

    Provide the fall back functions to empty hooks if SLUB_DEBUG is not set.

    Acked-by: Randy Dunlap
    Acked-by: David Rientjes
    Signed-off-by: Christoph Lameter
    Signed-off-by: Pekka Enberg

    Christoph Lameter
     
  • Move the gfpflags masking into the hooks for checkers and into the slowpaths.
    gfpflag masking requires access to a global variable and thus adds an
    additional cacheline reference to the hotpaths.

    If no hooks are active then the gfpflag masking will result in
    code that the compiler can toss out.

    Acked-by: David Rientjes
    Signed-off-by: Christoph Lameter
    Signed-off-by: Pekka Enberg

    Christoph Lameter
     
  • Extract the code that memory checkers and other verification tools use from
    the hotpaths. Makes it easier to add new ones and reduces the disturbances
    of the hotpaths.

    Signed-off-by: Christoph Lameter
    Signed-off-by: Pekka Enberg

    Christoph Lameter
     
  • kmalloc caches are statically defined and may take up a lot of space just
    because the sizes of the node array has to be dimensioned for the largest
    node count supported.

    This patch makes the size of the kmem_cache structure dynamic throughout by
    creating a kmem_cache slab cache for the kmem_cache objects. The bootstrap
    occurs by allocating the initial one or two kmem_cache objects from the
    page allocator.

    C2->C3
    - Fix various issues indicated by David
    - Make create kmalloc_cache return a kmem_cache * pointer.

    Acked-by: David Rientjes
    Signed-off-by: Christoph Lameter
    Signed-off-by: Pekka Enberg

    Christoph Lameter
     
  • The percpu allocator can now handle allocations during early boot.
    So drop the static kmem_cache_cpu array.

    Cc: Tejun Heo
    Acked-by: David Rientjes
    Signed-off-by: Christoph Lameter
    Signed-off-by: Pekka Enberg

    Christoph Lameter
     
  • Remove the dynamic dma slab allocation since this causes too many issues with
    nested locks etc etc. The change avoids passing gfpflags into many functions.

    V3->V4:
    - Create dma caches in kmem_cache_init() instead of kmem_cache_init_late().

    Acked-by: David Rientjes
    Signed-off-by: Christoph Lameter
    Signed-off-by: Pekka Enberg

    Christoph Lameter
     
  • Compiler folds the debgging functions into the critical paths.
    Avoid that by adding noinline to the functions that check for
    problems.

    Acked-by: David Rientjes
    Signed-off-by: Christoph Lameter
    Signed-off-by: Pekka Enberg

    Christoph Lameter
     

07 Aug, 2010

1 commit

  • * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/penberg/slab-2.6:
    slub: Allow removal of slab caches during boot
    Revert "slub: Allow removal of slab caches during boot"
    slub numa: Fix rare allocation from unexpected node
    slab: use deferable timers for its periodic housekeeping
    slub: Use kmem_cache flags to detect if slab is in debugging mode.
    slub: Allow removal of slab caches during boot
    slub: Check kasprintf results in kmem_cache_init()
    SLUB: Constants need UL
    slub: Use a constant for a unspecified node.
    SLOB: Free objects to their own list
    slab: fix caller tracking on !CONFIG_DEBUG_SLAB && CONFIG_TRACING

    Linus Torvalds
     

05 Aug, 2010

1 commit


03 Aug, 2010

2 commits


29 Jul, 2010

1 commit

  • The network developers have seen sporadic allocations resulting in objects
    coming from unexpected NUMA nodes despite asking for objects from a
    specific node.

    This is due to get_partial() calling get_any_partial() if partial
    slabs are exhausted for a node even if a node was specified and therefore
    one would expect allocations only from the specified node.

    get_any_partial() sporadically may return a slab from a foreign
    node to gradually reduce the size of partial lists on remote nodes
    and thereby reduce total memory use for a slab cache.

    The behavior is controlled by the remote_defrag_ratio of each cache.

    Strictly speaking this is permitted behavior since __GFP_THISNODE was
    not specified for the allocation but it is certain surprising.

    This patch makes sure that the remote defrag behavior only occurs
    if no node was specified.

    Signed-off-by: Christoph Lameter
    Signed-off-by: Pekka Enberg

    Christoph Lameter
     

16 Jul, 2010

5 commits


10 Jun, 2010

1 commit


09 Jun, 2010

1 commit

  • We have been resisting new ftrace plugins and removing existing
    ones, and kmemtrace has been superseded by kmem trace events
    and perf-kmem, so we remove it.

    Signed-off-by: Li Zefan
    Acked-by: Pekka Enberg
    Acked-by: Eduard - Gabriel Munteanu
    Cc: Ingo Molnar
    Cc: Steven Rostedt
    [ remove kmemtrace from the makefile, handle slob too ]
    Signed-off-by: Frederic Weisbecker

    Li Zefan
     

31 May, 2010

1 commit


25 May, 2010

2 commits

  • Before applying this patch, cpuset updates task->mems_allowed and
    mempolicy by setting all new bits in the nodemask first, and clearing all
    old unallowed bits later. But in the way, the allocator may find that
    there is no node to alloc memory.

    The reason is that cpuset rebinds the task's mempolicy, it cleans the
    nodes which the allocater can alloc pages on, for example:

    (mpol: mempolicy)
    task1 task1's mpol task2
    alloc page 1
    alloc on node0? NO 1
    1 change mems from 1 to 0
    1 rebind task1's mpol
    0-1 set new bits
    0 clear disallowed bits
    alloc on node1? NO 0
    ...
    can't alloc page
    goto oom

    This patch fixes this problem by expanding the nodes range first(set newly
    allowed bits) and shrink it lazily(clear newly disallowed bits). So we
    use a variable to tell the write-side task that read-side task is reading
    nodemask, and the write-side task clears newly disallowed nodes after
    read-side task ends the current memory allocation.

    [akpm@linux-foundation.org: fix spello]
    Signed-off-by: Miao Xie
    Cc: David Rientjes
    Cc: Nick Piggin
    Cc: Paul Menage
    Cc: Lee Schermerhorn
    Cc: Hugh Dickins
    Cc: Ravikiran Thirumalai
    Cc: KOSAKI Motohiro
    Cc: Christoph Lameter
    Cc: Andi Kleen
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Miao Xie
     
  • This patch is meant to improve the performance of SLUB by moving the local
    kmem_cache_node lock into it's own cacheline separate from kmem_cache.
    This is accomplished by simply removing the local_node when NUMA is enabled.

    On my system with 2 nodes I saw around a 5% performance increase w/
    hackbench times dropping from 6.2 seconds to 5.9 seconds on average. I
    suspect the performance gain would increase as the number of nodes
    increases, but I do not have the data to currently back that up.

    Bugzilla-Reference: http://bugzilla.kernel.org/show_bug.cgi?id=15713
    Cc:
    Reported-by: Alex Shi
    Tested-by: Alex Shi
    Acked-by: Yanmin Zhang
    Acked-by: Christoph Lameter
    Signed-off-by: Alexander Duyck
    Signed-off-by: Pekka Enberg

    Alexander Duyck
     

22 May, 2010

3 commits