The decision whether to scan remote nodes is based on a 'random' number
retrieved via get_cycles(). get_cycles() is about to be removed.

There is already prandom state in the code, so use that instead.

Signed-off-by: Thomas Gleixner <[email protected]>
Cc: Vlastimil Babka <[email protected]>
Cc: [email protected]
---
 mm/slub.c |   37 +++++++++++++++++++++++--------------
 1 file changed, 23 insertions(+), 14 deletions(-)

--- a/mm/slub.c
+++ b/mm/slub.c
@@ -3302,6 +3302,25 @@ static inline struct slab *alloc_slab_pa
        return slab;
 }
 
+#if defined(CONFIG_SLAB_FREELIST_RANDOM) || defined(CONFIG_NUMA)
+static DEFINE_PER_CPU(struct rnd_state, slab_rnd_state);
+
+static unsigned int slab_get_prandom_state(unsigned int limit)
+{
+       struct rnd_state *state;
+       unsigned int res;
+
+       /*
+        * An interrupt or NMI handler might interrupt and change
+        * the state in the middle, but that's safe.
+        */
+       state = &get_cpu_var(slab_rnd_state);
+       res = prandom_u32_state(state) % limit;
+       put_cpu_var(slab_rnd_state);
+       return res;
+}
+#endif
+
 #ifdef CONFIG_SLAB_FREELIST_RANDOM
 /* Pre-initialize the random sequence cache */
 static int init_cache_random_seq(struct kmem_cache *s)
@@ -3365,8 +3384,6 @@ static void *next_freelist_entry(struct
        return (char *)start + idx;
 }
 
-static DEFINE_PER_CPU(struct rnd_state, slab_rnd_state);
-
 /* Shuffle the single linked freelist based on a random pre-computed sequence 
*/
 static bool shuffle_freelist(struct kmem_cache *s, struct slab *slab,
                             bool allow_spin)
@@ -3383,15 +3400,7 @@ static bool shuffle_freelist(struct kmem
        if (allow_spin) {
                pos = get_random_u32_below(freelist_count);
        } else {
-               struct rnd_state *state;
-
-               /*
-                * An interrupt or NMI handler might interrupt and change
-                * the state in the middle, but that's safe.
-                */
-               state = &get_cpu_var(slab_rnd_state);
-               pos = prandom_u32_state(state) % freelist_count;
-               put_cpu_var(slab_rnd_state);
+               pos = slab_get_prandom_state(freelist_count);
        }
 
        page_limit = slab->objects * s->size;
@@ -3882,7 +3891,7 @@ static void *get_from_any_partial(struct
         * with available objects.
         */
        if (!s->remote_node_defrag_ratio ||
-                       get_cycles() % 1024 > s->remote_node_defrag_ratio)
+           slab_get_prandom_state(1024) > s->remote_node_defrag_ratio)
                return NULL;
 
        do {
@@ -7102,7 +7111,7 @@ static unsigned int
 
        /* see get_from_any_partial() for the defrag ratio description */
        if (!s->remote_node_defrag_ratio ||
-                       get_cycles() % 1024 > s->remote_node_defrag_ratio)
+           slab_get_prandom_state(1024) > s->remote_node_defrag_ratio)
                return 0;
 
        do {
@@ -8421,7 +8430,7 @@ void __init kmem_cache_init_late(void)
        flushwq = alloc_workqueue("slub_flushwq", WQ_MEM_RECLAIM | WQ_PERCPU,
                                  0);
        WARN_ON(!flushwq);
-#ifdef CONFIG_SLAB_FREELIST_RANDOM
+#if defined(CONFIG_SLAB_FREELIST_RANDOM) || defined(CONFIG_NUMA)
        prandom_init_once(&slab_rnd_state);
 #endif
 }


Reply via email to