[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v3 10/10] xen/arm: Enable errata for secondary CPU on hotplug after the boot



On Thu, 2018-05-10 at 13:57 +0200, Mirela Simonovic wrote:
> Hi,
> 
> +Dario
> 
Thanks.

> On Wed, May 9, 2018 at 6:32 PM, Julien Grall <julien.grall@xxxxxxx>
> wrote:
> > If there is a bug in the scheduler it should be fixed rather trying
> > to
> > workaround with a panic in the code. If you provide more details,
> > we might
> > be able to help here.
> > 
> 
> This flow seems to have several bugs. Lets start from here:
> 
> Please take a look at function cpu_schedule_callback in schedule.c.
> Within switch, case CPU_DEAD doesn't have a break, causing the bellow
> CPU_UP_CANCELED to execute as well when the CPU goes down. This looks
> wrong to me.
> Dario, could you please confirm that this is a bug? 
>
No, that is entirely on purpose (as you can tell from the
"/* Fallthrough */" comment).

> Otherwise could
> you please confirm the reasoning beyond?
> 
Well, the idea is that the CPU_UP_CANCELLED notifier should _only_
invoke cpu_schedule_down(). On the other hand, the CPU_DEAD notifier
should invoke both:
 SCHED_OP(deinit_pdata)
 cpu_schedule_down()

and the fallthrough is the way we achieve that.

On x86, the shutdown/suspend path is as follows:

    XENPF_enter_acpi_sleep (platform_hypercall.c)
      acpi_enter_sleep()
        continue_hypercall_on_cpu(0, enter_state_helper)
          enter_state()
            system_state = SYS_STATE_suspend
            disable_nonboot_cpus()
              for_each_online_cpu ( cpu ) { 
                cpu_down(cpu) }
                  notifier_call_chain(CPU_DOWN_PREPARE)
                    cpu_callback(CPU_DOWN_PREPARE)
                      cpupool_cpu_remove(cpu)
                      cpufreq_del_cpu(cpu)
                      stop_machine_run(take_cpu_down, cpu)
                        __cpu_disable();
                          notifier_call_chain(CPU_DYING)
                            ...
                          cpumask_clear_cpu(cpu, &cpu_online_map);
                            cpu_disable_scheduler(cpu);
                  __cpu_die(cpu)
                    while ( (seen_state = cpu_state) != CPU_STATE_DEAD ) { ... }
                    notifier_call_chain(CPU_DEAD)
                      cpu_schedule_callback(CPU_DEAD)
                        ...
                        ...
                        cpu_schedule_callback(CPU_DEAD)
                          SCHED_OP(deinit_pdata)
                          cpu_schedule_down(cpu)
                            SCHED_OP(free_pdata)
                            SCHED_OP(free_vdata)


If you see a BUG_ON triggering, please provide details about that, and
we'll try to figure out what's causing it.

Regards,
Dario
-- 
<<This happens because I choose it to happen!>> (Raistlin Majere)
-----------------------------------------------------------------
Dario Faggioli, Ph.D, http://about.me/dario.faggioli
Software Engineer @ SUSE https://www.suse.com/

Attachment: signature.asc
Description: This is a digitally signed message part

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.