Re: How is Code in do_sys_settimeofday() safe in case of SMP and Nest Kernel Path?



On Sun, 1 Oct 2006, Dong Feng wrote:

--- kernel/time.c.orig 2006-09-30 23:21:29.000000000 +0800
+++ kernel/time.c 2006-09-30 23:38:18.000000000 +0800
@@ -107,7 +107,16 @@ asmlinkage long sys_gettimeofday(struct
return -EFAULT;
}
if (unlikely(tz != NULL)) {
- if (copy_to_user(tz, &sys_tz, sizeof(sys_tz)))
+ struct timezone ktz;
+ unsigned long seq;
+
+ do {
+ seq = read_seqbegin(&xtime_lock);
+ ktz.tz_minuteswest = sys_tz.tz_minuteswest;
+ ktz.tz_dsttime = sys_tz.tz_dsttime;
+ } while (unlikely(read_seqretry(&xtime_lock, seq)));
+
+ if (copy_to_user(tz, &ktz, sizeof(ktz)))
return -EFAULT;

I really hate adding overhead to gettimeofday() and we would have to take
the seqlock in all places when we reference tz. Maybe we can tolerate the
resulting race?

If we assume word size transfers then we only have an issue on 32 bit
platforms. The result of the race would be that tz_minuteswest and
tz_dsttime disagree. So we may get daylight savings time wrong.
But then we are already changing the timezone and are potentially warping time.
gettimofday may be unstable anyways. So it may be okay to leave the race
in. Just add some comments explaining the situation.
-
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/



Relevant Pages

  • Re: Possible bug from kernel 2.6.22 and above, 2.6.24-rc4
    ... this does not take the overhead of gettimeofday into account - which overhead can easily reach 10 usecs. ... I first call refer subroutine which actually establishes the elapsed time (reference time) for non-synchronized delayusing the gettimeofday. ... The results of pthread_sync is the same as the non-patched 2.6.21 kernel. ...
    (Linux-Kernel)
  • Re: How is Code in do_sys_settimeofday() safe in case of SMP and Nest Kernel Path?
    ... I really hate adding overhead to gettimeofday() and we would have to take the seqlock in all places when we reference tz. ... The result of the race would be that tz_minuteswest and tz_dsttime disagree. ... But then we are already changing the timezone and are potentially warping time. ... Send instant messages to your online friends http://au.messenger.yahoo.com - ...
    (Linux-Kernel)
  • Re: Possible bug from kernel 2.6.22 and above, 2.6.24-rc4
    ... Could you try to eliminate the gettimeofday overhead from ... reference time from the elapsed time with introduced synchronization. ... The effect of gettimeofdayshould be minimal if the time difference ...
    (Linux-Kernel)
  • Re: Possible bug from kernel 2.6.22 and above, 2.6.24-rc4
    ... this does not take the overhead of gettimeofday into account - which overhead can easily reach 10 usecs. ... I first call refer subroutine which actually establishes the elapsed time (reference time) for non-synchronized delayusing the gettimeofday. ... Then each synchronization overhead value is obtained by subtracting the reference time from the elapsed time with introduced synchronization. ...
    (Linux-Kernel)
  • Re: benchmark
    ... for Pentium D 2.8Ghz. ... May be, a netgraph node? ... I don't like iperf for gettimeofday() overhead. ...
    (freebsd-stable)