| From 9482fd71dbb8f0d1a61821a83e467dc0a9d7b429 Mon Sep 17 00:00:00 2001 |
| From: Thomas Gleixner <tglx@linutronix.de> |
| Date: Thu, 12 Aug 2021 22:31:24 +0200 |
| Subject: [PATCH] hrtimer: Use raw_cpu_ptr() in clock_was_set() |
| Git-commit: 9482fd71dbb8f0d1a61821a83e467dc0a9d7b429 |
| Patch-mainline: v5.15-rc1 |
| References: bsc#1190366 |
| |
| clock_was_set() can be invoked from preemptible context. Use raw_cpu_ptr() |
| to check whether high resolution mode is active or not. It does not matter |
| whether the task migrates after acquiring the pointer. |
| |
| Fixes: e71a4153b7c2 ("hrtimer: Force clock_was_set() handling for the HIGHRES=n, NOHZ=y case") |
| Reported-by: Mike Galbraith <efault@gmx.de> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Link: https://lore.kernel.org/r/875ywacsmb.ffs@tglx |
| Signed-off-by: Davidlohr Bueso <dbueso@suse.de> |
| |
| |
| kernel/time/hrtimer.c | 5 +++-- |
| 1 file changed, 3 insertions(+), 2 deletions(-) |
| |
| diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c |
| index 88aefc35f7d2..33b00e213e07 100644 |
| |
| |
| @@ -944,10 +944,11 @@ static bool update_needs_ipi(struct hrtimer_cpu_base *cpu_base, |
| */ |
| void clock_was_set(unsigned int bases) |
| { |
| + struct hrtimer_cpu_base *cpu_base = raw_cpu_ptr(&hrtimer_bases); |
| cpumask_var_t mask; |
| int cpu; |
| |
| - if (!hrtimer_hres_active() && !tick_nohz_active) |
| + if (!__hrtimer_hres_active(cpu_base) && !tick_nohz_active) |
| goto out_timerfd; |
| |
| if (!zalloc_cpumask_var(&mask, GFP_KERNEL)) { |
| @@ -958,9 +959,9 @@ void clock_was_set(unsigned int bases) |
| /* Avoid interrupting CPUs if possible */ |
| cpus_read_lock(); |
| for_each_online_cpu(cpu) { |
| - struct hrtimer_cpu_base *cpu_base = &per_cpu(hrtimer_bases, cpu); |
| unsigned long flags; |
| |
| + cpu_base = &per_cpu(hrtimer_bases, cpu); |
| raw_spin_lock_irqsave(&cpu_base->lock, flags); |
| |
| if (update_needs_ipi(cpu_base, bases)) |
| -- |
| 2.26.2 |
| |