[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 02/18] xen/arm: Implement PSCI system suspend call (virtual interface)
Hi Julien, On Thu, Nov 15, 2018 at 12:38 PM Julien Grall <julien.grall@xxxxxxx> wrote: > > Hi, > > On 11/15/18 11:10 AM, Mirela Simonovic wrote: > > Hi Julien, > > > > On Thu, Nov 15, 2018 at 11:59 AM Julien Grall <julien.grall@xxxxxxx> wrote: > >> > >> Hi Mirela, > >> > >> On 11/15/18 10:33 AM, Mirela Simonovic wrote: > >>> On Thu, Nov 15, 2018 at 11:26 AM Andrew Cooper > >>> <andrew.cooper3@xxxxxxxxxx> wrote: > >>>> > >>>> On 15/11/2018 10:13, Julien Grall wrote: > >>>>> (+ Andre) > >>>>> > >>>>> On 11/15/18 12:47 AM, Andrew Cooper wrote: > >>>>>> On 14/11/2018 12:49, Julien Grall wrote: > >>>>>>> Hi Mirela, > >>>>>>> > >>>>>>> On 14/11/2018 12:08, Mirela Simonovic wrote: > >>>>>>>> > >>>>>>>> > >>>>>>>> On 11/13/2018 09:32 AM, Andrew Cooper wrote: > >>>>>>>>> On 12/11/2018 19:56, Julien Grall wrote: > >>>>>>>>>> Hi Andrew, > >>>>>>>>>> > >>>>>>>>>> On 11/12/18 4:41 PM, Andrew Cooper wrote: > >>>>>>>>>>> On 12/11/18 16:35, Mirela Simonovic wrote: > >>>>>>>>>>>>>> diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c > >>>>>>>>>>>>>> index e594b48d81..7f8105465c 100644 > >>>>>>>>>>>>>> --- a/xen/arch/arm/domain.c > >>>>>>>>>>>>>> +++ b/xen/arch/arm/domain.c > >>>>>>>>>>>>>> @@ -97,6 +97,11 @@ static void ctxt_switch_from(struct vcpu *p) > >>>>>>>>>>>>>> if ( is_idle_vcpu(p) ) > >>>>>>>>>>>>>> return; > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> + /* VCPU's context should not be saved if its domain is > >>>>>>>>>>>>>> suspended */ > >>>>>>>>>>>>>> + if ( p->domain->is_shut_down && > >>>>>>>>>>>>>> + (p->domain->shutdown_code == SHUTDOWN_suspend) ) > >>>>>>>>>>>>>> + return; > >>>>>>>>>>>>> SHUTDOWN_suspend is used in Xen for other purpose (see > >>>>>>>>>>>>> SCHEDOP_shutdown). The other user of that code relies on all the > >>>>>>>>>>>>> state > >>>>>>>>>>>>> to be saved on suspend. > >>>>>>>>>>>>> > >>>>>>>>>>>> We just need a flag to mark a domain as suspended, and I do > >>>>>>>>>>>> believe > >>>>>>>>>>>> SHUTDOWN_suspend is not used anywhere else. > >>>>>>>>>>>> Let's come back on this. > >>>>>>>>>>> SHUTDOWN_suspend is used for migration. Grep for it through the > >>>>>>>>>>> Xen > >>>>>>>>>>> tree and you'll find several pieces of documentation, including > >>>>>>>>>>> the > >>>>>>>>>>> description of what this shutdown code means>>>>>>>>>>> > >>>>>>>>>>> What you are introducing here is not a shutdown - it is a suspend > >>>>>>>>>>> with > >>>>>>>>>>> the intent to resume executing later. As such, it shouldn't use > >>>>>>>>>>> Xen's > >>>>>>>>>>> shutdown infrastructure, which exists mainly to communicate with > >>>>>>>>>>> the > >>>>>>>>>>> toolstack. > >>>>>>>>>> Would domain pause/unpause be a better solution? > >>>>>>>>> Actually yes - that sounds like a very neat solution. > >>>>>>>> > >>>>>>>> I believe domain pause will not work here - a domain cannot pause > >>>>>>>> itself, i.e. current domain cannot be paused. This functionality > >>>>>>>> seems to assume that a domain is pausing another domain. Or I missed > >>>>>>>> the point. > >>>>>>> > >>>>>>> Yes domain pause/unpause will not work. However, you can introduce a > >>>>>>> boolean to tell you whether the domain was suspend. > >>>>>>> > >>>>>>> I actually quite like how suspend work for x86 HVM. This is based on > >>>>>>> pause/unpause. Have a look at hvm_s3_{suspend/resume}. > >>>>>> > >>>>>> That only exists because the ACPI controller is/was implemented in > >>>>>> QEMU. I wouldn't recommend copying it. > >>>>> > >>>>> May I ask why? I don't think the properties are very different from > >>>>> Arm here. > >>>> > >>>> If you observe, that can only be actioned by a hypercall from qemu. It > >>>> can't be actioned by an ACPI controller emulated by Xen. > >>>> > >>>>> > >>>>>> > >>>>>> Having spent some more time thinking about this problem, what > >>>>>> properties > >>>>>> does the PSCI call have? > >>>>>> > >>>>>> I gather from other parts of this thread that there may be a partial > >>>>>> reset of state? Beyond that, what else? > >>>>>> > >>>>>> I ask, because conceptually, domU suspend to RAM is literally just > >>>>>> "de-schedule until we want to wake up", and in this case, it appears to > >>>>>> be "wake up on any of the still-active interrupts". We've already got > >>>>>> a > >>>>>> scheduler API for that, and its called vcpu_block(). This already > >>>>>> exists with "wait until a new event occurs" semantics. > >>>>>> > >>>>>> Is there anything else I've missed? > >>>>> > >>> > >>> That's correct, and I agree. BTW that is what's implemented in this > >>> series. > >>> > >>>>> All vCPUs but the vCPU calling SYSTEM_SUSPEND should be off. Also, > >>>>> only events on that vCPU can trigger a resume. All the other event > >>>>> should not be taken into account. > >>>>> > >>> > >>> What other events are talking about here? > >> > >> vcpu_unblock is not only called when you receive interrupts. It can be > >> called in other place when you receive an events. > >> > >> From the Arm Arm, an event can be anything. So do we really want to > >> wake-up on any events? > >> > >>> > >>>>> My worry with vcpu_block() is we don't prevent the other vCPUs to run. > >>>>> Technically they should be off, but I would like some safety to avoid > >>>>> any potential corner case (i.e other way to turn a vCPU on). > >>>> > >>> > >>> Other vCPUs are hot-unplugged (offlined) by the guest. If that is not > >>> the case, SYSTEM_SUSPEND will return an error. > >>> Could you please clarify what a potential corner case would be? > >> > >> PSCI CPU_ON is not the only way to online a vCPU. I merely want to > >> prevent other path to play with the vCPU when it is not necessary. > >> > >> [...] > >> > >>>> If instead of waiting for any event, you need to wait for a specific > >>>> event, there is also vcpu_poll() which is a related scheduler API. > >>>> > >>>> ~Andrew > >>> > >>> Some content disappeared, so I'll write here to avoid thread branching. > >>> > >>> The semantic of vCPU block and domain_pause is not the same. When > >>> guest suspends the domain is not (and should not be) paused, instead > >>> its last online vCPU is blocked waiting on an interrupt. That's it. > >> Well no, you will block until you receive an event. Interrupts are one > >> of them. > >> > >> Do we want to consider all events as wakeup event? > >> > > > > I think we need to assume that events are not triggered via toolstack, > > Andrew made a good point. > > I don't think we are discussing the same thing. The discussion was > around other vCPUs, not the vCPU calling SYSTEM_SUSPEND. > > Most likely in the future, we would want to allow the toolstack to > request resuming the domain. This can be considered as an event. > Yes, such an event will unblock the vcpu and cause the domain to resume. So from this perspective it's not only an interrupt targeted to the guest. > > Given the assumption, my understanding is that Xen itself will not > > unblock vCPU, except due to an interrupt targeted to the guest. > > Am I missing something? An example would be appreciated. > > At least on Arm, the current semantics of vcpu_block/vcpu_unblock is to > block until you receive an events. > > I don't much want to restrict the definition of events to only > interrupts. To clarify my point, if you want to wake-up for any events > then fine. But this needs to be understood that it may not be only > interrupts. > In the context described above this is fine - events are not only interrupts. > Cheers, > > -- > Julien Grall _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |