From 2eb2d932e894c03b436e409001009be5eebbeeee Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Sat, 19 Apr 2008 19:45:00 +0200 Subject: [PATCH] --- yaml --- r: 91097 b: refs/heads/master c: 58d6c2d72f8628f39e8689fbde8aa177fcf00a37 h: refs/heads/master i: 91095: 86774383597ebaebe21c81ef1815c1f02f6418f1 v: v3 --- [refs] | 2 +- trunk/include/linux/sched.h | 1 + trunk/kernel/sched_rt.c | 27 +++++++++++---------------- 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/[refs] b/[refs] index a51972ae55b7..84b7ef309455 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: d19ca30874f2ad343d054e0b5c0576744afeecd4 +refs/heads/master: 58d6c2d72f8628f39e8689fbde8aa177fcf00a37 diff --git a/trunk/include/linux/sched.h b/trunk/include/linux/sched.h index 0a32059e6ed4..887f5db8942d 100644 --- a/trunk/include/linux/sched.h +++ b/trunk/include/linux/sched.h @@ -1005,6 +1005,7 @@ struct sched_rt_entity { unsigned long timeout; int nr_cpus_allowed; + struct sched_rt_entity *back; #ifdef CONFIG_RT_GROUP_SCHED struct sched_rt_entity *parent; /* rq on which this entity is (to be) queued: */ diff --git a/trunk/kernel/sched_rt.c b/trunk/kernel/sched_rt.c index 736fb8fd8977..c2730a5a4f05 100644 --- a/trunk/kernel/sched_rt.c +++ b/trunk/kernel/sched_rt.c @@ -479,26 +479,21 @@ static void dequeue_rt_entity(struct sched_rt_entity *rt_se) /* * Because the prio of an upper entry depends on the lower * entries, we must remove entries top - down. - * - * XXX: O(1/2 h^2) because we can only walk up, not down the chain. */ static void dequeue_rt_stack(struct task_struct *p) { - struct sched_rt_entity *rt_se, *top_se; + struct sched_rt_entity *rt_se, *back = NULL; - /* - * dequeue all, top - down. - */ - do { - rt_se = &p->rt; - top_se = NULL; - for_each_sched_rt_entity(rt_se) { - if (on_rt_rq(rt_se)) - top_se = rt_se; - } - if (top_se) - dequeue_rt_entity(top_se); - } while (top_se); + rt_se = &p->rt; + for_each_sched_rt_entity(rt_se) { + rt_se->back = back; + back = rt_se; + } + + for (rt_se = back; rt_se; rt_se = rt_se->back) { + if (on_rt_rq(rt_se)) + dequeue_rt_entity(rt_se); + } } /*