From b46a99c6006ab8edf098e4ac351d366336f6ac71 Mon Sep 17 00:00:00 2001 From: Maxime Coquelin Date: Mon, 6 Jul 2020 13:24:47 +0200 Subject: [PATCH] vhost: make some vDPA callbacks mandatory Some of the vDPA callbacks have to be implemented for vDPA to work properly. This patch marks them as mandatory in the API doc and simplify code calling these ops with removing unnecessary checks that are now done at registration time. Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia --- lib/librte_vhost/rte_vdpa_dev.h | 14 ++++++++------ lib/librte_vhost/socket.c | 6 +++--- lib/librte_vhost/vdpa.c | 10 ++++++++++ lib/librte_vhost/vhost.c | 2 +- lib/librte_vhost/vhost_user.c | 6 ++---- 5 files changed, 24 insertions(+), 14 deletions(-) diff --git a/lib/librte_vhost/rte_vdpa_dev.h b/lib/librte_vhost/rte_vdpa_dev.h index 65557cb05e..89444c2ea1 100644 --- a/lib/librte_vhost/rte_vdpa_dev.h +++ b/lib/librte_vhost/rte_vdpa_dev.h @@ -15,24 +15,26 @@ * vdpa device operations */ struct rte_vdpa_dev_ops { - /** Get capabilities of this device */ + /** Get capabilities of this device (Mandatory) */ int (*get_queue_num)(struct rte_vdpa_device *dev, uint32_t *queue_num); - /** Get supported features of this device */ + /** Get supported features of this device (Mandatory) */ int (*get_features)(struct rte_vdpa_device *dev, uint64_t *features); - /** Get supported protocol features of this device */ + /** Get supported protocol features of this device (Mandatory) */ int (*get_protocol_features)(struct rte_vdpa_device *dev, uint64_t *protocol_features); - /** Driver configure/close the device */ + /** Driver configure the device (Mandatory) */ int (*dev_conf)(int vid); + + /** Driver close the device (Mandatory) */ int (*dev_close)(int vid); - /** Enable/disable this vring */ + /** Enable/disable this vring (Mandatory) */ int (*set_vring_state)(int vid, int vring, int state); - /** Set features when changed */ + /** Set features when changed (Mandatory) */ int (*set_features)(int vid); /** Destination operations when migration done */ diff --git a/lib/librte_vhost/socket.c b/lib/librte_vhost/socket.c index c4626d2c46..73e1dca95e 100644 --- a/lib/librte_vhost/socket.c +++ b/lib/librte_vhost/socket.c @@ -710,7 +710,7 @@ rte_vhost_driver_get_features(const char *path, uint64_t *features) } vdpa_dev = vsocket->vdpa_dev; - if (!vdpa_dev || !vdpa_dev->ops->get_features) { + if (!vdpa_dev) { *features = vsocket->features; goto unlock_exit; } @@ -763,7 +763,7 @@ rte_vhost_driver_get_protocol_features(const char *path, } vdpa_dev = vsocket->vdpa_dev; - if (!vdpa_dev || !vdpa_dev->ops->get_protocol_features) { + if (!vdpa_dev) { *protocol_features = vsocket->protocol_features; goto unlock_exit; } @@ -803,7 +803,7 @@ rte_vhost_driver_get_queue_num(const char *path, uint32_t *queue_num) } vdpa_dev = vsocket->vdpa_dev; - if (!vdpa_dev || !vdpa_dev->ops->get_queue_num) { + if (!vdpa_dev) { *queue_num = VHOST_MAX_QUEUE_PAIRS; goto unlock_exit; } diff --git a/lib/librte_vhost/vdpa.c b/lib/librte_vhost/vdpa.c index ef21ca2a1e..ae6fdd24ed 100644 --- a/lib/librte_vhost/vdpa.c +++ b/lib/librte_vhost/vdpa.c @@ -77,6 +77,16 @@ rte_vdpa_register_device(struct rte_device *rte_dev, if (ops == NULL) return NULL; + /* Check mandatory ops are implemented */ + if (!ops->get_queue_num || !ops->get_features || + !ops->get_protocol_features || !ops->dev_conf || + !ops->dev_close || !ops->set_vring_state || + !ops->set_features) { + VHOST_LOG_CONFIG(ERR, + "Some mandatory vDPA ops aren't implemented\n"); + return NULL; + } + rte_spinlock_lock(&vdpa_device_list_lock); /* Check the device hasn't been register already */ dev = __vdpa_find_device_by_name(rte_dev->name); diff --git a/lib/librte_vhost/vhost.c b/lib/librte_vhost/vhost.c index 8351d7e439..14b3e253e8 100644 --- a/lib/librte_vhost/vhost.c +++ b/lib/librte_vhost/vhost.c @@ -648,7 +648,7 @@ vhost_destroy_device_notify(struct virtio_net *dev) if (dev->flags & VIRTIO_DEV_RUNNING) { vdpa_dev = dev->vdpa_dev; - if (vdpa_dev && vdpa_dev->ops->dev_close) + if (vdpa_dev) vdpa_dev->ops->dev_close(dev->vid); dev->flags &= ~VIRTIO_DEV_RUNNING; dev->notify_ops->destroy_device(dev->vid); diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c index 257a035604..1d9e1127b8 100644 --- a/lib/librte_vhost/vhost_user.c +++ b/lib/librte_vhost/vhost_user.c @@ -398,7 +398,7 @@ vhost_user_set_features(struct virtio_net **pdev, struct VhostUserMsg *msg, } vdpa_dev = dev->vdpa_dev; - if (vdpa_dev && vdpa_dev->ops->set_features) + if (vdpa_dev) vdpa_dev->ops->set_features(dev->vid); return RTE_VHOST_MSG_RESULT_OK; @@ -2866,9 +2866,7 @@ skip_to_post_handle: goto out; if (!(dev->flags & VIRTIO_DEV_VDPA_CONFIGURED)) { - if (vdpa_dev->ops->dev_conf) - vdpa_dev->ops->dev_conf(dev->vid); - + vdpa_dev->ops->dev_conf(dev->vid); dev->flags |= VIRTIO_DEV_VDPA_CONFIGURED; } -- 2.20.1