]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blobdiff - mm/slub.c
Move free pages between lists on steal
[mirror_ubuntu-hirsute-kernel.git] / mm / slub.c
index d7c044dbd1576649ec61eb4e3442ef8703600023..19d3202ca2dcfc26ac2509bbd2148623703c5435 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -1088,12 +1088,13 @@ static struct page *new_slab(struct kmem_cache *s, gfp_t flags, int node)
        void *last;
        void *p;
 
-       BUG_ON(flags & ~(GFP_DMA | __GFP_ZERO | GFP_LEVEL_MASK));
+       BUG_ON(flags & GFP_SLAB_BUG_MASK);
 
        if (flags & __GFP_WAIT)
                local_irq_enable();
 
-       page = allocate_slab(s, flags & GFP_LEVEL_MASK, node);
+       page = allocate_slab(s,
+               flags & (GFP_RECLAIM_MASK | GFP_CONSTRAINT_MASK), node);
        if (!page)
                goto out;
 
@@ -1921,7 +1922,7 @@ static void free_kmem_cache_nodes(struct kmem_cache *s)
 {
        int node;
 
-       for_each_online_node(node) {
+       for_each_node_state(node, N_NORMAL_MEMORY) {
                struct kmem_cache_node *n = s->node[node];
                if (n && n != &s->local_node)
                        kmem_cache_free(kmalloc_caches, n);
@@ -1939,7 +1940,7 @@ static int init_kmem_cache_nodes(struct kmem_cache *s, gfp_t gfpflags)
        else
                local_node = 0;
 
-       for_each_online_node(node) {
+       for_each_node_state(node, N_NORMAL_MEMORY) {
                struct kmem_cache_node *n;
 
                if (local_node == node)
@@ -2192,7 +2193,7 @@ static inline int kmem_cache_close(struct kmem_cache *s)
        flush_all(s);
 
        /* Attempt to free all objects */
-       for_each_online_node(node) {
+       for_each_node_state(node, N_NORMAL_MEMORY) {
                struct kmem_cache_node *n = get_node(s, node);
 
                n->nr_partial -= free_list(s, n, &n->partial);
@@ -2521,7 +2522,7 @@ int kmem_cache_shrink(struct kmem_cache *s)
                return -ENOMEM;
 
        flush_all(s);
-       for_each_online_node(node) {
+       for_each_node_state(node, N_NORMAL_MEMORY) {
                n = get_node(s, node);
 
                if (!n->nr_partial)
@@ -2916,7 +2917,7 @@ static long validate_slab_cache(struct kmem_cache *s)
                return -ENOMEM;
 
        flush_all(s);
-       for_each_online_node(node) {
+       for_each_node_state(node, N_NORMAL_MEMORY) {
                struct kmem_cache_node *n = get_node(s, node);
 
                count += validate_slab_node(s, n, map);
@@ -3136,7 +3137,7 @@ static int list_locations(struct kmem_cache *s, char *buf,
        /* Push back cpu slabs */
        flush_all(s);
 
-       for_each_online_node(node) {
+       for_each_node_state(node, N_NORMAL_MEMORY) {
                struct kmem_cache_node *n = get_node(s, node);
                unsigned long flags;
                struct page *page;
@@ -3263,7 +3264,7 @@ static unsigned long slab_objects(struct kmem_cache *s,
                }
        }
 
-       for_each_online_node(node) {
+       for_each_node_state(node, N_NORMAL_MEMORY) {
                struct kmem_cache_node *n = get_node(s, node);
 
                if (flags & SO_PARTIAL) {
@@ -3291,7 +3292,7 @@ static unsigned long slab_objects(struct kmem_cache *s,
 
        x = sprintf(buf, "%lu", total);
 #ifdef CONFIG_NUMA
-       for_each_online_node(node)
+       for_each_node_state(node, N_NORMAL_MEMORY)
                if (nodes[node])
                        x += sprintf(buf + x, " N%d=%lu",
                                        node, nodes[node]);