Messages in this thread Patch in this message | | | Date | Fri, 11 Nov 2005 14:25:29 -0800 | From | George Anzinger <> | Subject | Re: [PATCH] Timespec normalize off by one errors |
| |
George Anzinger wrote: > Found three places were we use ">" instead of ">=". > Lets just try this again. -- George Anzinger george@mvista.com HRT (High-res-timers): http://sourceforge.net/projects/high-res-timers/ Source: MontaVista Software, Inc. Type: Defect Fix
It would appear that the timespec normalize code has an off by one error. Found in three places.
Signed-off-by: George Anzinger<george@mvista.com>
include/linux/time.h | 2 +- kernel/posix-timers.c | 10 +++------- 2 files changed, 4 insertions(+), 8 deletions(-)
Index: linux-2.6.15-rc/include/linux/time.h =================================================================== --- linux-2.6.15-rc.orig/include/linux/time.h +++ linux-2.6.15-rc/include/linux/time.h @@ -101,7 +101,7 @@ extern struct timespec timespec_trunc(st static inline void set_normalized_timespec (struct timespec *ts, time_t sec, long nsec) { - while (nsec > NSEC_PER_SEC) { + while (nsec >= NSEC_PER_SEC) { nsec -= NSEC_PER_SEC; ++sec; } Index: linux-2.6.15-rc/kernel/posix-timers.c =================================================================== --- linux-2.6.15-rc.orig/kernel/posix-timers.c +++ linux-2.6.15-rc/kernel/posix-timers.c @@ -270,7 +270,7 @@ static void tstojiffie(struct timespec * long sec = tp->tv_sec; long nsec = tp->tv_nsec + res - 1; - if (nsec > NSEC_PER_SEC) { + if (nsec >= NSEC_PER_SEC) { sec++; nsec -= NSEC_PER_SEC; } @@ -1209,13 +1209,9 @@ static int do_posix_clock_monotonic_get( do_posix_clock_monotonic_gettime_parts(tp, &wall_to_mono); - tp->tv_sec += wall_to_mono.tv_sec; - tp->tv_nsec += wall_to_mono.tv_nsec; + set_normalized_timespec(tp, tp->tv_sec + wall_to_mono.tv_sec, + tp->tv_nsec + wall_to_mono.tv_nsec); - if ((tp->tv_nsec - NSEC_PER_SEC) > 0) { - tp->tv_nsec -= NSEC_PER_SEC; - tp->tv_sec++; - } return 0; } | |