From: George Anzinger <george@mvista.com>
To: lkml <linux-kernel@vger.kernel.org>, Andrew Morton <akpm@osdl.org>
Subject: [PATCH] fix normalize problem in posix timers.
Date: Thu, 28 Jul 2005 12:04:34 -0700 [thread overview]
Message-ID: <42E92C42.8000003@mvista.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 520 bytes --]
We found this (after a customer complained) and it is in the kernel.org
kernel. Seems that for CLOCK_MONOTONIC absolute timers and
clock_nanosleep calls both the request time and wall_to_monotonic are
subtracted prior to the normalize resulting in an overflow in the
existing normalize test. This causes the result to be shifted ~4
seconds ahead instead of ~2 seconds back in time. Patch is attached.
-
George Anzinger george@mvista.com
HRT (High-res-timers): http://sourceforge.net/projects/high-res-timers/
[-- Attachment #2: normalize.patch --]
[-- Type: text/plain, Size: 1528 bytes --]
Source: MontaVista Software, Inc. George Anzinger <george@mvista.com>
Type: Defect Fix
Description:
The normalize code in posix-timers.c fails when the tv_nsec
member is ~1.2 seconds negative. This can happen on absolute
timers (and clock_nanosleeps) requested on CLOCK_MONOTONIC
(both the request time and wall_to_monotonic are subtracted
resulting in the possibility of a number close to -2 seconds.)
This fix uses the set_normalized_timespec() (which does not
have an overflow problem) to fix the problem and as a side
effect makes the code cleaner.
Signed-off-by: George Anzinger <george@mvista.com>
posix-timers.c | 17 +++--------------
1 files changed, 3 insertions(+), 14 deletions(-)
Index: linux-2.6.13-rc/kernel/posix-timers.c
===================================================================
--- linux-2.6.13-rc.orig/kernel/posix-timers.c
+++ linux-2.6.13-rc/kernel/posix-timers.c
@@ -915,21 +915,10 @@ static int adjust_abs_time(struct k_cloc
jiffies_64_f = get_jiffies_64();
}
/*
- * Take away now to get delta
+ * Take away now to get delta and normalize
*/
- oc.tv_sec -= now.tv_sec;
- oc.tv_nsec -= now.tv_nsec;
- /*
- * Normalize...
- */
- while ((oc.tv_nsec - NSEC_PER_SEC) >= 0) {
- oc.tv_nsec -= NSEC_PER_SEC;
- oc.tv_sec++;
- }
- while ((oc.tv_nsec) < 0) {
- oc.tv_nsec += NSEC_PER_SEC;
- oc.tv_sec--;
- }
+ set_normalized_timespec(&oc, oc.tv_sec - now.tv_sec,
+ oc.tv_nsec - now.tv_nsec);
}else{
jiffies_64_f = get_jiffies_64();
}
reply other threads:[~2005-07-28 19:09 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=42E92C42.8000003@mvista.com \
--to=george@mvista.com \
--cc=akpm@osdl.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.