forked from rrcarlosr/Jetpack
189 lines
5.8 KiB
Diff
189 lines
5.8 KiB
Diff
From e77964be056f1c123bf725e4068e9d6611b1b1bb 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/352] 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 b625cc7..f14e352 100644
|
|
--- a/kernel/time/timer.c
|
|
+++ b/kernel/time/timer.c
|
|
@@ -193,7 +193,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;
|
|
@@ -953,10 +953,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();
|
|
}
|
|
@@ -1033,9 +1033,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);
|
|
@@ -1060,7 +1060,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;
|
|
}
|
|
@@ -1154,9 +1154,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);
|
|
}
|
|
@@ -1164,7 +1164,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);
|
|
|
|
@@ -1191,7 +1191,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;
|
|
@@ -1219,7 +1219,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;
|
|
}
|
|
@@ -1351,13 +1351,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);
|
|
}
|
|
}
|
|
}
|
|
@@ -1526,7 +1526,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;
|
|
@@ -1560,7 +1560,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);
|
|
}
|
|
@@ -1647,7 +1647,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
|
|
@@ -1674,7 +1674,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);
|
|
}
|
|
|
|
/*
|
|
@@ -1884,8 +1884,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
|
|
@@ -1898,8 +1898,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;
|
|
@@ -1915,7 +1915,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.7.4
|
|
|