Commit 0df6db76 authored by Eric Dumazet's avatar Eric Dumazet Committed by Thomas Gleixner
Browse files

posix-timers: Initialize cache early and move pointer into __timer_data



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: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/all/20250402133114.253901-1-edumazet@google.com
parent 0af2f6be
Loading
Loading
Loading
Loading
+10 −13
Original line number Diff line number Diff line
@@ -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 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