* [RFC][PATCH 1/3] timekeeping: Fix lost updates to tai adjustment
[not found] <1386652197-7035-1-git-send-email-john.stultz@linaro.org>
@ 2013-12-10 5:09 ` John Stultz
2013-12-10 5:09 ` [RFC][PATCH 2/3] timekeeping: Fix missing timekeeping_update in suspend path John Stultz
2013-12-10 5:09 ` [RFC][PATCH 3/3] timekeeping: Fix potential lost pv notification of time change John Stultz
2 siblings, 0 replies; 5+ messages in thread
From: John Stultz @ 2013-12-10 5:09 UTC (permalink / raw)
To: LKML
Cc: John Stultz, Thomas Gleixner, Prarit Bhargava, Richard Cochran,
Ingo Molnar, stable
Since 48cdc135d4840 (Implement a shadow timekeeper), we have to
call timekeeping_update() after any adjustment to the timekeeping
structure in order to make sure that any adjustments to the structure
persist.
Unfortunately, the updates to the tai offset via adjtimex do not
trigger this update, causing adjustments to the tai offset to be
made and then over-written by the previous value at the next
update_wall_time() call.
This patch resovles the issue by calling timekeeping_update()
right after setting the tai offset.
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Prarit Bhargava <prarit@redhat.com>
Cc: Richard Cochran <richardcochran@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: stable <stable@vger.kernel.org> #3.10+
Signed-off-by: John Stultz <john.stultz@linaro.org>
---
kernel/time/timekeeping.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
index 87b4f00..6bad3d9 100644
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -610,6 +610,7 @@ void timekeeping_set_tai_offset(s32 tai_offset)
raw_spin_lock_irqsave(&timekeeper_lock, flags);
write_seqcount_begin(&timekeeper_seq);
__timekeeping_set_tai_offset(tk, tai_offset);
+ timekeeping_update(tk, TK_MIRROR | TK_CLOCK_WAS_SET);
write_seqcount_end(&timekeeper_seq);
raw_spin_unlock_irqrestore(&timekeeper_lock, flags);
clock_was_set();
@@ -1698,7 +1699,7 @@ int do_adjtimex(struct timex *txc)
if (tai != orig_tai) {
__timekeeping_set_tai_offset(tk, tai);
- update_pvclock_gtod(tk, true);
+ timekeeping_update(tk, TK_MIRROR | TK_CLOCK_WAS_SET);
clock_was_set_delayed();
}
write_seqcount_end(&timekeeper_seq);
--
1.8.3.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [RFC][PATCH 2/3] timekeeping: Fix missing timekeeping_update in suspend path
[not found] <1386652197-7035-1-git-send-email-john.stultz@linaro.org>
2013-12-10 5:09 ` [RFC][PATCH 1/3] timekeeping: Fix lost updates to tai adjustment John Stultz
@ 2013-12-10 5:09 ` John Stultz
2013-12-10 5:09 ` [RFC][PATCH 3/3] timekeeping: Fix potential lost pv notification of time change John Stultz
2 siblings, 0 replies; 5+ messages in thread
From: John Stultz @ 2013-12-10 5:09 UTC (permalink / raw)
To: LKML
Cc: John Stultz, Thomas Gleixner, Prarit Bhargava, Richard Cochran,
Ingo Molnar, stable
Since 48cdc135d4840 (Implement a shadow timekeeper), we have to
call timekeeping_update() after any adjustment to the timekeeping
structure in order to make sure that any adjustments to the structure
persist.
In the timekeeping suspend path, we udpate the timekeeper
structure, so we should be sure to update the shadow-timekeeper
before releasing the timekeeping locks. Currently this isn't done.
In most cases, the next time related code to run would be
timekeeping_resume, which does update the shadow-timekeeper, but
in an abundence of caution, this patch adds the call to
timekeeping_update() in the suspend path.
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Prarit Bhargava <prarit@redhat.com>
Cc: Richard Cochran <richardcochran@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: stable <stable@vger.kernel.org> #3.10+
Signed-off-by: John Stultz <john.stultz@linaro.org>
---
kernel/time/timekeeping.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
index 6bad3d9..c615e9d 100644
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -1024,6 +1024,8 @@ static int timekeeping_suspend(void)
timekeeping_suspend_time =
timespec_add(timekeeping_suspend_time, delta_delta);
}
+
+ timekeeping_update(tk, TK_MIRROR);
write_seqcount_end(&timekeeper_seq);
raw_spin_unlock_irqrestore(&timekeeper_lock, flags);
--
1.8.3.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [RFC][PATCH 3/3] timekeeping: Fix potential lost pv notification of time change
[not found] <1386652197-7035-1-git-send-email-john.stultz@linaro.org>
2013-12-10 5:09 ` [RFC][PATCH 1/3] timekeeping: Fix lost updates to tai adjustment John Stultz
2013-12-10 5:09 ` [RFC][PATCH 2/3] timekeeping: Fix missing timekeeping_update in suspend path John Stultz
@ 2013-12-10 5:09 ` John Stultz
2013-12-10 8:13 ` [Xen-devel] " Jan Beulich
2 siblings, 1 reply; 5+ messages in thread
From: John Stultz @ 2013-12-10 5:09 UTC (permalink / raw)
To: LKML
Cc: John Stultz, Thomas Gleixner, Ingo Molnar, David Vrabel,
Konrad Rzeszutek Wilk, Prarit Bhargava, Richard Cochran,
xen-devel, stable
In 780427f0e11 (Indicate that clock was set in the pvclock
gtod notifier), logic was added to pass a CLOCK_WAS_SET
notification to the pvclock notifier chain.
While that patch added a action flag returned from
accumulate_nsecs_to_secs(), it only uses the returned value
in one location, and not in the logarithmic accumulation.
This means if a leap second triggered during the logarithmic
accumulation (which is most likely where it would happen),
the notification that the clock was set would not make it to
the pv notifiers.
This patch extends the logarithmic_accumulation pass down
that action flag so proper notification will occur.
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: David Vrabel <david.vrabel@citrix.com>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Prarit Bhargava <prarit@redhat.com>
Cc: Richard Cochran <richardcochran@gmail.com>
Cc: <xen-devel@lists.xen.org>
Cc: stable <stable@vger.kernel.org> #3.11+
Signed-off-by: John Stultz <john.stultz@linaro.org>
---
kernel/time/timekeeping.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
index c615e9d..e429229 100644
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -1297,7 +1297,7 @@ static inline unsigned int accumulate_nsecs_to_secs(struct timekeeper *tk)
* Returns the unconsumed cycles.
*/
static cycle_t logarithmic_accumulation(struct timekeeper *tk, cycle_t offset,
- u32 shift)
+ u32 shift, int *action)
{
cycle_t interval = tk->cycle_interval << shift;
u64 raw_nsecs;
@@ -1311,7 +1311,7 @@ static cycle_t logarithmic_accumulation(struct timekeeper *tk, cycle_t offset,
tk->cycle_last += interval;
tk->xtime_nsec += tk->xtime_interval << shift;
- accumulate_nsecs_to_secs(tk);
+ *action |= accumulate_nsecs_to_secs(tk);
/* Accumulate raw time */
raw_nsecs = (u64)tk->raw_interval << shift;
@@ -1369,7 +1369,7 @@ static void update_wall_time(void)
struct timekeeper *tk = &shadow_timekeeper;
cycle_t offset;
int shift = 0, maxshift;
- unsigned int action;
+ unsigned int action = 0;
unsigned long flags;
raw_spin_lock_irqsave(&timekeeper_lock, flags);
@@ -1404,7 +1404,7 @@ static void update_wall_time(void)
maxshift = (64 - (ilog2(ntp_tick_length())+1)) - 1;
shift = min(shift, maxshift);
while (offset >= tk->cycle_interval) {
- offset = logarithmic_accumulation(tk, offset, shift);
+ offset = logarithmic_accumulation(tk, offset, shift, &action);
if (offset < tk->cycle_interval<<shift)
shift--;
}
@@ -1422,7 +1422,7 @@ static void update_wall_time(void)
* Finally, make sure that after the rounding
* xtime_nsec isn't larger than NSEC_PER_SEC
*/
- action = accumulate_nsecs_to_secs(tk);
+ action |= accumulate_nsecs_to_secs(tk);
write_seqcount_begin(&timekeeper_seq);
/* Update clock->cycle_last with the new value */
--
1.8.3.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [Xen-devel] [RFC][PATCH 3/3] timekeeping: Fix potential lost pv notification of time change
2013-12-10 5:09 ` [RFC][PATCH 3/3] timekeeping: Fix potential lost pv notification of time change John Stultz
@ 2013-12-10 8:13 ` Jan Beulich
2013-12-10 22:30 ` John Stultz
0 siblings, 1 reply; 5+ messages in thread
From: Jan Beulich @ 2013-12-10 8:13 UTC (permalink / raw)
To: John Stultz
Cc: David Vrabel, Richard Cochran, Ingo Molnar, Thomas Gleixner,
xen-devel, Prarit Bhargava, LKML, stable
>>> On 10.12.13 at 06:09, John Stultz <john.stultz@linaro.org> wrote:
> static cycle_t logarithmic_accumulation(struct timekeeper *tk, cycle_t offset,
> - u32 shift)
> + u32 shift, int *action)
With plain int used here, ...
> @@ -1369,7 +1369,7 @@ static void update_wall_time(void)
> struct timekeeper *tk = &shadow_timekeeper;
> cycle_t offset;
> int shift = 0, maxshift;
> - unsigned int action;
> + unsigned int action = 0;
... and unsigned int used here, ...
> @@ -1404,7 +1404,7 @@ static void update_wall_time(void)
> maxshift = (64 - (ilog2(ntp_tick_length())+1)) - 1;
> shift = min(shift, maxshift);
> while (offset >= tk->cycle_interval) {
> - offset = logarithmic_accumulation(tk, offset, shift);
> + offset = logarithmic_accumulation(tk, offset, shift, &action);
... does this compile without warning for you?
Jan
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Xen-devel] [RFC][PATCH 3/3] timekeeping: Fix potential lost pv notification of time change
2013-12-10 8:13 ` [Xen-devel] " Jan Beulich
@ 2013-12-10 22:30 ` John Stultz
0 siblings, 0 replies; 5+ messages in thread
From: John Stultz @ 2013-12-10 22:30 UTC (permalink / raw)
To: Jan Beulich
Cc: David Vrabel, Richard Cochran, Ingo Molnar, Thomas Gleixner,
xen-devel, Prarit Bhargava, LKML, stable
On 12/10/2013 12:13 AM, Jan Beulich wrote:
>>>> On 10.12.13 at 06:09, John Stultz <john.stultz@linaro.org> wrote:
>> static cycle_t logarithmic_accumulation(struct timekeeper *tk, cycle_t offset,
>> - u32 shift)
>> + u32 shift, int *action)
> With plain int used here, ...
>
>> @@ -1369,7 +1369,7 @@ static void update_wall_time(void)
>> struct timekeeper *tk = &shadow_timekeeper;
>> cycle_t offset;
>> int shift = 0, maxshift;
>> - unsigned int action;
>> + unsigned int action = 0;
> ... and unsigned int used here, ...
>
>> @@ -1404,7 +1404,7 @@ static void update_wall_time(void)
>> maxshift = (64 - (ilog2(ntp_tick_length())+1)) - 1;
>> shift = min(shift, maxshift);
>> while (offset >= tk->cycle_interval) {
>> - offset = logarithmic_accumulation(tk, offset, shift);
>> + offset = logarithmic_accumulation(tk, offset, shift, &action);
> ... does this compile without warning for you?
It does compile without a warning, but I'll fix it none the less!
Thanks for pointing this out!
-john
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2013-12-10 22:30 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <1386652197-7035-1-git-send-email-john.stultz@linaro.org>
2013-12-10 5:09 ` [RFC][PATCH 1/3] timekeeping: Fix lost updates to tai adjustment John Stultz
2013-12-10 5:09 ` [RFC][PATCH 2/3] timekeeping: Fix missing timekeeping_update in suspend path John Stultz
2013-12-10 5:09 ` [RFC][PATCH 3/3] timekeeping: Fix potential lost pv notification of time change John Stultz
2013-12-10 8:13 ` [Xen-devel] " Jan Beulich
2013-12-10 22:30 ` John Stultz
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).