public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Andrew Morton <akpm@linux-foundation.org>
To: Chris Peterson <cpeterso@cpeterso.com>
Cc: linux-kernel@vger.kernel.org, tglx@linutronix.de
Subject: Re: [RFC] mod_timer() helper functions?
Date: Sun, 17 May 2009 01:03:47 -0700	[thread overview]
Message-ID: <20090517010347.f25843f9.akpm@linux-foundation.org> (raw)
In-Reply-To: <a24804730905170050m16bfb81cj6c9ee4c99ac9d08f@mail.gmail.com>

On Sun, 17 May 2009 00:50:55 -0700 Chris Peterson <cpeterso@cpeterso.com> wrote:

> >> Reviewing the kernel's nearly one-thousand calls to mod_timer(), there
> >> are three basic patterns:
> >>
> >> __* multi-second timeouts
> >> __* millisecond timeouts
> >> __* +1 jiffie ASAP events
> >>
> 
> Is there a functional difference between the following "expire this
> timer ASAP" statements?
> 
> mod_timer(timer, jiffies + 1); /* 48 uses */
> mod_timer(timer, jiffies); /* 44 uses */
> mod_timer(timer, jiffies - 1); /* 6 uses */

That's something which has always worried me.  Lots of code does:

	mod_timer(timer, jiffies + 1);

(for varying values of "1").  What happens if this thread of control
then gets stalled for a couple of jiffies.  Say it gets preempted or
there's a long interrupt or whatever.  So there's a several-jiffy
interval between the caller evaluating jiffies+1 and the entry to
mod_timer().


>From my reading, we'll hit

		int i;
		/* If the timeout is larger than 0xffffffff on 64-bit
		 * architectures then we use the maximum timeout:
		 */
		if (idx > 0xffffffffUL) {
			idx = 0xffffffffUL;
			expires = idx + base->timer_jiffies;
		}
		i = (expires >> (TVR_BITS + 3 * TVN_BITS)) & TVN_MASK;
		vec = base->tv5.vec + i;

and the timer gets scheduled at some time in the far-distant future!

But this is such a glaring and huge problem that surely it cannot
exist.  But I don't know why not.

If the bug _does_ exist then mod_timer(timer, jiffies - 1) will set the
timer to go off in the far future.  mod_timer(timer, jiffies) will
usually make it go off real soon now, but it's scary.  mod_timer(timer,
jiffies + 1) is safer, but still vulnerable.



  reply	other threads:[~2009-05-17  8:05 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-05-16  7:36 [RFC] mod_timer() helper functions? Chris Peterson
2009-05-17  6:03 ` Andrew Morton
2009-05-17  7:50   ` Chris Peterson
2009-05-17  8:03     ` Andrew Morton [this message]
2009-05-17 12:13       ` Thomas Gleixner
2009-05-18  7:14 ` Andi Kleen
2009-05-20  7:11   ` Chris Peterson
2009-05-20  8:14     ` Andi Kleen
2009-05-21  5:11       ` Chris Peterson

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=20090517010347.f25843f9.akpm@linux-foundation.org \
    --to=akpm@linux-foundation.org \
    --cc=cpeterso@cpeterso.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=tglx@linutronix.de \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox