OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

virtio-comment message

[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]


Subject: RE: [virtio-comment] RE: [PATCH v6 1/1] content: Add new feature VIRTIO_F_PRESERVE_RESOURCES


> From: Chen, Jiqian <Jiqian.Chen@amd.com>
> Sent: Monday, January 15, 2024 1:18 PM
> 
> On 2024/1/15 15:37, Parav Pandit wrote:
> >
> >> From: Chen, Jiqian <Jiqian.Chen@amd.com>
> >> Sent: Monday, January 15, 2024 1:03 PM
> >>
> >> On 2024/1/12 17:44, Parav Pandit wrote:
> >>>
> >>>
> >>>> From: Chen, Jiqian <Jiqian.Chen@amd.com>
> >>>> Sent: Friday, January 12, 2024 2:55 PM
> >>>>
> >>>> On 2024/1/12 16:47, Parav Pandit wrote:
> >>>>>
> >>>>>
> >>>>>> From: Chen, Jiqian <Jiqian.Chen@amd.com>
> >>>>>> Sent: Friday, January 12, 2024 1:55 PM
> >>>>>>
> >>>>>>
> >>>>>> On 2024/1/12 16:02, Parav Pandit wrote:
> >>>>>>> Hi Jiqian,
> >>>>>>>
> >>>>>>>> From: Chen, Jiqian <Jiqian.Chen@amd.com>
> >>>>>>>> Sent: Friday, January 12, 2024 1:11 PM
> >>>>>>>
> >>>>>>>>
> >>>>>>>> Hi all,
> >>>>>>>> Sorry to reply late.
> >>>>>>>> I don't know if you still remember this problem, let me briefly
> >>>>>>>> descript
> >>>> it.
> >>>>>>>> I am working to implement virtgpu S3 function on Xen.
> >>>>>>>> Currently on Xen, if we start a guest through qemu with
> >>>>>>>> enabling virtgpu, and then suspend and resume guest. We can
> >>>>>>>> find that the guest kernel comes back, but the display doesn't.
> >>>>>>>> It just shown a black
> >>>>>> screen.
> >>>>>>>> That is because during suspending, guest called into qemu and
> >>>>>>>> qemu destroyed all display resources and reset renderer. This
> >>>>>>>> made the display gone after guest resumed.
> >>>>>>>> So, I add a new command for virtio-gpu that when guest is
> >>>>>>>> suspending, it will notify qemu and set
> >>>>>>>> parameter(preserver_resource) to 1 and then qemu will preserve
> >>>>>>>> resources, and when resuming, guest will notify qemu to set
> >>>>>>>> parameter to 0, and then qemu will keep the normal actions.
> >>>>>>>> That can
> >>>> help guest's display come back.
> >>>>>>>> When I upstream above implementation, Parav and MST suggest me
> >> to
> >>>>>> use
> >>>>>>>> the PM capability to fix this problem instead of adding a new
> >>>>>>>> command or state bit.
> >>>>>>>> Now, I have tried the PM capability of virtio-gpu, it can't be
> >>>>>>>> used to solve this problem.
> >>>>>>>> The reason is:
> >>>>>>>> during guest suspending, it will write D3 state through PM cap,
> >>>>>>>> then I can save the resources of virtio-gpu on Qemu side(set
> >>>>>>>> preserver_resource to 1), but during the process of resuming,
> >>>>>>>> the state of PM cap will be cleared by qemu
> >>>>>>>> resetting(qemu_system_wakeup-> qemu_devices_reset->
> >>>>>>>> virtio_vga_base_reset-> virtio_gpu_gl_reset), it causes that
> >>>>>>>> when guest reads state from PM cap, it will find the virtio-gpu
> >>>>>>>> has already been D0 state,
> >>>>>>> This behavior needs to be fixed. As the spec listed out, " This
> >>>>>>> 2-bit field is
> >>>>>> used both to determine the current power state of a Function"
> >>>>>> Do you mean it is wrong to reset PM cap when vritio_gpu reset in
> >>>>>> current qemu code? Why?
> >>>>> Because PM is implementing the support from D3->d0 transition and
> >>>>> if it
> >>>> device in D3, the device needs to respond that it is in D3 to match
> >>>> the PCI spec.
> >>>>>
> >>>>>> Shouldn't all device states, including PM registers, be reset
> >>>>>> during the process of virtio-gpu reset?
> >>>>> If No_Soft_Reset== 0, no device context to be preserved.
> >>>>> If No_Soft_Reset == 1, device to preserve minimal registers and
> >>>>> other
> >>>> things listed in pci spec.
> >>>>>
> >>>>>>
> >>>>>>>
> >>>>>>> So device needs to return D3 in the PowerState field.  This is must.
> >>>>>> But current behavior is a kind of soft reset, I
> >>>>>> think(!PCI_PM_CTRL_NO_SOFT_RESET). The pm cap is reset by qemu
> is
> >>>>>> reasonable.
> >>>>> What you described is, you need to do No_Soft_Reset=1, so please
> >>>>> set the
> >>>> cap accordingly to achieve the restore.
> >>>>>
> >>>>> Also in your case the if the QEMU knows that it will have to
> >>>>> resume the
> >>>> device soon.
> >>>>> Hence, it can well prepare the gpu context before resuming the vcpus.
> >>>>> In such case, the extra register wouldnât be necessary.
> >>>>> Having PM control register is anyway needed to drive the device
> properly.
> >>>> Even as you said, the reset behavior of PM in the current QEMU code
> >>>> is incorrect, and even if it is modified, it also cannot fix this problem with
> S3.
> >>> You meant D3?
> >>>
> >>>> Because there is twice device reset during resuming.
> >>>> First is when we trigger a resume command to qemu, qemu will reset
> >>>> device(qemu_system_wakeup-> qemu_devices_reset->
> >>>> virtio_vga_base_reset-> virtio_gpu_gl_reset).
> >>> A device implementation that supports PM should not reset the device.
> >> Please fix it.
> >> Do you mean the devices_reset behavior of qemu shouldn't happen when
> >> a device has PM cap?
> > Right. Device reset should not happen on PM capable device that offers
> no_soft_reset==1.
> But current qemu code, no_soft_reset==0.
> 
So please fix the qemu when you are adding the functionality of restoring the device context on PM.

