From: Mike Galbraith <efault@gmx.de>
To: Brian Rogers <brian@xyzw.org>
Cc: linux-kernel@vger.kernel.org, Ingo Molnar <mingo@elte.hu>
Subject: Re: [BUG] How to get real-time priority using idle priority
Date: Mon, 12 Jan 2009 14:03:53 +0100 [thread overview]
Message-ID: <1231765433.5789.35.camel@marge.simson.net> (raw)
In-Reply-To: <1231736941.6003.7.camel@marge.simson.net>
On Mon, 2009-01-12 at 06:09 +0100, Mike Galbraith wrote:
> On Sun, 2009-01-11 at 02:58 -0800, Brian Rogers wrote:
> > The attached program gives itself idle priority, then forks off two
> > child processes that execute a busy loop. The result is that sometimes
> > all other processes stop and the whole system freezes until this program
> > exits. An affected system will respond to pings, but X freezes, the
> > cursor won't move, SSH sessions won't respond or echo characters back,
> > and not even a text console will budge. Hitting Alt-SysRq-N twice can
> > sometimes unfreeze the system, or you can just wait for the program to exit.
> >
> > This bug is in 2.6.29-rc1. I have also observed this bug in 2.6.28 on
> > two dual-core systems, an Athlon X2 desktop and a Core 2 Duo laptop.
> > Both are running a 64-bit system. Using i386 and amd64 Ubuntu Jaunty
> > daily builds with a 2.6.28 kernel, I found I could reproduce the problem
> > with the 64-bit kernel, but not the 32-bit kernel. Since that might just
> > be due to a difference in the kernel configurations, I'm attaching the
> > kernel configuration on which I know this problem can be triggered.
> >
> > It may take a couple-dozen runs of this program for the freeze to occur.
> > Just hit control-C and re-run the program until it happens. When it does
> > freeze, the effect is immediate, so there's no chance you'll interrupt
> > the program too soon.
>
> Hi,
>
> I haven't been able to reproduce complete hangs, but with your proggy
> adapted to my quad, _and_ the addition of a SCHED_NORMAL hog, I can
> reproduce some very bad interactivity, including massive character
> repeats while attempting to type, and general "lurchiness" (_bad_ wakeup
> latency). I'll poke it with a sharp stick or two.
Would you mind trying the below?
Impact: fix latency issues when SCHED_IDLE tasks are queued.
Exclude SCHED_IDLE tasks from wakeup preemption, ensure that same will
always be wakeup preempted, and exclude them from being buddies so they
will only be selected via their vruntime.
Signed-off-by: Mike Galbraith <efault@gmx.de>
diff --git a/kernel/sched.c b/kernel/sched.c
index deb5ac8..5582065 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -1888,8 +1888,7 @@ void set_task_cpu(struct task_struct *p, unsigned int new_cpu)
schedstat_inc(p, se.nr_forced2_migrations);
}
#endif
- p->se.vruntime -= old_cfsrq->min_vruntime -
- new_cfsrq->min_vruntime;
+ p->se.vruntime = new_cfsrq->min_vruntime;
__set_task_cpu(p, new_cpu);
}
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c
index 8e1352c..500ed14 100644
--- a/kernel/sched_fair.c
+++ b/kernel/sched_fair.c
@@ -1340,14 +1340,18 @@ wakeup_preempt_entity(struct sched_entity *curr, struct sched_entity *se)
static void set_last_buddy(struct sched_entity *se)
{
- for_each_sched_entity(se)
- cfs_rq_of(se)->last = se;
+ for_each_sched_entity(se) {
+ if (likely(task_of(se)->policy != SCHED_IDLE))
+ cfs_rq_of(se)->last = se;
+ }
}
static void set_next_buddy(struct sched_entity *se)
{
- for_each_sched_entity(se)
- cfs_rq_of(se)->next = se;
+ for_each_sched_entity(se) {
+ if (likely(task_of(se)->policy != SCHED_IDLE))
+ cfs_rq_of(se)->next = se;
+ }
}
/*
@@ -1393,12 +1397,18 @@ static void check_preempt_wakeup(struct rq *rq, struct task_struct *p, int sync)
return;
/*
- * Batch tasks do not preempt (their preemption is driven by
+ * Batch and idle tasks do not preempt (their preemption is driven by
* the tick):
*/
- if (unlikely(p->policy == SCHED_BATCH))
+ if (unlikely(p->policy != SCHED_NORMAL))
return;
+ /* Idle tasks are by definition preempted by everybody. */
+ if (unlikely(curr->policy == SCHED_IDLE)) {
+ resched_task(curr);
+ return;
+ }
+
if (!sched_feat(WAKEUP_PREEMPT))
return;
next prev parent reply other threads:[~2009-01-12 13:04 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-01-11 10:58 [BUG] How to get real-time priority using idle priority Brian Rogers
2009-01-12 5:09 ` Mike Galbraith
2009-01-12 13:03 ` Mike Galbraith [this message]
2009-01-12 13:14 ` Ingo Molnar
2009-01-12 15:23 ` Mike Galbraith
2009-01-12 15:24 ` Ingo Molnar
2009-01-13 1:05 ` Brian Rogers
2009-01-13 2:58 ` Mike Galbraith
2009-01-14 5:13 ` Mike Galbraith
2009-01-14 5:31 ` Ingo Molnar
2009-01-14 6:02 ` Mike Galbraith
2009-01-14 7:35 ` Ingo Molnar
2009-01-15 9:28 ` Mike Galbraith
2009-01-15 10:14 ` Peter Zijlstra
2009-01-15 10:30 ` Mike Galbraith
2009-01-15 11:37 ` Mike Galbraith
2009-01-15 11:41 ` Peter Zijlstra
2009-01-15 12:54 ` Ingo Molnar
2009-01-15 13:05 ` Peter Zijlstra
2009-01-15 13:15 ` Ingo Molnar
2009-01-15 13:16 ` Peter Zijlstra
2009-01-15 12:07 ` Brian Rogers
2009-01-12 20:46 ` [patch take 2] " Mike Galbraith
2009-01-12 20:50 ` Mike Galbraith
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=1231765433.5789.35.camel@marge.simson.net \
--to=efault@gmx.de \
--cc=brian@xyzw.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
/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.