X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_vhost%2Fvdpa.c;h=99a926a7725cefb274ae437d061ff2ac2bcfb58c;hb=10b8c36af0abb654907d97738641d6a643408b99;hp=72561552c371a0d87a885dc14993474164264ccf;hpb=08a4f9bab348a490b17ca0ae334b7a2072e8809b;p=dpdk.git diff --git a/lib/librte_vhost/vdpa.c b/lib/librte_vhost/vdpa.c index 72561552c3..99a926a772 100644 --- a/lib/librte_vhost/vdpa.c +++ b/lib/librte_vhost/vdpa.c @@ -17,6 +17,7 @@ #include #include "rte_vdpa.h" +#include "rte_vdpa_dev.h" #include "vhost.h" /** Double linked list of vDPA devices. */ @@ -25,7 +26,6 @@ TAILQ_HEAD(vdpa_device_list, rte_vdpa_device); static struct vdpa_device_list vdpa_device_list = TAILQ_HEAD_INITIALIZER(vdpa_device_list); static rte_spinlock_t vdpa_device_list_lock = RTE_SPINLOCK_INITIALIZER; -static uint32_t vdpa_device_num; /* Unsafe, needs to be called with vdpa_device_list_lock held */ @@ -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); @@ -92,7 +102,6 @@ rte_vdpa_register_device(struct rte_device *rte_dev, dev->device = rte_dev; dev->ops = ops; TAILQ_INSERT_TAIL(&vdpa_device_list, dev, next); - vdpa_device_num++; out_unlock: rte_spinlock_unlock(&vdpa_device_list_lock); @@ -112,7 +121,6 @@ rte_vdpa_unregister_device(struct rte_vdpa_device *dev) TAILQ_REMOVE(&vdpa_device_list, dev, next); rte_free(dev); - vdpa_device_num--; ret = 0; break; } @@ -121,12 +129,6 @@ rte_vdpa_unregister_device(struct rte_vdpa_device *dev) return ret; } -int -rte_vdpa_get_device_num(void) -{ - return vdpa_device_num; -} - int rte_vdpa_relay_vring_used(int vid, uint16_t qid, void *vring_m) { @@ -215,8 +217,8 @@ rte_vdpa_relay_vring_used(int vid, uint16_t qid, void *vring_m) idx++; } - rte_smp_wmb(); - vq->used->idx = idx_m; + /* used idx is the synchronization point for the split vring */ + __atomic_store_n(&vq->used->idx, idx_m, __ATOMIC_RELEASE); if (dev->features & (1ULL << VIRTIO_RING_F_EVENT_IDX)) vring_used_event(s_vring) = idx_m; @@ -229,6 +231,34 @@ fail: return -1; } +int +rte_vdpa_get_queue_num(struct rte_vdpa_device *dev, uint32_t *queue_num) +{ + if (dev == NULL || dev->ops == NULL || dev->ops->get_queue_num == NULL) + return -1; + + return dev->ops->get_queue_num(dev, queue_num); +} + +int +rte_vdpa_get_features(struct rte_vdpa_device *dev, uint64_t *features) +{ + if (dev == NULL || dev->ops == NULL || dev->ops->get_features == NULL) + return -1; + + return dev->ops->get_features(dev, features); +} + +int +rte_vdpa_get_protocol_features(struct rte_vdpa_device *dev, uint64_t *features) +{ + if (dev == NULL || dev->ops == NULL || + dev->ops->get_protocol_features == NULL) + return -1; + + return dev->ops->get_protocol_features(dev, features); +} + int rte_vdpa_get_stats_names(struct rte_vdpa_device *dev, struct rte_vdpa_stat_name *stats_names,