> >
> >> Or just the state of PM cap shouldn't be reset?
> >>
> >>>
> >>>> After the first time, then second time happens in guest kernel,
> >>>> virtio_device_restore-> virtio_reset_device. But the PM state
> >>>> changes
> >>>> (D3 to
> >>>> D0) happens between those two, so the display resources will be
> >>>> still destroyed by the second time of device reset.
> >>> The driver that understands that device supports PM, will skip the
> >>> reset
> >> steps.
> >> But it happens for now.
> > This should be enhanced in the guest driver.
> >
> >> In current qemu codes, the bit PCI_PM_CTRL_NO_SOFT_RESET of
> >> virtio-pci devices isn't set, is it a bug? It means the no_soft_reset==0.
> >>
> > It should be set when/if the device can store and restore the device context
> on d3->d0 transition.
> I don't know why it doesn't be set in current qemu code.
May be because QEMU is not restoring the context on PM commands.

> What do you mean "the device can store and restore the device context on
> d3->d0 transition"? The real physical device or the simulated devices on qemu
> side?
Does not matter, whichever implementation of device is doing the PM should set it.
In your case it is qemu.

> How do I confirm it?
If you mean "I" means guest driver, it will just work as long as it refers to the PM capabilities.

> 
> >
> >>> Hence the 2nd reset will also not occur.
> >>> Therefore, device state will be restored.
> >>
> >> --
> >> Best regards,
> >> Jiqian Chen.
> 
> --
> Best regards,
> Jiqian Chen.


[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]