[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CABcS5h2kDgTAD_nP0paw8=SFfyYT5B4zZBPHj_6MP0LeyAdR9A@mail.gmail.com>
Date: Wed, 19 Oct 2011 15:17:34 +0100
From: Rolando Martins <rolando.martins@...il.com>
To: Peter Zijlstra <peterz@...radead.org>
Cc: LKML <linux-kernel@...r.kernel.org>,
linux-rt-users <linux-rt-users@...r.kernel.org>,
Thomas Gleixner <tglx@...utronix.de>
Subject: Re: [ANNOUNCE] 3.0.7-rt20
Hi to all,
this fixed my issues with cgroups and RT_GROUP_SCHED.
A big thanks to the RT maintainers, specially to Peter Zijlstra.
This patch provides the best performance I ever experience while using
RT_GROUP_SCHED!
Thanks,
Rolando
> * Fix a long standing RT throttling problem with cgroups and
> RT_GROUP_SCHED (Peter Zijlstra, Thanks to Carsten Emde for
> providing the debug information!)
On Wed, Oct 19, 2011 at 10:59 AM, Thomas Gleixner <tglx@...utronix.de> wrote:
> Dear RT Folks,
>
> I'm pleased to announce the 3.0.7-rt20 release.
>
> 3.0.7-rt19 is an not announced intermediate release, which only
> updates to 3.0.7. No rt changes except dropping patches which made it
> into 3.0.7.
>
> Changes from 3.0.7-rt19 to 3.0.7-rt20
>
> * Fix a long standing RT throttling problem with cgroups and
> RT_GROUP_SCHED (Peter Zijlstra, Thanks to Carsten Emde for
> providing the debug information!)
>
> * Minor fixes (Yong Zhang)
>
> Delta patch against 3.0.7-rt19
>
> https://tglx.de/~tglx/rt/patch-3.0.7-rt19-rt20.patch.gz
>
> also appended below.
>
>
> Patch against 3.0.7 can be found here:
>
> https://tglx.de/~tglx/rt/patch-3.0.7-rt20.patch.gz
>
>
> The split quilt queue is available at:
>
> https://tglx.de/~tglx/rt/patches-3.0.7-rt20.tar.gz
>
> Known issues:
>
> Yong discovered a non critical cpuhotplug problem, which needs some
> more thought. Will try to address that in the next days as traveling
> allows (about to head to Prague for a long RTLWS/KS/LinuxCon/ELCE
> week).
>
> Enjoy,
>
> tglx
>
> --------------->
> Index: linux-2.6/kernel/cpu.c
> ===================================================================
> --- linux-2.6.orig/kernel/cpu.c
> +++ linux-2.6/kernel/cpu.c
> @@ -139,7 +139,7 @@ static int cpu_unplug_begin(unsigned int
> struct task_struct *tsk;
>
> init_completion(&hp->synced);
> - tsk = kthread_create(sync_unplug_thread, hp, "sync_unplug/%d\n", cpu);
> + tsk = kthread_create(sync_unplug_thread, hp, "sync_unplug/%d", cpu);
> if (IS_ERR(tsk))
> return (PTR_ERR(tsk));
> kthread_bind(tsk, cpu);
> Index: linux-2.6/kernel/printk.c
> ===================================================================
> --- linux-2.6.orig/kernel/printk.c
> +++ linux-2.6/kernel/printk.c
> @@ -1282,8 +1282,8 @@ void printk_tick(void)
>
> int printk_needs_cpu(int cpu)
> {
> - if (cpu_is_offline(cpu))
> - printk_tick();
> + if (unlikely(cpu_is_offline(cpu)))
> + __this_cpu_write(printk_pending, 0);
> return __this_cpu_read(printk_pending);
> }
>
> Index: linux-2.6/kernel/sched_rt.c
> ===================================================================
> --- linux-2.6.orig/kernel/sched_rt.c
> +++ linux-2.6/kernel/sched_rt.c
> @@ -556,12 +556,9 @@ static inline int balance_runtime(struct
>
> static int do_sched_rt_period_timer(struct rt_bandwidth *rt_b, int overrun)
> {
> - int i, idle = 1;
> + int i, idle = 1, throttled = 0;
> const struct cpumask *span;
>
> - if (!rt_bandwidth_enabled() || rt_b->rt_runtime == RUNTIME_INF)
> - return 1;
> -
> span = sched_rt_period_mask();
> for_each_cpu(i, span) {
> int enqueue = 0;
> @@ -596,12 +593,17 @@ static int do_sched_rt_period_timer(stru
> if (!rt_rq_throttled(rt_rq))
> enqueue = 1;
> }
> + if (rt_rq->rt_throttled)
> + throttled = 1;
>
> if (enqueue)
> sched_rt_rq_enqueue(rt_rq);
> raw_spin_unlock(&rq->lock);
> }
>
> + if (!throttled && (!rt_bandwidth_enabled() || rt_b->rt_runtime == RUNTIME_INF))
> + return 1;
> +
> return idle;
> }
>
> @@ -633,8 +635,24 @@ static int sched_rt_runtime_exceeded(str
> return 0;
>
> if (rt_rq->rt_time > runtime) {
> - rt_rq->rt_throttled = 1;
> - printk_once(KERN_WARNING "sched: RT throttling activated\n");
> + struct rt_bandwidth *rt_b = sched_rt_bandwidth(rt_rq);
> +
> + /*
> + * Don't actually throttle groups that have no runtime assigned
> + * but accrue some time due to boosting.
> + */
> + if (likely(rt_b->rt_runtime)) {
> + rt_rq->rt_throttled = 1;
> + printk_once(KERN_WARNING "sched: RT throttling activated\n");
> + } else {
> + /*
> + * In case we did anyway, make it go away,
> + * replenishment is a joke, since it will replenish us
> + * with exactly 0 ns.
> + */
> + rt_rq->rt_time = 0;
> + }
> +
> if (rt_rq_throttled(rt_rq)) {
> sched_rt_rq_dequeue(rt_rq);
> return 1;
> @@ -662,7 +680,8 @@ static void update_curr_rt(struct rq *rq
> if (unlikely((s64)delta_exec < 0))
> delta_exec = 0;
>
> - schedstat_set(curr->se.statistics.exec_max, max(curr->se.statistics.exec_max, delta_exec));
> + schedstat_set(curr->se.statistics.exec_max,
> + max(curr->se.statistics.exec_max, delta_exec));
>
> curr->se.sum_exec_runtime += delta_exec;
> account_group_exec_runtime(curr, delta_exec);
> Index: linux-2.6/kernel/workqueue.c
> ===================================================================
> --- linux-2.6.orig/kernel/workqueue.c
> +++ linux-2.6/kernel/workqueue.c
> @@ -3274,14 +3274,14 @@ static void flush_gcwq(struct global_cwq
>
> spin_unlock_irq(&gcwq->lock);
>
> - gcwq = get_gcwq(get_cpu());
> + gcwq = get_gcwq(get_cpu_light());
> spin_lock_irq(&gcwq->lock);
> list_for_each_entry_safe(work, nw, &non_affine_works, entry) {
> list_del_init(&work->entry);
> ___queue_work(get_work_cwq(work)->wq, gcwq, work);
> }
> spin_unlock_irq(&gcwq->lock);
> - put_cpu();
> + put_cpu_light();
> }
>
> static int __devinit workqueue_cpu_down_callback(struct notifier_block *nfb,
> Index: linux-2.6/localversion-rt
> ===================================================================
> --- linux-2.6.orig/localversion-rt
> +++ linux-2.6/localversion-rt
> @@ -1 +1 @@
> --rt19
> +-rt20
> --
> To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
> the body of a message to majordomo@...r.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists