Re: [GIT PULL] scheduler changes for v4.3

Markus Trippelsdorf
2015-09-01T07:44:54Z

On 2015.09.01 at 09:27 +0200, Ingo Molnar wrote:
>
> * Markus Trippelsdorf <markus@trippelsdorf.de> wrote:
>
> > On 2015.08.31 at 19:24 +0200, Ingo Molnar wrote:
> > > Please pull the latest sched-core-for-linus git tree from:
> > >
> > > git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git sched-core-for-linus
> > >
> > > # HEAD: ff277d4250fe715b6666219b1a3423b863418794 sched/deadline: Fix comment in enqueue_task_dl()
> >
> > Linus,
> >
> > your merge (commit a1d8561172f369ba) breaks booting on my machine.
>
> So I just double checked Linus's merge resolution, re-created it from scratch, and
> it looks correct. Furthermore, I resolved the conflict similarly in the past and
> this resolution had been in -tip and linux-next testing for some while.
>
> But I noticed something weird in your revert patch:
>
> >
> > I wrote down the backtrace:
> >
> > map_vsyscall
> > kvm_arch_hardware_setup
> > map_vsyscall
> > kvm_init
> > map_vsyscall
> > do_one_initcall
> > kernel_init_freeable
> > rest_init
> > kernel_init
> > ret_from_fork
> > rest_init
> >
> > RIP: svm_hardware_setup
> >
> > Reverting your merge resolution fixes the issue:
> >
> > diff --git a/kernel/cpu.c b/kernel/cpu.c
> > index 82cf9dff4295..873aa0757b04 100644
> > --- a/kernel/cpu.c
> > +++ b/kernel/cpu.c
> > @@ -397,12 +397,11 @@ static int _cpu_down(unsigned int cpu, int tasks_frozen)
> > * Prevent irq alloc/free while the dying cpu reorganizes the
> > * interrupt affinities.
> > */
> > - irq_lock_sparse();
>
> So where does this chunk come from? None of the trees nor the merge resolution
> touches this code.
>
> Maybe you had other changes in your tree that interfered?
>
> That missing irq_lock_sparse() might indeed break the boot. But that's not
> something that got in there from Linus's tree AFAICS.
>
> > /*
> > * So now all preempt/rcu users must observe !cpu_active().
> > */
> > - err = stop_machine(take_cpu_down, &tcd_param, cpumask_of(cpu));
> > + err = __stop_machine(take_cpu_down, &tcd_param, cpumask_of(cpu));
> > if (err) {
> > /* CPU didn't die: tell everyone. Can't complain. */
> > cpu_notify_nofail(CPU_DOWN_FAILED | mod, hcpu);
>
> This change cannot possibly have built on Linus's tree, as __stop_machine() got
> unexported, it is now internal and static to kernel/stop_machine.c...
>
> So could you please double check your side?

Well, git show a1d8561172f369ba56d636df49a6b4d6d77e2123 :

commit a1d8561172f369ba56d636df49a6b4d6d77e2123
Merge: 3959df1dfb95 ff277d4250fe
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date: Mon Aug 31 20:26:22 2015 -0700

Merge branch 'sched-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull scheduler updates from Ingo Molnar:
"The biggest change in this cycle is the rewrite of the main SMP load
balancing metric: the CPU load/utilization. The main goal was to make
the metric more precise and more representative - see the changelog of
this commit for the gory details:

9d89c257dfb9 ("sched/fair: Rewrite runnable load and utilization average tracking")

It is done in a way that significantly reduces complexity of the code:

5 files changed, 249 insertions(+), 494 deletions(-)

and the performance testing results are encouraging. Nevertheless we
need to keep an eye on potential regressions, since this potentially
affects every SMP workload in existence.

This work comes from Yuyang Du.

Other changes:

- SCHED_DL updates. (Andrea Parri)

- Simplify architecture callbacks by removing finish_arch_switch().
(Peter Zijlstra et al)

- cputime accounting: guarantee stime + utime == rtime. (Peter
Zijlstra)

- optimize idle CPU wakeups some more - inspired by Facebook server
loads. (Mike Galbraith)

- stop_machine fixes and updates. (Oleg Nesterov)

- Introduce the 'trace_sched_waking' tracepoint. (Peter Zijlstra)

- sched/numa tweaks. (Srikar Dronamraju)

- misc fixes and small cleanups"

* 'sched-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (44 commits)
sched/deadline: Fix comment in enqueue_task_dl()
sched/deadline: Fix comment in push_dl_tasks()
sched: Change the sched_class::set_cpus_allowed() calling context
sched: Make sched_class::set_cpus_allowed() unconditional
sched: Fix a race between __kthread_bind() and sched_setaffinity()
sched: Ensure a task has a non-normalized vruntime when returning back to CFS
sched/numa: Fix NUMA_DIRECT topology identification
tile: Reorganize _switch_to()
sched, sparc32: Update scheduler comments in copy_thread()
sched: Remove finish_arch_switch()
sched, tile: Remove finish_arch_switch
sched, sh: Fold finish_arch_switch() into switch_to()
sched, score: Remove finish_arch_switch()
sched, avr32: Remove finish_arch_switch()
sched, MIPS: Get rid of finish_arch_switch()
sched, arm: Remove finish_arch_switch()
sched/fair: Clean up load average references
sched/fair: Provide runnable_load_avg back to cfs_rq
sched/fair: Remove task and group entity load when they are dead
sched/fair: Init cfs_rq's sched_entity load average
...

diff --cc kernel/cpu.c
index 3c91a3fdfce5,664ce5299334..82cf9dff4295
--- a/kernel/cpu.c
+++ b/kernel/cpu.c
@@@ -394,15 -392,10 +394,15 @@@ static int _cpu_down(unsigned int cpu,
smpboot_park_threads(cpu);

/*
- * So now all preempt/rcu users must observe !cpu_active().
+ * Prevent irq alloc/free while the dying cpu reorganizes the
+ * interrupt affinities.
*/
+ irq_lock_sparse();

+ /*
+ * So now all preempt/rcu users must observe !cpu_active().
+ */
- err = __stop_machine(take_cpu_down, &tcd_param, cpumask_of(cpu));
+ err = stop_machine(take_cpu_down, &tcd_param, cpumask_of(cpu));
if (err) {
/* CPU didn't die: tell everyone. Can't complain. */
cpu_notify_nofail(CPU_DOWN_FAILED | mod, hcpu);

--
Markus