[RT] fix delay in do_vgettimeofday() in arch/x86_64/kernel/vsyscall.c

From: Serge Belyshev
Date: Fri Dec 09 2005 - 14:41:23 EST




There are occasional very very long (30..60 sec) delays happening when calling
gettimeofday() vsyscall on x86_64 with 2.6.14-rt22 kernel.

These delays come from while() looping over invalid data that are
going to be discarded by seqlock.



arch/x86_64/kernel/vsyscall.c | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)

Index: linux/arch/x86_64/kernel/vsyscall.c
===================================================================
--- linux.orig/arch/x86_64/kernel/vsyscall.c
+++ linux/arch/x86_64/kernel/vsyscall.c
@@ -111,14 +111,15 @@ static force_inline void do_vgettimeofda

/* add nsec offset to wall_time_tv */
*tv = __vsyscall_gtod_data.wall_time_tv;
- do_div(nsec_delta, NSEC_PER_USEC);
- tv->tv_usec += (unsigned long) nsec_delta;
-
- while (tv->tv_usec > USEC_PER_SEC) {
- tv->tv_sec += 1;
- tv->tv_usec -= USEC_PER_SEC;
- }
} while (read_seqretry(&__vsyscall_gtod_lock, seq));
+
+ do_div(nsec_delta, NSEC_PER_USEC);
+ tv->tv_usec += (unsigned long) nsec_delta;
+
+ while (tv->tv_usec > USEC_PER_SEC) {
+ tv->tv_sec += 1;
+ tv->tv_usec -= USEC_PER_SEC;
+ }
}

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