[4/9] vhost: make some vDPA callbacks mandatory
Checks
Commit Message
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 <maxime.coquelin@redhat.com>
---
lib/librte_vhost/rte_vdpa.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 | 7 +++----
5 files changed, 25 insertions(+), 14 deletions(-)
@@ -41,23 +41,25 @@ struct rte_vdpa_dev_addr {
* vdpa device operations
*/
struct rte_vdpa_dev_ops {
- /** Get capabilities of this device */
+ /** Get capabilities of this device (Mandatory) */
int (*get_queue_num)(int did, uint32_t *queue_num);
- /** Get supported features of this device */
+ /** Get supported features of this device (Mandatory) */
int (*get_features)(int did, uint64_t *features);
- /** Get supported protocol features of this device */
+ /** Get supported protocol features of this device (Mandatory) */
int (*get_protocol_features)(int did, 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 */
@@ -707,7 +707,7 @@ rte_vhost_driver_get_features(const char *path, uint64_t *features)
did = vsocket->vdpa_dev_id;
vdpa_dev = rte_vdpa_get_device(did);
- if (!vdpa_dev || !vdpa_dev->ops->get_features) {
+ if (!vdpa_dev) {
*features = vsocket->features;
goto unlock_exit;
}
@@ -762,7 +762,7 @@ rte_vhost_driver_get_protocol_features(const char *path,
did = vsocket->vdpa_dev_id;
vdpa_dev = rte_vdpa_get_device(did);
- if (!vdpa_dev || !vdpa_dev->ops->get_protocol_features) {
+ if (!vdpa_dev) {
*protocol_features = vsocket->protocol_features;
goto unlock_exit;
}
@@ -804,7 +804,7 @@ rte_vhost_driver_get_queue_num(const char *path, uint32_t *queue_num)
did = vsocket->vdpa_dev_id;
vdpa_dev = rte_vdpa_get_device(did);
- if (!vdpa_dev || !vdpa_dev->ops->get_queue_num) {
+ if (!vdpa_dev) {
*queue_num = VHOST_MAX_QUEUE_PAIRS;
goto unlock_exit;
}
@@ -66,6 +66,16 @@ rte_vdpa_register_device(struct rte_vdpa_dev_addr *addr,
if (i == MAX_VHOST_DEVICE)
return -1;
+ /* 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 -1;
+ }
+
snprintf(device_name, sizeof(device_name), "vdpa-dev-%d", i);
dev = rte_zmalloc(device_name, sizeof(struct rte_vdpa_device),
RTE_CACHE_LINE_SIZE);
@@ -649,7 +649,7 @@ vhost_destroy_device_notify(struct virtio_net *dev)
if (dev->flags & VIRTIO_DEV_RUNNING) {
did = dev->vdpa_dev_id;
vdpa_dev = rte_vdpa_get_device(did);
- 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);
@@ -386,7 +386,7 @@ vhost_user_set_features(struct virtio_net **pdev, struct VhostUserMsg *msg,
did = dev->vdpa_dev_id;
vdpa_dev = rte_vdpa_get_device(did);
- if (vdpa_dev && vdpa_dev->ops->set_features)
+ if (vdpa_dev)
vdpa_dev->ops->set_features(dev->vid);
return RTE_VHOST_MSG_RESULT_OK;
@@ -1972,7 +1972,7 @@ vhost_user_set_vring_enable(struct virtio_net **pdev,
did = dev->vdpa_dev_id;
vdpa_dev = rte_vdpa_get_device(did);
- if (vdpa_dev && vdpa_dev->ops->set_vring_state)
+ if (vdpa_dev)
vdpa_dev->ops->set_vring_state(dev->vid, index, enable);
if (dev->notify_ops->vring_state_changed)
@@ -2809,8 +2809,7 @@ vhost_user_msg_handler(int vid, int fd)
if (!(dev->flags & VIRTIO_DEV_VDPA_CONFIGURED) &&
request == VHOST_USER_SET_VRING_CALL) {
- 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;
}