commit 336ae1180df5f69b9e0fb6561bec01c5f64361cf ARM: sched_clock: Load cycle count after epoch stabilizes This looks applicable to stable-3.10, which load cycle count after epoch stabilizes, The function was moved from arch/arm/kernel/sched_clock.c to kernel/time/sched_clock.c because of upgrading version. The commit id is 336ae1180df5f69b9e0fb6561bec01c5f64361cf in 3.18. I designed a test case for recurring this bug as follows: CPU0 CPU1 ---- ---- g_counter = 1; ....... cyc = read_sched_clock() cyc_to_sched_clock() update_sched_clock() ... cd.epoch_cyc = cyc; g_counter = 2; epoch_cyc = cd.epoch_cyc; if(g_counter == 2) printk("error!\n"); g_counter = 1; ... epoch_ns + cyc_to_ns((cyc - epoch_cyc) The bug will be proven to exist if the strings "error!" happen on screen. I find that "error!" happen firstly on screen in thirty hours. The patch for test is as follows: --- a/sched_clock.c 2014-11-25 08:24:15.000000000 +0000 +++ b/sched_clock.c 2014-12-01 08:46:32.000000000 +0000 @@ -15,7 +15,7 @@ #include <linux/timer.h> #include <asm/sched_clock.h> - +unsigned int g_counter = 0; struct clock_data { u64 epoch_ns; u32 epoch_cyc; @@ -68,11 +68,14 @@ */ do { epoch_cyc = cd.epoch_cyc; + if(g_counter == 2) + printk("error!\n"); + g_counter = 1; smp_rmb(); epoch_ns = cd.epoch_ns; smp_rmb(); } while (epoch_cyc != cd.epoch_cyc_copy); - + return epoch_ns + cyc_to_ns((cyc - epoch_cyc) & mask, cd.mult, cd.shift); } @@ -99,6 +102,7 @@ cd.epoch_ns = ns; smp_wmb(); cd.epoch_cyc = cyc; + g_counter = 2; raw_local_irq_restore(flags); } @@ -168,6 +172,7 @@ static unsigned long long notrace sched_clock_32(void) { u32 cyc = read_sched_clock(); + g_counter = 1; return cyc_to_sched_clock(cyc, sched_clock_mask); } Stephen Boyd (1): ARM: sched_clock: Load cycle count after epoch stabilizes arch/arm/kernel/sched_clock.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html