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

Re: [Xen-devel] [PATCH v2 2/6] arm: move GIC SGI kicking into separate function



On Wed, 2013-12-04 at 13:33 +0100, Andre Przywara wrote:
> On 12/04/2013 01:28 PM, Ian Campbell wrote:
> > On Wed, 2013-12-04 at 13:15 +0100, Andre Przywara wrote:
> >> On 12/02/2013 04:01 PM, Ian Campbell wrote:
> >>> On Mon, 2013-12-02 at 12:08 +0100, Andre Przywara wrote:
> >>>> Currently we unconditionally send SGIs to all cores on SMP bringup.
> >>>> PSCI will not need this, so we move this into a function and call it
> >>>> explicitly from the platforms that need it. This gets us get rid of
> >>>> the empty cpu_up() platform functions in ARM32 and the comment in
> >>>> there.
> >>>
> >>> I don't think this is quite true -- even on a PSCI system the kick is
> >>> required to get past the gate in head.S.
> >>
> >> Right, but this is the responsibility of the PSCI handler in the
> >> firmware, right?
> >
> > Note that I am talking about a gate which is implemented in Xen's
> > head.S, not in the firmware. It is Xen's reponsibility to get the CPU
> > past that point, which is somewhat independent from the firmware wakeup,
> > except in reality it is intertwined because they use the same mechanism.
> >
> > However, I think I was mistaken. In the case of PSCI we are able to wake
> > up specific targetted CPUs individually and we do so having already
> > opened the gate in out head.S, so the CPU must necessarily fall through
> > without waiting. I think this is worth mentioning in the commit log if
> > you don't mind.
> >
> >>   I was under the assumption that the semantics of cpu_on
> >> is to start executing code at the given address, whatever this takes
> >> internally.
> >
> > Right, the issue here is a gate which we have subsequent to that
> > happening.
> >
> >> Calxeda firmware for instance does the SGI kick.
> >>
> >>>
> >>> I wonder how this interacts with PSCI implementations which use an SGI
> >>> themselves internally...
> >>>
> >>>> @@ -376,11 +386,6 @@ int __cpu_up(unsigned int cpu)
> >>>>            return rc;
> >>>>        }
> >>>>
> >>>> -    /* We don't know the GIC ID of the CPU until it has woken up, so 
> >>>> just signal
> >>>> -     * everyone and rely on our own smp_up_cpu gate to ensure only the 
> >>>> one we
> >>>> -     * want gets through. */
> >>>> -    send_SGI_allbutself(GIC_SGI_EVENT_CHECK);
> >>>> -
> >>>
> >>> So, I was saying in the 00 mail I'm not sure we can get rid of this
> >>> altogether.
> >>
> >> Please note that we do not get rid of this, but just move it. ARM64
> >> calls it in arm64/smpboot.c,
> >
> > How does this interact with the sev() In smp_spin_table_cpu_up I wonder.
> 
> Me, too ;-)
> The original code does the sev() in arm/arm64/smpboot.c, then returns to 
> the caller in arm/smpboot.c, which does the GIC kick. I was already 
> wondering if that is correct, I guess you could answer this much better.

I think the firmware uses wfe while the Xen gate uses wfi so infact both
are needed.

> > I think the GIC send should be only for the non-PSCI case here too.
> 
> It is. The arm64 code has the GIC kick moved into the spin_table 
> function only. PSCI is a different beast, not using the GIC. Also arm32 
> does it only in platform specific functions, which don't get called when 
> PSCI is available.

Great, I should have checked the code before replying.

Thanks,
Ian.

> 
> Regards,
> Andre.
> 
> >
> >>   ARM32 non-PSCI platforms call this now
> >> explicitly by pointing to that function in their platforms/foo.c file.
> >
> > OK.
> >
> >>
> >>>
> >>> But I suppose it is the intention that the platform code always has both
> >>> its own logic and this SGI kick (possibly coalesced) in such
> >>> circumstances? Which is probably ok?
> >>
> >> That was my thinking, yes.
> >>
> >> Regards,
> >> Andre.
> >>
> >>
> >>>>        while ( !cpu_online(cpu) )
> >>>>        {
> >>>>            cpu_relax();
> >>>> diff --git a/xen/include/asm-arm/smp.h b/xen/include/asm-arm/smp.h
> >>>> index 1485cc6..a1de03c 100644
> >>>> --- a/xen/include/asm-arm/smp.h
> >>>> +++ b/xen/include/asm-arm/smp.h
> >>>> @@ -21,6 +21,8 @@ extern int arch_smp_init(void);
> >>>>    extern int arch_cpu_init(int cpu, struct dt_device_node *dn);
> >>>>    extern int arch_cpu_up(int cpu);
> >>>>
> >>>> +int cpu_up_send_sgi(int cpu);
> >>>> +
> >>>>    /* Secondary CPU entry point */
> >>>>    extern void init_secondary(void);
> >>>>
> >>>
> >>>
> >>
> >
> >
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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