]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
hrtimers: Replace hrtimer_clock_to_base_table with switch-case
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Fri, 14 Feb 2025 13:43:33 +0000 (15:43 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Tue, 18 Feb 2025 09:12:49 +0000 (10:12 +0100)
Clang and GCC complain about overlapped initialisers in the
hrtimer_clock_to_base_table definition. With `make W=1` and CONFIG_WERROR=y
(which is default nowadays) this breaks the build:

  CC      kernel/time/hrtimer.o
kernel/time/hrtimer.c:124:21: error: initializer overrides prior initialization of this subobject [-Werror,-Winitializer-overrides]
  124 |         [CLOCK_REALTIME]        = HRTIMER_BASE_REALTIME,

kernel/time/hrtimer.c:122:27: note: previous initialization is here
  122 |         [0 ... MAX_CLOCKS - 1]  = HRTIMER_MAX_CLOCK_BASES,

(and similar for CLOCK_MONOTONIC, CLOCK_BOOTTIME, and CLOCK_TAI).

hrtimer_clockid_to_base(), which uses the table, is only used in
__hrtimer_init(), which is not a hotpath.

Therefore replace the table lookup with a switch case in
hrtimer_clockid_to_base() to avoid this warning.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/all/20250214134424.3367619-1-andriy.shevchenko@linux.intel.com
kernel/time/hrtimer.c

index deb1aa32814e3bbea57d0a6a23986a625c6e13d1..453dc76c934848f877e56d4e57cbbb3c812d769f 100644 (file)
@@ -117,16 +117,6 @@ DEFINE_PER_CPU(struct hrtimer_cpu_base, hrtimer_bases) =
        .csd = CSD_INIT(retrigger_next_event, NULL)
 };
 
-static const int hrtimer_clock_to_base_table[MAX_CLOCKS] = {
-       /* Make sure we catch unsupported clockids */
-       [0 ... MAX_CLOCKS - 1]  = HRTIMER_MAX_CLOCK_BASES,
-
-       [CLOCK_REALTIME]        = HRTIMER_BASE_REALTIME,
-       [CLOCK_MONOTONIC]       = HRTIMER_BASE_MONOTONIC,
-       [CLOCK_BOOTTIME]        = HRTIMER_BASE_BOOTTIME,
-       [CLOCK_TAI]             = HRTIMER_BASE_TAI,
-};
-
 static inline bool hrtimer_base_is_online(struct hrtimer_cpu_base *base)
 {
        if (!IS_ENABLED(CONFIG_HOTPLUG_CPU))
@@ -1587,14 +1577,19 @@ u64 hrtimer_next_event_without(const struct hrtimer *exclude)
 
 static inline int hrtimer_clockid_to_base(clockid_t clock_id)
 {
-       if (likely(clock_id < MAX_CLOCKS)) {
-               int base = hrtimer_clock_to_base_table[clock_id];
-
-               if (likely(base != HRTIMER_MAX_CLOCK_BASES))
-                       return base;
+       switch (clock_id) {
+       case CLOCK_REALTIME:
+               return HRTIMER_BASE_REALTIME;
+       case CLOCK_MONOTONIC:
+               return HRTIMER_BASE_MONOTONIC;
+       case CLOCK_BOOTTIME:
+               return HRTIMER_BASE_BOOTTIME;
+       case CLOCK_TAI:
+               return HRTIMER_BASE_TAI;
+       default:
+               WARN(1, "Invalid clockid %d. Using MONOTONIC\n", clock_id);
+               return HRTIMER_BASE_MONOTONIC;
        }
-       WARN(1, "Invalid clockid %d. Using MONOTONIC\n", clock_id);
-       return HRTIMER_BASE_MONOTONIC;
 }
 
 static enum hrtimer_restart hrtimer_dummy_timeout(struct hrtimer *unused)