Re: [PATCH v10 04/17] vdpa: Fail the vdpa_reset() if fail to set device status to zero
From: Yongji Xie <hidden>
Date: 2021-08-03 09:31:35
Also in:
kvm, linux-fsdevel, linux-iommu, lkml
From: Yongji Xie <hidden>
Date: 2021-08-03 09:31:35
Also in:
kvm, linux-fsdevel, linux-iommu, lkml
On Tue, Aug 3, 2021 at 3:58 PM Jason Wang [off-list ref] wrote:
在 2021/7/29 下午3:34, Xie Yongji 写道:quoted
Re-read the device status to ensure it's set to zero during resetting. Otherwise, fail the vdpa_reset() after timeout. Signed-off-by: Xie Yongji <redacted> --- include/linux/vdpa.h | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)diff --git a/include/linux/vdpa.h b/include/linux/vdpa.h index 406d53a606ac..d1a80ef05089 100644 --- a/include/linux/vdpa.h +++ b/include/linux/vdpa.h@@ -6,6 +6,7 @@ #include <linux/device.h> #include <linux/interrupt.h> #include <linux/vhost_iotlb.h> +#include <linux/delay.h> /** * struct vdpa_calllback - vDPA callback definition.@@ -340,12 +341,24 @@ static inline struct device *vdpa_get_dma_dev(struct vdpa_device *vdev) return vdev->dma_dev; } -static inline void vdpa_reset(struct vdpa_device *vdev) +#define VDPA_RESET_TIMEOUT_MS 1000 + +static inline int vdpa_reset(struct vdpa_device *vdev) { const struct vdpa_config_ops *ops = vdev->config; + int timeout = 0; vdev->features_valid = false; ops->set_status(vdev, 0); + while (ops->get_status(vdev)) { + timeout += 20; + if (timeout > VDPA_RESET_TIMEOUT_MS) + return -EIO; + + msleep(20); + }I wonder if it's better to do this in the vDPA parent? Thanks
Sorry, I didn't get you here. Do you mean vDPA parent driver (e.g. VDUSE)? Actually I didn't find any other place where I can do set_status() and get_status(). Thanks, Yongji