From: george anzinger <george@mvista.com>
To: Tim Schmielau <tim@physik3.uni-rostock.de>
Cc: Andrew Morton <akpm@digeo.com>, lkml <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] fix nanosleep() granularity bumps
Date: Wed, 19 Mar 2003 13:30:22 -0800 [thread overview]
Message-ID: <3E78E16E.7090602@mvista.com> (raw)
In-Reply-To: <Pine.LNX.4.33.0303191030540.346-100000@gans.physik3.uni-rostock.de>
[-- Attachment #1: Type: text/plain, Size: 2311 bytes --]
I found a problem with the last version. The attached is for
2.5.65-1.1171 (i.e. after the other post 2.5.65 changes). The bug is
fixed, and the code even simpler here.
The problem in the prior patch was that cascade should return:
(index +1) &... not index &...
Here I changed the call to cascade() to expect "index" back so it
checks for 0 instead of 1. Nice and simple.
-g
Tim Schmielau wrote:
> On Wed, 19 Mar 2003, george anzinger wrote:
>
>
>>In this case, the simple fix is to bump the
>>base->timer_jiffies at the beginning of the loop rather than the end.
>> This would cause the new timer to be put in the next jiffie instead
>>of the current one AND it is free!
>
>
> Yes, doing it this way looks correct to me.
>
>
>>>No, with the current implementation we need
>>> #define INDEX(N) (base->timer_jiffies >> (TVR_BITS + N * TVN_BITS) +1) &
>>> TVN_MASK
>>>although I'd like to see that cleaned up.
>>
>>I tried with the +1 and boot hangs trying to set up networking. I
>>think the difference is that the init code is trying to set things up
>>the way they would look AFTER cascade executes and this is doing it
>>BEFORE the cascade call.
>
>
> With the above change, it should be correct without the +1
>
>
>>>Why 'jiffies -1'? This will just be made up for in the first
>>>timer interrupt, where timer_jiffies will get incremented twice.
>>
>>Again, I removed the -1 in the attached.
>
>
> If you really want to be conservative, we'd better start with
> INITIAL_JIFFIES. Should be the same anyways. But if not, we might lose a
> timer scheduled for INITIAL_JIFFIES (not that I think it's possible to
> insert one before timer initialisation in the first place :-)
> or even a timer cascade.
>
>
>>>Did you bother to test the patch? It doesn't even boot for me, and I don't
>>>see how it is supposed to.
>>>I'll look into it more closely in the evening. Have to go to work now.
>>
>>The old one ran on 2.5.64 but not 2.5.65 ??? I found and fixed a bug
>>(index needs to be caculated INSIDE the while loop) that seems to have
>>been the cause.
>
>
> Ok will test in the evening.
>
> Tim
>
>
--
George Anzinger george@mvista.com
High-res-timers: http://sourceforge.net/projects/high-res-timers/
Preemption patch: http://www.kernel.org/pub/linux/kernel/people/rml
[-- Attachment #2: hrtimers-run-2.5.65-1.1171.patch --]
[-- Type: text/plain, Size: 3304 bytes --]
diff -urP -I '\$Id:.*Exp \$' -X /usr/src/patch.exclude linux-2.5.65-1.1171-kb/kernel/timer.c linux/kernel/timer.c
--- linux-2.5.65-1.1171-kb/kernel/timer.c 2003-03-19 12:32:28.000000000 -0800
+++ linux/kernel/timer.c 2003-03-19 13:08:24.000000000 -0800
@@ -44,12 +44,10 @@
#define TVR_MASK (TVR_SIZE - 1)
typedef struct tvec_s {
- int index;
struct list_head vec[TVN_SIZE];
} tvec_t;
typedef struct tvec_root_s {
- int index;
struct list_head vec[TVR_SIZE];
} tvec_root_t;
@@ -134,7 +132,7 @@
* Can happen if you add a timer with expires == jiffies,
* or you set a timer to go off in the past
*/
- vec = base->tv1.vec + base->tv1.index;
+ vec = base->tv1.vec + (base->timer_jiffies & TVR_MASK);
} else if (idx <= 0xffffffffUL) {
int i = (expires >> (TVR_BITS + 3 * TVN_BITS)) & TVN_MASK;
vec = base->tv5.vec + i;
@@ -368,12 +366,12 @@
#endif
-static int cascade(tvec_base_t *base, tvec_t *tv)
+static int cascade(tvec_base_t *base, tvec_t *tv, int index)
{
/* cascade all the timers from tv up one level */
struct list_head *head, *curr;
- head = tv->vec + tv->index;
+ head = tv->vec + index;
curr = head->next;
/*
* We are removing _all_ timers from the list, so we don't have to
@@ -389,7 +387,7 @@
}
INIT_LIST_HEAD(head);
- return tv->index = (tv->index + 1) & TVN_MASK;
+ return index;
}
/***
@@ -399,6 +397,8 @@
* This function cascades all vectors and executes all expired timer
* vectors.
*/
+#define INDEX(N) (base->timer_jiffies >> (TVR_BITS + N * TVN_BITS)) & TVN_MASK
+
static inline void __run_timers(tvec_base_t *base)
{
struct timer_list *timer;
@@ -407,18 +407,19 @@
while (time_after_eq(jiffies, base->timer_jiffies)) {
LIST_HEAD(deferred_timers);
struct list_head *head;
-
+ int index = base->timer_jiffies & TVR_MASK;
+
/*
* Cascade timers:
*/
- if (!base->tv1.index &&
- (cascade(base, &base->tv2) == 1) &&
- (cascade(base, &base->tv3) == 1) &&
- cascade(base, &base->tv4) == 1)
- cascade(base, &base->tv5);
+ if (!index &&
+ (! cascade(base, &base->tv2, INDEX(0))) &&
+ (! cascade(base, &base->tv3, INDEX(1))) &&
+ ! cascade(base, &base->tv4, INDEX(2)))
+ cascade(base, &base->tv5, INDEX(3));
base->run_timer_list_running = &deferred_timers;
repeat:
- head = base->tv1.vec + base->tv1.index;
+ head = base->tv1.vec + index;
if (!list_empty(head)) {
void (*fn)(unsigned long);
unsigned long data;
@@ -437,7 +438,6 @@
}
base->run_timer_list_running = NULL;
++base->timer_jiffies;
- base->tv1.index = (base->tv1.index + 1) & TVR_MASK;
while (!list_empty(&deferred_timers)) {
timer = list_entry(deferred_timers.prev,
struct timer_list, entry);
@@ -1198,12 +1198,7 @@
for (j = 0; j < TVR_SIZE; j++)
INIT_LIST_HEAD(base->tv1.vec + j);
- base->timer_jiffies = INITIAL_JIFFIES;
- base->tv1.index = INITIAL_JIFFIES & TVR_MASK;
- base->tv2.index = (INITIAL_JIFFIES >> TVR_BITS) & TVN_MASK;
- base->tv3.index = (INITIAL_JIFFIES >> (TVR_BITS+TVN_BITS)) & TVN_MASK;
- base->tv4.index = (INITIAL_JIFFIES >> (TVR_BITS+2*TVN_BITS)) & TVN_MASK;
- base->tv5.index = (INITIAL_JIFFIES >> (TVR_BITS+3*TVN_BITS)) & TVN_MASK;
+ base->timer_jiffies = jiffies;
}
static int __devinit timer_cpu_notify(struct notifier_block *self,
next prev parent reply other threads:[~2003-03-19 21:20 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <Pine.LNX.4.33.0303181251130.28123-100000@gans.physik3.uni-rostock.de>
2003-03-18 20:26 ` [PATCH] fix nanosleep() granularity bumps Tim Schmielau
2003-03-19 2:08 ` george anzinger
2003-03-19 4:31 ` Andrew Morton
2003-03-19 2:37 ` george anzinger
2003-03-19 2:59 ` Andrew Morton
2003-03-19 7:51 ` Tim Schmielau
2003-03-19 8:35 ` george anzinger
2003-03-19 9:28 ` george anzinger
2003-03-19 9:40 ` Tim Schmielau
2003-03-19 21:30 ` george anzinger [this message]
[not found] ` <20030319155258.64cbc43d.akpm@digeo.com>
2003-03-19 22:25 ` [PATCH] Remove defered timer list in favor of moving the list time update george anzinger
2003-03-20 7:36 ` [PATCH] fix nanosleep() granularity bumps Tim Schmielau
2003-03-19 9:42 ` Andrew Morton
2003-03-19 18:08 ` george anzinger
2003-03-19 18:51 ` Andrew Morton
2003-03-19 20:29 ` george anzinger
2003-03-17 19:42 [BUG & WORKAROUND] nanosleep() granularity bumps up in 2.5.64 Tim Schmielau
2003-03-18 9:05 ` [PATCH] fix nanosleep() granularity bumps Tim Schmielau
2003-03-24 12:06 ` Finn Arne Gangstad
2003-03-24 12:10 ` Tim Schmielau
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=3E78E16E.7090602@mvista.com \
--to=george@mvista.com \
--cc=akpm@digeo.com \
--cc=linux-kernel@vger.kernel.org \
--cc=tim@physik3.uni-rostock.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 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.