Messages in this thread Patch in this message | | | Date | Thu, 21 Aug 2008 05:07:05 +0200 (CEST) | From | Roman Zippel <> | Subject | Re: [PATCH] fix adjtimex() freq return error |
| |
Hi,
On Tue, 19 Aug 2008, Andrew Morton wrote:
> This fix caused Roman's > ntp-fix-adj_offset_ss_read-bug-and-do_adjtimex-cleanup.patch (which I > have queued for when Thomas wakes up) to toss a reject, but fixing that > seemed pretty simple. I think. The scripts/kconfig/conf segfaults are > being a bit of a PITA at present.
Below is a better patch on top of the above patch, note that this not a bug fix and thus not an issue for stable.
bye, Roman
[PATCH] improve adjtimex frequency rounding
Change PPM_SCALE_INV_SHIFT so that it doesn't throw away any input bits (19 is the amount of the factor 2 in PPM_SCALE), the output frequency can then be calculated back to its input value, as the inverse divide produce a slightly larger value, which is then correctly rounded by the final shift.
Signed-off-by: Roman Zippel <zippel@linux-m68k.org>
--- include/linux/timex.h | 2 +- kernel/time/ntp.c | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-)
Index: linux-2.6-mm/include/linux/timex.h =================================================================== --- linux-2.6-mm.orig/include/linux/timex.h +++ linux-2.6-mm/include/linux/timex.h @@ -82,7 +82,7 @@ */ #define SHIFT_USEC 16 /* frequency offset scale (shift) */ #define PPM_SCALE (NSEC_PER_USEC << (NTP_SCALE_SHIFT - SHIFT_USEC)) -#define PPM_SCALE_INV_SHIFT 20 +#define PPM_SCALE_INV_SHIFT 19 #define PPM_SCALE_INV ((1ll << (PPM_SCALE_INV_SHIFT + NTP_SCALE_SHIFT)) / \ PPM_SCALE + 1) Index: linux-2.6-mm/kernel/time/ntp.c =================================================================== --- linux-2.6-mm.orig/kernel/time/ntp.c +++ linux-2.6-mm/kernel/time/ntp.c @@ -402,9 +402,8 @@ 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, - NTP_SCALE_SHIFT); + txc->freq = shift_right((time_freq >> PPM_SCALE_INV_SHIFT) * + (s64)PPM_SCALE_INV, NTP_SCALE_SHIFT); txc->maxerror = time_maxerror; txc->esterror = time_esterror; txc->status = time_status;
| |