All of lore.kernel.org
 help / color / mirror / Atom feed
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.