2020-07-15 20:05:29 +00:00
|
|
|
From c475b279431f075c7a47aa0eaea252ef670eb27b Mon Sep 17 00:00:00 2001
|
|
|
|
Message-Id: <c475b279431f075c7a47aa0eaea252ef670eb27b.1594742966.git.zanussi@kernel.org>
|
|
|
|
In-Reply-To: <832f7d97d6b989a5b4860dd2dbec58ad6ad5ab81.1594742966.git.zanussi@kernel.org>
|
|
|
|
References: <832f7d97d6b989a5b4860dd2dbec58ad6ad5ab81.1594742966.git.zanussi@kernel.org>
|
2018-08-27 14:32:32 +00:00
|
|
|
From: Thomas Gleixner <tglx@linutronix.de>
|
|
|
|
Date: Thu, 14 Feb 2013 22:36:59 +0100
|
2020-07-15 20:05:29 +00:00
|
|
|
Subject: [PATCH 031/329] timekeeping: Split jiffies seqlock
|
|
|
|
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.132-rt59.tar.xz
|
2018-08-27 14:32:32 +00:00
|
|
|
|
|
|
|
Replace jiffies_lock seqlock with a simple seqcounter and a rawlock so
|
|
|
|
it can be taken in atomic context on RT.
|
|
|
|
|
|
|
|
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|
|
|
---
|
2019-04-08 23:49:20 +00:00
|
|
|
kernel/time/jiffies.c | 7 ++++---
|
|
|
|
kernel/time/tick-common.c | 10 ++++++----
|
|
|
|
kernel/time/tick-sched.c | 19 ++++++++++++-------
|
|
|
|
kernel/time/timekeeping.c | 6 ++++--
|
|
|
|
kernel/time/timekeeping.h | 3 ++-
|
2018-08-27 14:32:32 +00:00
|
|
|
5 files changed, 28 insertions(+), 17 deletions(-)
|
|
|
|
|
2019-04-08 23:49:20 +00:00
|
|
|
diff --git a/kernel/time/jiffies.c b/kernel/time/jiffies.c
|
|
|
|
index 497719127bf9..62acb8914c9e 100644
|
2018-08-27 14:32:32 +00:00
|
|
|
--- a/kernel/time/jiffies.c
|
|
|
|
+++ b/kernel/time/jiffies.c
|
2019-04-08 23:49:20 +00:00
|
|
|
@@ -74,7 +74,8 @@ static struct clocksource clocksource_jiffies = {
|
2018-08-27 14:32:32 +00:00
|
|
|
.max_cycles = 10,
|
|
|
|
};
|
|
|
|
|
|
|
|
-__cacheline_aligned_in_smp DEFINE_SEQLOCK(jiffies_lock);
|
|
|
|
+__cacheline_aligned_in_smp DEFINE_RAW_SPINLOCK(jiffies_lock);
|
|
|
|
+__cacheline_aligned_in_smp seqcount_t jiffies_seq;
|
|
|
|
|
|
|
|
#if (BITS_PER_LONG < 64)
|
|
|
|
u64 get_jiffies_64(void)
|
|
|
|
@@ -83,9 +84,9 @@ u64 get_jiffies_64(void)
|
|
|
|
u64 ret;
|
|
|
|
|
|
|
|
do {
|
|
|
|
- seq = read_seqbegin(&jiffies_lock);
|
|
|
|
+ seq = read_seqcount_begin(&jiffies_seq);
|
|
|
|
ret = jiffies_64;
|
|
|
|
- } while (read_seqretry(&jiffies_lock, seq));
|
|
|
|
+ } while (read_seqcount_retry(&jiffies_seq, seq));
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL(get_jiffies_64);
|
2019-04-08 23:49:20 +00:00
|
|
|
diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c
|
2019-04-30 12:45:19 +00:00
|
|
|
index a02e0f6b287c..32f5101f07ce 100644
|
2018-08-27 14:32:32 +00:00
|
|
|
--- a/kernel/time/tick-common.c
|
|
|
|
+++ b/kernel/time/tick-common.c
|
|
|
|
@@ -79,13 +79,15 @@ int tick_is_oneshot_available(void)
|
|
|
|
static void tick_periodic(int cpu)
|
|
|
|
{
|
|
|
|
if (tick_do_timer_cpu == cpu) {
|
|
|
|
- write_seqlock(&jiffies_lock);
|
|
|
|
+ raw_spin_lock(&jiffies_lock);
|
|
|
|
+ write_seqcount_begin(&jiffies_seq);
|
|
|
|
|
|
|
|
/* Keep track of the next tick event */
|
|
|
|
tick_next_period = ktime_add(tick_next_period, tick_period);
|
|
|
|
|
|
|
|
do_timer(1);
|
|
|
|
- write_sequnlock(&jiffies_lock);
|
|
|
|
+ write_seqcount_end(&jiffies_seq);
|
|
|
|
+ raw_spin_unlock(&jiffies_lock);
|
|
|
|
update_wall_time();
|
|
|
|
}
|
|
|
|
|
2019-04-08 23:49:20 +00:00
|
|
|
@@ -157,9 +159,9 @@ void tick_setup_periodic(struct clock_event_device *dev, int broadcast)
|
2018-08-27 14:32:32 +00:00
|
|
|
ktime_t next;
|
|
|
|
|
|
|
|
do {
|
|
|
|
- seq = read_seqbegin(&jiffies_lock);
|
|
|
|
+ seq = read_seqcount_begin(&jiffies_seq);
|
|
|
|
next = tick_next_period;
|
|
|
|
- } while (read_seqretry(&jiffies_lock, seq));
|
|
|
|
+ } while (read_seqcount_retry(&jiffies_seq, seq));
|
|
|
|
|
|
|
|
clockevents_switch_state(dev, CLOCK_EVT_STATE_ONESHOT);
|
|
|
|
|
2019-04-08 23:49:20 +00:00
|
|
|
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
|
2020-02-21 18:07:43 +00:00
|
|
|
index 48403fb653c2..e774a49176cc 100644
|
2018-08-27 14:32:32 +00:00
|
|
|
--- a/kernel/time/tick-sched.c
|
|
|
|
+++ b/kernel/time/tick-sched.c
|
2020-02-21 18:07:43 +00:00
|
|
|
@@ -68,7 +68,8 @@ static void tick_do_update_jiffies64(ktime_t now)
|
2018-08-27 14:32:32 +00:00
|
|
|
return;
|
|
|
|
|
|
|
|
/* Reevaluate with jiffies_lock held */
|
|
|
|
- write_seqlock(&jiffies_lock);
|
|
|
|
+ raw_spin_lock(&jiffies_lock);
|
|
|
|
+ write_seqcount_begin(&jiffies_seq);
|
|
|
|
|
|
|
|
delta = ktime_sub(now, last_jiffies_update);
|
|
|
|
if (delta >= tick_period) {
|
2020-02-21 18:07:43 +00:00
|
|
|
@@ -94,10 +95,12 @@ static void tick_do_update_jiffies64(ktime_t now)
|
2018-08-27 14:32:32 +00:00
|
|
|
/* Keep the tick_next_period variable up to date */
|
|
|
|
tick_next_period = ktime_add(last_jiffies_update, tick_period);
|
|
|
|
} else {
|
|
|
|
- write_sequnlock(&jiffies_lock);
|
|
|
|
+ write_seqcount_end(&jiffies_seq);
|
|
|
|
+ raw_spin_unlock(&jiffies_lock);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
- write_sequnlock(&jiffies_lock);
|
|
|
|
+ write_seqcount_end(&jiffies_seq);
|
|
|
|
+ raw_spin_unlock(&jiffies_lock);
|
|
|
|
update_wall_time();
|
|
|
|
}
|
|
|
|
|
2020-02-21 18:07:43 +00:00
|
|
|
@@ -108,12 +111,14 @@ static ktime_t tick_init_jiffy_update(void)
|
2018-08-27 14:32:32 +00:00
|
|
|
{
|
|
|
|
ktime_t period;
|
|
|
|
|
|
|
|
- write_seqlock(&jiffies_lock);
|
|
|
|
+ raw_spin_lock(&jiffies_lock);
|
|
|
|
+ write_seqcount_begin(&jiffies_seq);
|
|
|
|
/* Did we start the jiffies update yet ? */
|
|
|
|
if (last_jiffies_update == 0)
|
|
|
|
last_jiffies_update = tick_next_period;
|
|
|
|
period = last_jiffies_update;
|
|
|
|
- write_sequnlock(&jiffies_lock);
|
|
|
|
+ write_seqcount_end(&jiffies_seq);
|
|
|
|
+ raw_spin_unlock(&jiffies_lock);
|
|
|
|
return period;
|
|
|
|
}
|
|
|
|
|
2020-02-21 18:07:43 +00:00
|
|
|
@@ -656,10 +661,10 @@ static ktime_t tick_nohz_next_event(struct tick_sched *ts, int cpu)
|
2018-08-27 14:32:32 +00:00
|
|
|
|
|
|
|
/* Read jiffies and the time when jiffies were updated last */
|
|
|
|
do {
|
|
|
|
- seq = read_seqbegin(&jiffies_lock);
|
|
|
|
+ seq = read_seqcount_begin(&jiffies_seq);
|
|
|
|
basemono = last_jiffies_update;
|
|
|
|
basejiff = jiffies;
|
|
|
|
- } while (read_seqretry(&jiffies_lock, seq));
|
|
|
|
+ } while (read_seqcount_retry(&jiffies_seq, seq));
|
|
|
|
ts->last_jiffies = basejiff;
|
|
|
|
ts->timer_expires_base = basemono;
|
|
|
|
|
2019-04-08 23:49:20 +00:00
|
|
|
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
|
2020-01-03 23:36:11 +00:00
|
|
|
index 81ee5b83c920..512db778f442 100644
|
2018-08-27 14:32:32 +00:00
|
|
|
--- a/kernel/time/timekeeping.c
|
|
|
|
+++ b/kernel/time/timekeeping.c
|
2020-01-03 23:36:11 +00:00
|
|
|
@@ -2394,8 +2394,10 @@ EXPORT_SYMBOL(hardpps);
|
2018-08-27 14:32:32 +00:00
|
|
|
*/
|
|
|
|
void xtime_update(unsigned long ticks)
|
|
|
|
{
|
|
|
|
- write_seqlock(&jiffies_lock);
|
|
|
|
+ raw_spin_lock(&jiffies_lock);
|
|
|
|
+ write_seqcount_begin(&jiffies_seq);
|
|
|
|
do_timer(ticks);
|
|
|
|
- write_sequnlock(&jiffies_lock);
|
|
|
|
+ write_seqcount_end(&jiffies_seq);
|
|
|
|
+ raw_spin_unlock(&jiffies_lock);
|
|
|
|
update_wall_time();
|
|
|
|
}
|
2019-04-08 23:49:20 +00:00
|
|
|
diff --git a/kernel/time/timekeeping.h b/kernel/time/timekeeping.h
|
2019-04-30 12:45:19 +00:00
|
|
|
index 141ab3ab0354..099737f6f10c 100644
|
2018-08-27 14:32:32 +00:00
|
|
|
--- a/kernel/time/timekeeping.h
|
|
|
|
+++ b/kernel/time/timekeeping.h
|
2019-04-30 12:45:19 +00:00
|
|
|
@@ -25,7 +25,8 @@ static inline void sched_clock_resume(void) { }
|
2018-08-27 14:32:32 +00:00
|
|
|
extern void do_timer(unsigned long ticks);
|
|
|
|
extern void update_wall_time(void);
|
|
|
|
|
|
|
|
-extern seqlock_t jiffies_lock;
|
|
|
|
+extern raw_spinlock_t jiffies_lock;
|
|
|
|
+extern seqcount_t jiffies_seq;
|
|
|
|
|
|
|
|
#define CS_NAME_LEN 32
|
|
|
|
|
2020-01-03 23:36:11 +00:00
|
|
|
--
|
2020-06-22 13:14:16 +00:00
|
|
|
2.17.1
|
2020-01-03 23:36:11 +00:00
|
|
|
|