[ 079/108] timekeeping: Fix leapsecond triggered load spike issue

2012-07-22 Thread Ben Hutchings
3.2-stable review patch.  If anyone has any objections, please let me know.

--

From: John Stultz 

This is a backport of 4873fa070ae84a4115f0b3c9dfabc224f1bc7c51

The timekeeping code misses an update of the hrtimer subsystem after a
leap second happened. Due to that timers based on CLOCK_REALTIME are
either expiring a second early or late depending on whether a leap
second has been inserted or deleted until an operation is initiated
which causes that update. Unless the update happens by some other
means this discrepancy between the timekeeping and the hrtimer data
stays forever and timers are expired either early or late.

The reported immediate workaround - $ data -s "`date`" - is causing a
call to clock_was_set() which updates the hrtimer data structures.
See: http://www.sheeri.com/content/mysql-and-leap-second-high-cpu-and-fix

Add the missing clock_was_set() call to update_wall_time() in case of
a leap second event. The actual update is deferred to softirq context
as the necessary smp function call cannot be invoked from hard
interrupt context.

Signed-off-by: John Stultz 
Reported-by: Jan Engelhardt 
Reviewed-by: Ingo Molnar 
Acked-by: Peter Zijlstra 
Acked-by: Prarit Bhargava 
Link: 
http://lkml.kernel.org/r/1341960205-56738-3-git-send-email-johns...@us.ibm.com
Signed-off-by: Thomas Gleixner 
Cc: Prarit Bhargava 
Cc: Thomas Gleixner 
Cc: Linux Kernel 
Signed-off-by: John Stultz 
Signed-off-by: Ben Hutchings 
---
 kernel/time/timekeeping.c |4 
 1 file changed, 4 insertions(+)

diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
index 5d55185..8958ad7 100644
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -941,6 +941,8 @@ static cycle_t logarithmic_accumulation(cycle_t offset, int 
shift)
leap = second_overflow(xtime.tv_sec);
xtime.tv_sec += leap;
wall_to_monotonic.tv_sec -= leap;
+   if (leap)
+   clock_was_set_delayed();
}
 
/* Accumulate raw time */
@@ -1052,6 +1054,8 @@ static void update_wall_time(void)
leap = second_overflow(xtime.tv_sec);
xtime.tv_sec += leap;
wall_to_monotonic.tv_sec -= leap;
+   if (leap)
+   clock_was_set_delayed();
}
 
timekeeping_update(false);


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[ 079/108] timekeeping: Fix leapsecond triggered load spike issue

2012-07-22 Thread Ben Hutchings
3.2-stable review patch.  If anyone has any objections, please let me know.

--

From: John Stultz johns...@us.ibm.com

This is a backport of 4873fa070ae84a4115f0b3c9dfabc224f1bc7c51

The timekeeping code misses an update of the hrtimer subsystem after a
leap second happened. Due to that timers based on CLOCK_REALTIME are
either expiring a second early or late depending on whether a leap
second has been inserted or deleted until an operation is initiated
which causes that update. Unless the update happens by some other
means this discrepancy between the timekeeping and the hrtimer data
stays forever and timers are expired either early or late.

The reported immediate workaround - $ data -s `date` - is causing a
call to clock_was_set() which updates the hrtimer data structures.
See: http://www.sheeri.com/content/mysql-and-leap-second-high-cpu-and-fix

Add the missing clock_was_set() call to update_wall_time() in case of
a leap second event. The actual update is deferred to softirq context
as the necessary smp function call cannot be invoked from hard
interrupt context.

Signed-off-by: John Stultz johns...@us.ibm.com
Reported-by: Jan Engelhardt jeng...@inai.de
Reviewed-by: Ingo Molnar mi...@kernel.org
Acked-by: Peter Zijlstra a.p.zijls...@chello.nl
Acked-by: Prarit Bhargava pra...@redhat.com
Link: 
http://lkml.kernel.org/r/1341960205-56738-3-git-send-email-johns...@us.ibm.com
Signed-off-by: Thomas Gleixner t...@linutronix.de
Cc: Prarit Bhargava pra...@redhat.com
Cc: Thomas Gleixner t...@linutronix.de
Cc: Linux Kernel linux-kernel@vger.kernel.org
Signed-off-by: John Stultz johns...@us.ibm.com
Signed-off-by: Ben Hutchings b...@decadent.org.uk
---
 kernel/time/timekeeping.c |4 
 1 file changed, 4 insertions(+)

diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
index 5d55185..8958ad7 100644
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -941,6 +941,8 @@ static cycle_t logarithmic_accumulation(cycle_t offset, int 
shift)
leap = second_overflow(xtime.tv_sec);
xtime.tv_sec += leap;
wall_to_monotonic.tv_sec -= leap;
+   if (leap)
+   clock_was_set_delayed();
}
 
/* Accumulate raw time */
@@ -1052,6 +1054,8 @@ static void update_wall_time(void)
leap = second_overflow(xtime.tv_sec);
xtime.tv_sec += leap;
wall_to_monotonic.tv_sec -= leap;
+   if (leap)
+   clock_was_set_delayed();
}
 
timekeeping_update(false);


--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/