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: [PATCH v6 1/1] content: Add new feature VIRTIO_F_PRESERVE_RESOURCES


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?
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.
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.

> Hence the 2nd reset will also not occur.
> Therefore, device state will be restored.

-- 
Best regards,
Jiqian Chen.


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