* 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 */
}
vdpa_dev = vsocket->vdpa_dev;
- if (!vdpa_dev || !vdpa_dev->ops->get_features) {
+ if (!vdpa_dev) {
*features = vsocket->features;
goto unlock_exit;
}
}
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;
}
}
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;
}
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);
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);
}
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;
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;
}