[v2,3/8] vhost: make some vDPA callbacks mandatory

Message ID 20200702083237.1215652-4-amorenoz@redhat.com (mailing list archive)
State Superseded, archived
Delegated to: Maxime Coquelin
Headers
Series vhost: improve Vhost/vDPA device init |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Adrian Moreno July 2, 2020, 8:32 a.m. UTC
  From: Maxime Coquelin <maxime.coquelin@redhat.com>

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>
Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
---
 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(-)
  

Patch

diff --git a/lib/librte_vhost/rte_vdpa_dev.h b/lib/librte_vhost/rte_vdpa_dev.h
index 65557cb05..89444c2ea 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 49267cebf..047d9395d 100644
--- a/lib/librte_vhost/socket.c
+++ b/lib/librte_vhost/socket.c
@@ -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;
 	}
diff --git a/lib/librte_vhost/vdpa.c b/lib/librte_vhost/vdpa.c
index ef21ca2a1..ae6fdd24e 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 aa1424261..da461e843 100644
--- a/lib/librte_vhost/vhost.c
+++ b/lib/librte_vhost/vhost.c
@@ -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);
diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c
index ff8b1752b..6be5c771b 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;
@@ -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;
 	}