]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
posix-timers: Initialize cache early and move pointer into __timer_data
authorEric Dumazet <edumazet@google.com>
Wed, 2 Apr 2025 13:31:14 +0000 (13:31 +0000)
committerThomas Gleixner <tglx@linutronix.de>
Wed, 9 Apr 2025 19:21:36 +0000 (21:21 +0200)
Move posix_timers_cache initialization to posixtimer_init(). At that point
the memory subsystem is already up and running.

Also move the cache pointer to the __timer_data variable to avoid
potential false sharing, since it never was marked as __ro_after_init.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/all/20250402133114.253901-1-edumazet@google.com
kernel/time/posix-timers.c

index 6222112533a7b902bb986ac2347a5bcc35625fa6..2053b1a4c9e4bfd792368035553b654593bc7b33 100644 (file)
@@ -30,8 +30,6 @@
 #include "timekeeping.h"
 #include "posix-timers.h"
 
-static struct kmem_cache *posix_timers_cache;
-
 /*
  * Timers are managed in a hash table for lockless lookup. The hash key is
  * constructed from current::signal and the timer ID and the timer is
@@ -49,10 +47,12 @@ struct timer_hash_bucket {
 static struct {
        struct timer_hash_bucket        *buckets;
        unsigned long                   mask;
-} __timer_data __ro_after_init __aligned(2*sizeof(long));
+       struct kmem_cache               *cache;
+} __timer_data __ro_after_init __aligned(4*sizeof(long));
 
-#define timer_buckets  (__timer_data.buckets)
-#define timer_hashmask (__timer_data.mask)
+#define timer_buckets          (__timer_data.buckets)
+#define timer_hashmask         (__timer_data.mask)
+#define posix_timers_cache     (__timer_data.cache)
 
 static const struct k_clock * const posix_clocks[];
 static const struct k_clock *clockid_to_kclock(const clockid_t id);
@@ -283,14 +283,6 @@ static int posix_get_hrtimer_res(clockid_t which_clock, struct timespec64 *tp)
        return 0;
 }
 
-static __init int init_posix_timers(void)
-{
-       posix_timers_cache = kmem_cache_create("posix_timers_cache", sizeof(struct k_itimer),
-                                              __alignof__(struct k_itimer), SLAB_ACCOUNT, NULL);
-       return 0;
-}
-__initcall(init_posix_timers);
-
 /*
  * The siginfo si_overrun field and the return value of timer_getoverrun(2)
  * are of type int. Clamp the overrun value to INT_MAX
@@ -1556,6 +1548,11 @@ static int __init posixtimer_init(void)
        unsigned long i, size;
        unsigned int shift;
 
+       posix_timers_cache = kmem_cache_create("posix_timers_cache",
+                                              sizeof(struct k_itimer),
+                                              __alignof__(struct k_itimer),
+                                              SLAB_ACCOUNT, NULL);
+
        if (IS_ENABLED(CONFIG_BASE_SMALL))
                size = 512;
        else