@@ -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 */
@@ -701,7 +701,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;
}
@@ -754,7 +754,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;
}
@@ -794,7 +794,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;
}
@@ -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);
@@ -646,7 +646,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);
@@ -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;
@@ -2849,9 +2849,7 @@ vhost_user_msg_handler(int vid, int fd)
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;
}