Merge branch 'topic/core-id-check' into topic/caiaq
[safe/jmp/linux-2.6] / mm / slub.c
index 7aaa121..65ffda5 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -9,6 +9,7 @@
  */
 
 #include <linux/mm.h>
+#include <linux/swap.h> /* struct reclaim_state */
 #include <linux/module.h>
 #include <linux/bit_spinlock.h>
 #include <linux/interrupt.h>
@@ -1170,6 +1171,8 @@ static void __free_slab(struct kmem_cache *s, struct page *page)
 
        __ClearPageSlab(page);
        reset_page_mapcount(page);
+       if (current->reclaim_state)
+               current->reclaim_state->reclaimed_slab += pages;
        __free_pages(page, order);
 }
 
@@ -1621,8 +1624,7 @@ void *kmem_cache_alloc(struct kmem_cache *s, gfp_t gfpflags)
 {
        void *ret = slab_alloc(s, gfpflags, -1, _RET_IP_);
 
-       kmemtrace_mark_alloc(KMEMTRACE_TYPE_CACHE, _RET_IP_, ret,
-                            s->objsize, s->size, gfpflags);
+       trace_kmem_cache_alloc(_RET_IP_, ret, s->objsize, s->size, gfpflags);
 
        return ret;
 }
@@ -1641,8 +1643,8 @@ void *kmem_cache_alloc_node(struct kmem_cache *s, gfp_t gfpflags, int node)
 {
        void *ret = slab_alloc(s, gfpflags, node, _RET_IP_);
 
-       kmemtrace_mark_alloc_node(KMEMTRACE_TYPE_CACHE, _RET_IP_, ret,
-                                 s->objsize, s->size, gfpflags, node);
+       trace_kmem_cache_alloc_node(_RET_IP_, ret,
+                                   s->objsize, s->size, gfpflags, node);
 
        return ret;
 }
@@ -1767,7 +1769,7 @@ void kmem_cache_free(struct kmem_cache *s, void *x)
 
        slab_free(s, page, x, _RET_IP_);
 
-       kmemtrace_mark_free(KMEMTRACE_TYPE_CACHE, _RET_IP_, x);
+       trace_kmem_cache_free(_RET_IP_, x);
 }
 EXPORT_SYMBOL(kmem_cache_free);
 
@@ -1910,7 +1912,7 @@ static inline int calculate_order(int size)
         * Doh this slab cannot be placed using slub_max_order.
         */
        order = slab_order(size, 1, MAX_ORDER, 1);
-       if (order <= MAX_ORDER)
+       if (order < MAX_ORDER)
                return order;
        return -ENOSYS;
 }
@@ -2523,6 +2525,7 @@ __setup("slub_min_order=", setup_slub_min_order);
 static int __init setup_slub_max_order(char *str)
 {
        get_option(&str, &slub_max_order);
+       slub_max_order = min(slub_max_order, MAX_ORDER - 1);
 
        return 1;
 }
@@ -2702,8 +2705,7 @@ void *__kmalloc(size_t size, gfp_t flags)
 
        ret = slab_alloc(s, flags, -1, _RET_IP_);
 
-       kmemtrace_mark_alloc(KMEMTRACE_TYPE_KMALLOC, _RET_IP_, ret,
-                            size, s->size, flags);
+       trace_kmalloc(_RET_IP_, ret, size, s->size, flags);
 
        return ret;
 }
@@ -2729,10 +2731,9 @@ void *__kmalloc_node(size_t size, gfp_t flags, int node)
        if (unlikely(size > SLUB_MAX_SIZE)) {
                ret = kmalloc_large_node(size, flags, node);
 
-               kmemtrace_mark_alloc_node(KMEMTRACE_TYPE_KMALLOC,
-                                         _RET_IP_, ret,
-                                         size, PAGE_SIZE << get_order(size),
-                                         flags, node);
+               trace_kmalloc_node(_RET_IP_, ret,
+                                  size, PAGE_SIZE << get_order(size),
+                                  flags, node);
 
                return ret;
        }
@@ -2744,8 +2745,7 @@ void *__kmalloc_node(size_t size, gfp_t flags, int node)
 
        ret = slab_alloc(s, flags, node, _RET_IP_);
 
-       kmemtrace_mark_alloc_node(KMEMTRACE_TYPE_KMALLOC, _RET_IP_, ret,
-                                 size, s->size, flags, node);
+       trace_kmalloc_node(_RET_IP_, ret, size, s->size, flags, node);
 
        return ret;
 }
@@ -2796,6 +2796,8 @@ void kfree(const void *x)
        struct page *page;
        void *object = (void *)x;
 
+       trace_kfree(_RET_IP_, x);
+
        if (unlikely(ZERO_OR_NULL_PTR(x)))
                return;
 
@@ -2806,8 +2808,6 @@ void kfree(const void *x)
                return;
        }
        slab_free(page->slab, page, object, _RET_IP_);
-
-       kmemtrace_mark_free(KMEMTRACE_TYPE_KMALLOC, _RET_IP_, x);
 }
 EXPORT_SYMBOL(kfree);
 
@@ -3290,8 +3290,7 @@ void *__kmalloc_track_caller(size_t size, gfp_t gfpflags, unsigned long caller)
        ret = slab_alloc(s, gfpflags, -1, caller);
 
        /* Honor the call site pointer we recieved. */
-       kmemtrace_mark_alloc(KMEMTRACE_TYPE_KMALLOC, caller, ret, size,
-                            s->size, gfpflags);
+       trace_kmalloc(caller, ret, size, s->size, gfpflags);
 
        return ret;
 }
@@ -3313,8 +3312,7 @@ void *__kmalloc_node_track_caller(size_t size, gfp_t gfpflags,
        ret = slab_alloc(s, gfpflags, node, caller);
 
        /* Honor the call site pointer we recieved. */
-       kmemtrace_mark_alloc_node(KMEMTRACE_TYPE_KMALLOC, caller, ret,
-                                 size, s->size, gfpflags, node);
+       trace_kmalloc_node(caller, ret, size, s->size, gfpflags, node);
 
        return ret;
 }