From 594884956eebb06dbe2e3b07dbf81446190203a7 Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Wed, 22 Oct 2003 11:49:30 -0700 Subject: [PATCH] [SPARC]: Fix do_gettimeofday() as per cset 1.1347.1.17 --- arch/sparc/kernel/pcic.c | 9 +++++++++ arch/sparc/kernel/time.c | 9 +++++++++ arch/sparc64/kernel/time.c | 9 +++++++++ 3 files changed, 27 insertions(+) diff --git a/arch/sparc/kernel/pcic.c b/arch/sparc/kernel/pcic.c index 25e98c9d24793..3bb97b4771bdc 100644 --- a/arch/sparc/kernel/pcic.c +++ b/arch/sparc/kernel/pcic.c @@ -785,6 +785,15 @@ static void pci_do_gettimeofday(struct timeval *tv) if (lost) usec += lost * (1000000 / HZ); } + + /* + * If time_adjust is negative then NTP is slowing the clock + * so make sure not to go into next possible interval. + * Better to lose some accuracy than have time go backwards.. + */ + if (unlikely(time_adjust < 0) && usec > tickadj) + usec = tickadj; + sec = xtime.tv_sec; usec += (xtime.tv_nsec / 1000); } while (read_seqretry_irqrestore(&xtime_lock, seq, flags)); diff --git a/arch/sparc/kernel/time.c b/arch/sparc/kernel/time.c index 5549a6fd172bf..5566ad8a751ba 100644 --- a/arch/sparc/kernel/time.c +++ b/arch/sparc/kernel/time.c @@ -490,6 +490,15 @@ void do_gettimeofday(struct timeval *tv) if (lost) usec += lost * (1000000 / HZ); } + + /* + * If time_adjust is negative then NTP is slowing the clock + * so make sure not to go into next possible interval. + * Better to lose some accuracy than have time go backwards.. + */ + if (unlikely(time_adjust < 0) && usec > tickadj) + usec = tickadj; + sec = xtime.tv_sec; usec += (xtime.tv_nsec / 1000); } while (read_seqretry_irqrestore(&xtime_lock, seq, flags)); diff --git a/arch/sparc64/kernel/time.c b/arch/sparc64/kernel/time.c index 4871140c13ed5..d06bcc0562f13 100644 --- a/arch/sparc64/kernel/time.c +++ b/arch/sparc64/kernel/time.c @@ -1149,6 +1149,15 @@ void do_gettimeofday(struct timeval *tv) if (lost) usec += lost * (1000000 / HZ); } + + /* + * If time_adjust is negative then NTP is slowing the clock + * so make sure not to go into next possible interval. + * Better to lose some accuracy than have time go backwards.. + */ + if (unlikely(time_adjust < 0) && usec > tickadj) + usec = tickadj; + sec = xtime.tv_sec; usec += (xtime.tv_nsec / 1000); } while (read_seqretry_irqrestore(&xtime_lock, seq, flags)); -- 2.53.0