189 lines
5.8 KiB
Diff
189 lines
5.8 KiB
Diff
From bd0e83b20d8dbea20d7e7f34bae3091edf8d0f75 Mon Sep 17 00:00:00 2001
|
|
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|
Date: Wed, 13 Jul 2016 18:22:23 +0200
|
|
Subject: [PATCH 001/365] timer: make the base lock raw
|
|
|
|
The part where the base lock is held got more predictable / shorter after the
|
|
timer rework. One reason is the lack of re-cascading.
|
|
That means the lock can be made raw and held in IRQ context.
|
|
|
|
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|
---
|
|
kernel/time/timer.c | 48 ++++++++++++++++++++++-----------------------
|
|
1 file changed, 24 insertions(+), 24 deletions(-)
|
|
|
|
diff --git a/kernel/time/timer.c b/kernel/time/timer.c
|
|
index c9325a1e30d0..0133a7160f11 100644
|
|
--- a/kernel/time/timer.c
|
|
+++ b/kernel/time/timer.c
|
|
@@ -194,7 +194,7 @@ EXPORT_SYMBOL(jiffies_64);
|
|
#endif
|
|
|
|
struct timer_base {
|
|
- spinlock_t lock;
|
|
+ raw_spinlock_t lock;
|
|
struct timer_list *running_timer;
|
|
unsigned long clk;
|
|
unsigned long next_expiry;
|
|
@@ -954,10 +954,10 @@ static struct timer_base *lock_timer_base(struct timer_list *timer,
|
|
|
|
if (!(tf & TIMER_MIGRATING)) {
|
|
base = get_timer_base(tf);
|
|
- spin_lock_irqsave(&base->lock, *flags);
|
|
+ raw_spin_lock_irqsave(&base->lock, *flags);
|
|
if (timer->flags == tf)
|
|
return base;
|
|
- spin_unlock_irqrestore(&base->lock, *flags);
|
|
+ raw_spin_unlock_irqrestore(&base->lock, *flags);
|
|
}
|
|
cpu_relax();
|
|
}
|
|
@@ -1034,9 +1034,9 @@ __mod_timer(struct timer_list *timer, unsigned long expires, bool pending_only)
|
|
/* See the comment in lock_timer_base() */
|
|
timer->flags |= TIMER_MIGRATING;
|
|
|
|
- spin_unlock(&base->lock);
|
|
+ raw_spin_unlock(&base->lock);
|
|
base = new_base;
|
|
- spin_lock(&base->lock);
|
|
+ raw_spin_lock(&base->lock);
|
|
WRITE_ONCE(timer->flags,
|
|
(timer->flags & ~TIMER_BASEMASK) | base->cpu);
|
|
forward_timer_base(base);
|
|
@@ -1061,7 +1061,7 @@ __mod_timer(struct timer_list *timer, unsigned long expires, bool pending_only)
|
|
}
|
|
|
|
out_unlock:
|
|
- spin_unlock_irqrestore(&base->lock, flags);
|
|
+ raw_spin_unlock_irqrestore(&base->lock, flags);
|
|
|
|
return ret;
|
|
}
|
|
@@ -1155,9 +1155,9 @@ void add_timer_on(struct timer_list *timer, int cpu)
|
|
if (base != new_base) {
|
|
timer->flags |= TIMER_MIGRATING;
|
|
|
|
- spin_unlock(&base->lock);
|
|
+ raw_spin_unlock(&base->lock);
|
|
base = new_base;
|
|
- spin_lock(&base->lock);
|
|
+ raw_spin_lock(&base->lock);
|
|
WRITE_ONCE(timer->flags,
|
|
(timer->flags & ~TIMER_BASEMASK) | cpu);
|
|
}
|
|
@@ -1165,7 +1165,7 @@ void add_timer_on(struct timer_list *timer, int cpu)
|
|
|
|
debug_activate(timer, timer->expires);
|
|
internal_add_timer(base, timer);
|
|
- spin_unlock_irqrestore(&base->lock, flags);
|
|
+ raw_spin_unlock_irqrestore(&base->lock, flags);
|
|
}
|
|
EXPORT_SYMBOL_GPL(add_timer_on);
|
|
|
|
@@ -1192,7 +1192,7 @@ int del_timer(struct timer_list *timer)
|
|
if (timer_pending(timer)) {
|
|
base = lock_timer_base(timer, &flags);
|
|
ret = detach_if_pending(timer, base, true);
|
|
- spin_unlock_irqrestore(&base->lock, flags);
|
|
+ raw_spin_unlock_irqrestore(&base->lock, flags);
|
|
}
|
|
|
|
return ret;
|
|
@@ -1220,7 +1220,7 @@ int try_to_del_timer_sync(struct timer_list *timer)
|
|
timer_stats_timer_clear_start_info(timer);
|
|
ret = detach_if_pending(timer, base, true);
|
|
}
|
|
- spin_unlock_irqrestore(&base->lock, flags);
|
|
+ raw_spin_unlock_irqrestore(&base->lock, flags);
|
|
|
|
return ret;
|
|
}
|
|
@@ -1352,13 +1352,13 @@ static void expire_timers(struct timer_base *base, struct hlist_head *head)
|
|
data = timer->data;
|
|
|
|
if (timer->flags & TIMER_IRQSAFE) {
|
|
- spin_unlock(&base->lock);
|
|
+ raw_spin_unlock(&base->lock);
|
|
call_timer_fn(timer, fn, data);
|
|
- spin_lock(&base->lock);
|
|
+ raw_spin_lock(&base->lock);
|
|
} else {
|
|
- spin_unlock_irq(&base->lock);
|
|
+ raw_spin_unlock_irq(&base->lock);
|
|
call_timer_fn(timer, fn, data);
|
|
- spin_lock_irq(&base->lock);
|
|
+ raw_spin_lock_irq(&base->lock);
|
|
}
|
|
}
|
|
}
|
|
@@ -1527,7 +1527,7 @@ u64 get_next_timer_interrupt(unsigned long basej, u64 basem)
|
|
if (cpu_is_offline(smp_processor_id()))
|
|
return expires;
|
|
|
|
- spin_lock(&base->lock);
|
|
+ raw_spin_lock(&base->lock);
|
|
nextevt = __next_timer_interrupt(base);
|
|
is_max_delta = (nextevt == base->clk + NEXT_TIMER_MAX_DELTA);
|
|
base->next_expiry = nextevt;
|
|
@@ -1561,7 +1561,7 @@ u64 get_next_timer_interrupt(unsigned long basej, u64 basem)
|
|
base->is_idle = true;
|
|
}
|
|
}
|
|
- spin_unlock(&base->lock);
|
|
+ raw_spin_unlock(&base->lock);
|
|
|
|
return cmp_next_hrtimer_event(basem, expires);
|
|
}
|
|
@@ -1650,7 +1650,7 @@ static inline void __run_timers(struct timer_base *base)
|
|
if (!time_after_eq(jiffies, base->clk))
|
|
return;
|
|
|
|
- spin_lock_irq(&base->lock);
|
|
+ raw_spin_lock_irq(&base->lock);
|
|
|
|
/*
|
|
* timer_base::must_forward_clk must be cleared before running
|
|
@@ -1677,7 +1677,7 @@ static inline void __run_timers(struct timer_base *base)
|
|
expire_timers(base, heads + levels);
|
|
}
|
|
base->running_timer = NULL;
|
|
- spin_unlock_irq(&base->lock);
|
|
+ raw_spin_unlock_irq(&base->lock);
|
|
}
|
|
|
|
/*
|
|
@@ -1887,8 +1887,8 @@ int timers_dead_cpu(unsigned int cpu)
|
|
* The caller is globally serialized and nobody else
|
|
* takes two locks at once, deadlock is not possible.
|
|
*/
|
|
- spin_lock_irq(&new_base->lock);
|
|
- spin_lock_nested(&old_base->lock, SINGLE_DEPTH_NESTING);
|
|
+ raw_spin_lock_irq(&new_base->lock);
|
|
+ raw_spin_lock_nested(&old_base->lock, SINGLE_DEPTH_NESTING);
|
|
|
|
/*
|
|
* The current CPUs base clock might be stale. Update it
|
|
@@ -1901,8 +1901,8 @@ int timers_dead_cpu(unsigned int cpu)
|
|
for (i = 0; i < WHEEL_SIZE; i++)
|
|
migrate_timer_list(new_base, old_base->vectors + i);
|
|
|
|
- spin_unlock(&old_base->lock);
|
|
- spin_unlock_irq(&new_base->lock);
|
|
+ raw_spin_unlock(&old_base->lock);
|
|
+ raw_spin_unlock_irq(&new_base->lock);
|
|
put_cpu_ptr(&timer_bases);
|
|
}
|
|
return 0;
|
|
@@ -1918,7 +1918,7 @@ static void __init init_timer_cpu(int cpu)
|
|
for (i = 0; i < NR_BASES; i++) {
|
|
base = per_cpu_ptr(&timer_bases[i], cpu);
|
|
base->cpu = cpu;
|
|
- spin_lock_init(&base->lock);
|
|
+ raw_spin_lock_init(&base->lock);
|
|
base->clk = jiffies;
|
|
}
|
|
}
|
|
--
|
|
2.28.0
|
|
|