Merge tag 'trace-tools-v6.5' of git://git.kernel.org/pub/scm/linux/kernel/git/trace...
[linux-2.6-microblaze.git] / mm / slab_common.c
index 43c0081..d1555ea 100644 (file)
@@ -49,7 +49,7 @@ static DECLARE_WORK(slab_caches_to_rcu_destroy_work,
  */
 #define SLAB_NEVER_MERGE (SLAB_RED_ZONE | SLAB_POISON | SLAB_STORE_USER | \
                SLAB_TRACE | SLAB_TYPESAFE_BY_RCU | SLAB_NOLEAKTRACE | \
-               SLAB_FAILSLAB | kasan_never_merge())
+               SLAB_FAILSLAB | SLAB_NO_MERGE | kasan_never_merge())
 
 #define SLAB_MERGE_SAME (SLAB_RECLAIM_ACCOUNT | SLAB_CACHE_DMA | \
                         SLAB_CACHE_DMA32 | SLAB_ACCOUNT)
@@ -238,14 +238,12 @@ static struct kmem_cache *create_cache(const char *name,
 
        s->refcount = 1;
        list_add(&s->list, &slab_caches);
-out:
-       if (err)
-               return ERR_PTR(err);
        return s;
 
 out_free_cache:
        kmem_cache_free(kmem_cache, s);
-       goto out;
+out:
+       return ERR_PTR(err);
 }
 
 /**
@@ -892,6 +890,13 @@ new_kmalloc_cache(int idx, enum kmalloc_cache_type type, slab_flags_t flags)
                flags |= SLAB_CACHE_DMA;
        }
 
+       /*
+        * If CONFIG_MEMCG_KMEM is enabled, disable cache merging for
+        * KMALLOC_NORMAL caches.
+        */
+       if (IS_ENABLED(CONFIG_MEMCG_KMEM) && (type == KMALLOC_NORMAL))
+               flags |= SLAB_NO_MERGE;
+
        if (minalign > ARCH_KMALLOC_MINALIGN) {
                aligned_size = ALIGN(aligned_size, minalign);
                aligned_idx = __kmalloc_index(aligned_size, false);
@@ -903,13 +908,6 @@ new_kmalloc_cache(int idx, enum kmalloc_cache_type type, slab_flags_t flags)
                                        aligned_size, flags);
        if (idx != aligned_idx)
                kmalloc_caches[type][idx] = kmalloc_caches[type][aligned_idx];
-
-       /*
-        * If CONFIG_MEMCG_KMEM is enabled, disable cache merging for
-        * KMALLOC_NORMAL caches.
-        */
-       if (IS_ENABLED(CONFIG_MEMCG_KMEM) && (type == KMALLOC_NORMAL))
-               kmalloc_caches[type][idx]->refcount = -1;
 }
 
 /*
@@ -1162,7 +1160,7 @@ EXPORT_SYMBOL(kmalloc_large_node);
 
 #ifdef CONFIG_SLAB_FREELIST_RANDOM
 /* Randomize a generic freelist */
-static void freelist_randomize(struct rnd_state *state, unsigned int *list,
+static void freelist_randomize(unsigned int *list,
                               unsigned int count)
 {
        unsigned int rand;
@@ -1173,8 +1171,7 @@ static void freelist_randomize(struct rnd_state *state, unsigned int *list,
 
        /* Fisher-Yates shuffle */
        for (i = count - 1; i > 0; i--) {
-               rand = prandom_u32_state(state);
-               rand %= (i + 1);
+               rand = get_random_u32_below(i + 1);
                swap(list[i], list[rand]);
        }
 }
@@ -1183,7 +1180,6 @@ static void freelist_randomize(struct rnd_state *state, unsigned int *list,
 int cache_random_seq_create(struct kmem_cache *cachep, unsigned int count,
                                    gfp_t gfp)
 {
-       struct rnd_state state;
 
        if (count < 2 || cachep->random_seq)
                return 0;
@@ -1192,10 +1188,7 @@ int cache_random_seq_create(struct kmem_cache *cachep, unsigned int count,
        if (!cachep->random_seq)
                return -ENOMEM;
 
-       /* Get best entropy at this stage of boot */
-       prandom_seed_state(&state, get_random_long());
-
-       freelist_randomize(&state, cachep->random_seq, count);
+       freelist_randomize(cachep->random_seq, count);
        return 0;
 }