Message ID | 20220901101601.61420-2-lingshan.zhu@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | vDPA: support VHOST_GET/SET_VRING_ENDIAN | expand |
在 2022/9/1 18:15, Zhu Lingshan 写道: > This commit introuduces new config operatoions for vDPA: > vdpa_config_ops.get_vq_endian: set vq endian-ness > vdpa_config_ops.set_vq_endian: get vq endian-ness > > Because the endian-ness is a device wide attribute, > so seting a vq's endian-ness will result in changing > the device endian-ness, including all vqs and the config space. > > These two operations are implemented in ifcvf in this commit. > > Signed-off-by: Zhu Lingshan <lingshan.zhu@intel.com> > --- > drivers/vdpa/ifcvf/ifcvf_base.h | 1 + > drivers/vdpa/ifcvf/ifcvf_main.c | 15 +++++++++++++++ > include/linux/vdpa.h | 13 +++++++++++++ > 3 files changed, 29 insertions(+) > > diff --git a/drivers/vdpa/ifcvf/ifcvf_base.h b/drivers/vdpa/ifcvf/ifcvf_base.h > index f5563f665cc6..640238b95033 100644 > --- a/drivers/vdpa/ifcvf/ifcvf_base.h > +++ b/drivers/vdpa/ifcvf/ifcvf_base.h > @@ -19,6 +19,7 @@ > #include <uapi/linux/virtio_blk.h> > #include <uapi/linux/virtio_config.h> > #include <uapi/linux/virtio_pci.h> > +#include <uapi/linux/vhost.h> > > #define N3000_DEVICE_ID 0x1041 > #define N3000_SUBSYS_DEVICE_ID 0x001A > diff --git a/drivers/vdpa/ifcvf/ifcvf_main.c b/drivers/vdpa/ifcvf/ifcvf_main.c > index f9c0044c6442..270637d0f3a5 100644 > --- a/drivers/vdpa/ifcvf/ifcvf_main.c > +++ b/drivers/vdpa/ifcvf/ifcvf_main.c > @@ -684,6 +684,19 @@ static struct vdpa_notification_area ifcvf_get_vq_notification(struct vdpa_devic > return area; > } > > +static u8 ifcvf_vdpa_get_vq_endian(struct vdpa_device *vdpa_dev, u16 idx) > +{ > + return VHOST_VRING_LITTLE_ENDIAN; > +} > + > +static int ifcvf_vdpa_set_vq_endian(struct vdpa_device *vdpa_dev, u16 idx, u8 endian) > +{ > + if (endian != VHOST_VRING_LITTLE_ENDIAN) > + return -EFAULT; I'm worrying that this basically make the proposed API not much useful. For example, what would userspace do if it meet this failure? Thanks > + > + return 0; > +} > + > /* > * IFCVF currently doesn't have on-chip IOMMU, so not > * implemented set_map()/dma_map()/dma_unmap() > @@ -715,6 +728,8 @@ static const struct vdpa_config_ops ifc_vdpa_ops = { > .set_config = ifcvf_vdpa_set_config, > .set_config_cb = ifcvf_vdpa_set_config_cb, > .get_vq_notification = ifcvf_get_vq_notification, > + .get_vq_endian = ifcvf_vdpa_get_vq_endian, > + .set_vq_endian = ifcvf_vdpa_set_vq_endian, > }; > > static struct virtio_device_id id_table_net[] = { > diff --git a/include/linux/vdpa.h b/include/linux/vdpa.h > index d282f464d2f1..5eb83453ba86 100644 > --- a/include/linux/vdpa.h > +++ b/include/linux/vdpa.h > @@ -174,6 +174,17 @@ struct vdpa_map_file { > * @idx: virtqueue index > * Returns int: irq number of a virtqueue, > * negative number if no irq assigned. > + * @set_vq_endian: set endian-ness for a virtqueue > + * @vdev: vdpa device > + * @idx: virtqueue index > + * @endian: the endian-ness to set, > + * can be VHOST_VRING_LITTLE_ENDIAN or VHOST_VRING_BIG_ENDIAN > + * Returns integer: success (0) or error (< 0) > + * @get_vq_endian: get the endian-ness of a virtqueue > + * @vdev: vdpa device > + * @idx: virtqueue index > + * Returns u8, the endian-ness of the virtqueue, > + * can be VHOST_VRING_LITTLE_ENDIAN or VHOST_VRING_BIG_ENDIAN > * @get_vq_align: Get the virtqueue align requirement > * for the device > * @vdev: vdpa device > @@ -306,6 +317,8 @@ struct vdpa_config_ops { > (*get_vq_notification)(struct vdpa_device *vdev, u16 idx); > /* vq irq is not expected to be changed once DRIVER_OK is set */ > int (*get_vq_irq)(struct vdpa_device *vdev, u16 idx); > + int (*set_vq_endian)(struct vdpa_device *vdev, u16 idx, u8 endian); > + u8 (*get_vq_endian)(struct vdpa_device *vdev, u16 idx); > > /* Device ops */ > u32 (*get_vq_align)(struct vdpa_device *vdev);
On 9/5/2022 4:34 PM, Jason Wang wrote: > > 在 2022/9/1 18:15, Zhu Lingshan 写道: >> This commit introuduces new config operatoions for vDPA: >> vdpa_config_ops.get_vq_endian: set vq endian-ness >> vdpa_config_ops.set_vq_endian: get vq endian-ness >> >> Because the endian-ness is a device wide attribute, >> so seting a vq's endian-ness will result in changing >> the device endian-ness, including all vqs and the config space. >> >> These two operations are implemented in ifcvf in this commit. >> >> Signed-off-by: Zhu Lingshan <lingshan.zhu@intel.com> >> --- >> drivers/vdpa/ifcvf/ifcvf_base.h | 1 + >> drivers/vdpa/ifcvf/ifcvf_main.c | 15 +++++++++++++++ >> include/linux/vdpa.h | 13 +++++++++++++ >> 3 files changed, 29 insertions(+) >> >> diff --git a/drivers/vdpa/ifcvf/ifcvf_base.h >> b/drivers/vdpa/ifcvf/ifcvf_base.h >> index f5563f665cc6..640238b95033 100644 >> --- a/drivers/vdpa/ifcvf/ifcvf_base.h >> +++ b/drivers/vdpa/ifcvf/ifcvf_base.h >> @@ -19,6 +19,7 @@ >> #include <uapi/linux/virtio_blk.h> >> #include <uapi/linux/virtio_config.h> >> #include <uapi/linux/virtio_pci.h> >> +#include <uapi/linux/vhost.h> >> #define N3000_DEVICE_ID 0x1041 >> #define N3000_SUBSYS_DEVICE_ID 0x001A >> diff --git a/drivers/vdpa/ifcvf/ifcvf_main.c >> b/drivers/vdpa/ifcvf/ifcvf_main.c >> index f9c0044c6442..270637d0f3a5 100644 >> --- a/drivers/vdpa/ifcvf/ifcvf_main.c >> +++ b/drivers/vdpa/ifcvf/ifcvf_main.c >> @@ -684,6 +684,19 @@ static struct vdpa_notification_area >> ifcvf_get_vq_notification(struct vdpa_devic >> return area; >> } >> +static u8 ifcvf_vdpa_get_vq_endian(struct vdpa_device *vdpa_dev, >> u16 idx) >> +{ >> + return VHOST_VRING_LITTLE_ENDIAN; >> +} >> + >> +static int ifcvf_vdpa_set_vq_endian(struct vdpa_device *vdpa_dev, >> u16 idx, u8 endian) >> +{ >> + if (endian != VHOST_VRING_LITTLE_ENDIAN) >> + return -EFAULT; > > > I'm worrying that this basically make the proposed API not much useful. > > For example, what would userspace do if it meet this failure? This means the device only support LE, so if the user space does not work with LE, I think it should explicitly fails on the device. And we see the device only support LE, so no need to set anything to the device if LE is to set. Thanks, Zhu Lingshan > > Thanks > > >> + >> + return 0; >> +} >> + >> /* >> * IFCVF currently doesn't have on-chip IOMMU, so not >> * implemented set_map()/dma_map()/dma_unmap() >> @@ -715,6 +728,8 @@ static const struct vdpa_config_ops ifc_vdpa_ops = { >> .set_config = ifcvf_vdpa_set_config, >> .set_config_cb = ifcvf_vdpa_set_config_cb, >> .get_vq_notification = ifcvf_get_vq_notification, >> + .get_vq_endian = ifcvf_vdpa_get_vq_endian, >> + .set_vq_endian = ifcvf_vdpa_set_vq_endian, >> }; >> static struct virtio_device_id id_table_net[] = { >> diff --git a/include/linux/vdpa.h b/include/linux/vdpa.h >> index d282f464d2f1..5eb83453ba86 100644 >> --- a/include/linux/vdpa.h >> +++ b/include/linux/vdpa.h >> @@ -174,6 +174,17 @@ struct vdpa_map_file { >> * @idx: virtqueue index >> * Returns int: irq number of a virtqueue, >> * negative number if no irq assigned. >> + * @set_vq_endian: set endian-ness for a virtqueue >> + * @vdev: vdpa device >> + * @idx: virtqueue index >> + * @endian: the endian-ness to set, >> + * can be VHOST_VRING_LITTLE_ENDIAN or >> VHOST_VRING_BIG_ENDIAN >> + * Returns integer: success (0) or error (< 0) >> + * @get_vq_endian: get the endian-ness of a virtqueue >> + * @vdev: vdpa device >> + * @idx: virtqueue index >> + * Returns u8, the endian-ness of the virtqueue, >> + * can be VHOST_VRING_LITTLE_ENDIAN or >> VHOST_VRING_BIG_ENDIAN >> * @get_vq_align: Get the virtqueue align requirement >> * for the device >> * @vdev: vdpa device >> @@ -306,6 +317,8 @@ struct vdpa_config_ops { >> (*get_vq_notification)(struct vdpa_device *vdev, u16 idx); >> /* vq irq is not expected to be changed once DRIVER_OK is set */ >> int (*get_vq_irq)(struct vdpa_device *vdev, u16 idx); >> + int (*set_vq_endian)(struct vdpa_device *vdev, u16 idx, u8 endian); >> + u8 (*get_vq_endian)(struct vdpa_device *vdev, u16 idx); >> /* Device ops */ >> u32 (*get_vq_align)(struct vdpa_device *vdev); >
diff --git a/drivers/vdpa/ifcvf/ifcvf_base.h b/drivers/vdpa/ifcvf/ifcvf_base.h index f5563f665cc6..640238b95033 100644 --- a/drivers/vdpa/ifcvf/ifcvf_base.h +++ b/drivers/vdpa/ifcvf/ifcvf_base.h @@ -19,6 +19,7 @@ #include <uapi/linux/virtio_blk.h> #include <uapi/linux/virtio_config.h> #include <uapi/linux/virtio_pci.h> +#include <uapi/linux/vhost.h> #define N3000_DEVICE_ID 0x1041 #define N3000_SUBSYS_DEVICE_ID 0x001A diff --git a/drivers/vdpa/ifcvf/ifcvf_main.c b/drivers/vdpa/ifcvf/ifcvf_main.c index f9c0044c6442..270637d0f3a5 100644 --- a/drivers/vdpa/ifcvf/ifcvf_main.c +++ b/drivers/vdpa/ifcvf/ifcvf_main.c @@ -684,6 +684,19 @@ static struct vdpa_notification_area ifcvf_get_vq_notification(struct vdpa_devic return area; } +static u8 ifcvf_vdpa_get_vq_endian(struct vdpa_device *vdpa_dev, u16 idx) +{ + return VHOST_VRING_LITTLE_ENDIAN; +} + +static int ifcvf_vdpa_set_vq_endian(struct vdpa_device *vdpa_dev, u16 idx, u8 endian) +{ + if (endian != VHOST_VRING_LITTLE_ENDIAN) + return -EFAULT; + + return 0; +} + /* * IFCVF currently doesn't have on-chip IOMMU, so not * implemented set_map()/dma_map()/dma_unmap() @@ -715,6 +728,8 @@ static const struct vdpa_config_ops ifc_vdpa_ops = { .set_config = ifcvf_vdpa_set_config, .set_config_cb = ifcvf_vdpa_set_config_cb, .get_vq_notification = ifcvf_get_vq_notification, + .get_vq_endian = ifcvf_vdpa_get_vq_endian, + .set_vq_endian = ifcvf_vdpa_set_vq_endian, }; static struct virtio_device_id id_table_net[] = { diff --git a/include/linux/vdpa.h b/include/linux/vdpa.h index d282f464d2f1..5eb83453ba86 100644 --- a/include/linux/vdpa.h +++ b/include/linux/vdpa.h @@ -174,6 +174,17 @@ struct vdpa_map_file { * @idx: virtqueue index * Returns int: irq number of a virtqueue, * negative number if no irq assigned. + * @set_vq_endian: set endian-ness for a virtqueue + * @vdev: vdpa device + * @idx: virtqueue index + * @endian: the endian-ness to set, + * can be VHOST_VRING_LITTLE_ENDIAN or VHOST_VRING_BIG_ENDIAN + * Returns integer: success (0) or error (< 0) + * @get_vq_endian: get the endian-ness of a virtqueue + * @vdev: vdpa device + * @idx: virtqueue index + * Returns u8, the endian-ness of the virtqueue, + * can be VHOST_VRING_LITTLE_ENDIAN or VHOST_VRING_BIG_ENDIAN * @get_vq_align: Get the virtqueue align requirement * for the device * @vdev: vdpa device @@ -306,6 +317,8 @@ struct vdpa_config_ops { (*get_vq_notification)(struct vdpa_device *vdev, u16 idx); /* vq irq is not expected to be changed once DRIVER_OK is set */ int (*get_vq_irq)(struct vdpa_device *vdev, u16 idx); + int (*set_vq_endian)(struct vdpa_device *vdev, u16 idx, u8 endian); + u8 (*get_vq_endian)(struct vdpa_device *vdev, u16 idx); /* Device ops */ u32 (*get_vq_align)(struct vdpa_device *vdev);
This commit introuduces new config operatoions for vDPA: vdpa_config_ops.get_vq_endian: set vq endian-ness vdpa_config_ops.set_vq_endian: get vq endian-ness Because the endian-ness is a device wide attribute, so seting a vq's endian-ness will result in changing the device endian-ness, including all vqs and the config space. These two operations are implemented in ifcvf in this commit. Signed-off-by: Zhu Lingshan <lingshan.zhu@intel.com> --- drivers/vdpa/ifcvf/ifcvf_base.h | 1 + drivers/vdpa/ifcvf/ifcvf_main.c | 15 +++++++++++++++ include/linux/vdpa.h | 13 +++++++++++++ 3 files changed, 29 insertions(+)