20 Aug 04:27
[PATCH] fix adjtimex() freq return error
From: john stultz <johnstul <at> us.ibm.com>
Subject: [PATCH] fix adjtimex() freq return error
Newsgroups: gmane.linux.kernel
Date: 2008-08-20 02:29:06 GMT
Subject: [PATCH] fix adjtimex() freq return error
Newsgroups: gmane.linux.kernel
Date: 2008-08-20 02:29:06 GMT
Martin Ziegler reported a bug in adjtimex(), where odd positive frequencies are reduced by 1 while negative values are correct. See http://bugzilla.kernel.org/show_bug.cgi?id=11370 for details The issue was introduced in the following commit that increased time_freq to a 64bit value and increased its resolution: http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=074b3b87941c99bc0ce35385b5817924b1ed0c23;hp=eea83d896e318bda54be2d2770d2c5d6668d11db The problem is how we convert from our internal high res value back to userland. Instead of dividing, we shift, then mult, then shift again, causing the slight error seen in the bug. I don't think adjtimex() is a terribly hot path, so this patch simply uses div_s64() to convert back to the external resolution and removes the unused shift defines to resolve the issue. Signed-off-by: John Stultz <johnstul <at> us.ibm.com> Index: 2.6-git/kernel/time/ntp.c =================================================================== --- 2.6-git.orig/kernel/time/ntp.c +++ 2.6-git/kernel/time/ntp.c @@ -402,9 +402,7 @@ int do_adjtimex(struct timex *txc) if (!(time_status & STA_NANO)) txc->offset /= NSEC_PER_USEC; } - txc->freq = shift_right((s32)(time_freq >> PPM_SCALE_INV_SHIFT) * - (s64)PPM_SCALE_INV,(Continue reading)
RSS Feed