mm, slub: validate slab from partial list or page allocator before making it cpu...
[platform/kernel/linux-starfive.git] / mm / slub.c
index 7798ba1..a5e974d 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -2802,10 +2802,8 @@ new_objects:
        lockdep_assert_irqs_disabled();
 
        freelist = get_partial(s, gfpflags, node, &page);
-       if (freelist) {
-               c->page = page;
+       if (freelist)
                goto check_new_page;
-       }
 
        local_irq_restore(flags);
        put_cpu_ptr(s->cpu_slab);
@@ -2818,9 +2816,6 @@ new_objects:
        }
 
        local_irq_save(flags);
-       if (c->page)
-               flush_slab(s, c);
-
        /*
         * No other reference to the page yet so we can
         * muck around with it freely without cmpxchg
@@ -2829,14 +2824,12 @@ new_objects:
        page->freelist = NULL;
 
        stat(s, ALLOC_SLAB);
-       c->page = page;
 
 check_new_page:
 
        if (kmem_cache_debug(s)) {
                if (!alloc_debug_processing(s, page, freelist, addr)) {
                        /* Slab failed checks. Next slab needed */
-                       c->page = NULL;
                        local_irq_restore(flags);
                        goto new_slab;
                } else {
@@ -2855,10 +2848,18 @@ check_new_page:
                 */
                goto return_single;
 
+       if (unlikely(c->page))
+               flush_slab(s, c);
+       c->page = page;
+
        goto load_freelist;
 
 return_single:
 
+       if (unlikely(c->page))
+               flush_slab(s, c);
+       c->page = page;
+
        deactivate_slab(s, page, get_freepointer(s, freelist), c);
        local_irq_restore(flags);
        return freelist;