X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_vhost%2Frte_vdpa.h;h=109cf83b8f588563471f715ed9aa258d44b7b358;hb=81a6b7fe068f64d1381ea4d6fce5088a1bcc7f81;hp=c3c14816bb4d29c7f8ecde044dd016248ebb57c5;hpb=b13ad2decc8344641658674414d0347beca4bec6;p=dpdk.git diff --git a/lib/librte_vhost/rte_vdpa.h b/lib/librte_vhost/rte_vdpa.h index c3c14816bb..109cf83b8f 100644 --- a/lib/librte_vhost/rte_vdpa.h +++ b/lib/librte_vhost/rte_vdpa.h @@ -18,23 +18,34 @@ #define MAX_VDPA_NAME_LEN 128 -enum vdpa_addr_type { - PCI_ADDR, - VDPA_ADDR_MAX -}; +/** Maximum name length for statistics counters */ +#define RTE_VDPA_STATS_NAME_SIZE 64 + +struct rte_vdpa_device; /** - * vdpa device address + * A vDPA device statistic structure + * + * This structure is used by rte_vdpa_stats_get() to provide + * statistics from the HW vDPA device. + * + * It maps a name id, corresponding to an index in the array returned + * by rte_vdpa_get_stats_names, to a statistic value. */ -struct rte_vdpa_dev_addr { - /** vdpa address type */ - enum vdpa_addr_type type; +struct rte_vdpa_stat { + uint64_t id; /**< The index in stats name array */ + uint64_t value; /**< The statistic counter value */ +}; - /** vdpa pci address */ - union { - uint8_t __dummy[64]; - struct rte_pci_addr pci_addr; - }; +/** + * A name element for statistics + * + * An array of this structure is returned by rte_vdpa_get_stats_names + * It lists the names of extended statistics for a PMD. The rte_vdpa_stat + * structure references these names by their array index + */ +struct rte_vdpa_stat_name { + char name[RTE_VDPA_STATS_NAME_SIZE]; /**< The statistic name */ }; /** @@ -42,13 +53,14 @@ struct rte_vdpa_dev_addr { */ struct rte_vdpa_dev_ops { /** Get capabilities of this device */ - int (*get_queue_num)(int did, uint32_t *queue_num); + int (*get_queue_num)(struct rte_vdpa_device *dev, uint32_t *queue_num); /** Get supported features of this device */ - int (*get_features)(int did, uint64_t *features); + int (*get_features)(struct rte_vdpa_device *dev, uint64_t *features); /** Get supported protocol features of this device */ - int (*get_protocol_features)(int did, uint64_t *protocol_features); + int (*get_protocol_features)(struct rte_vdpa_device *dev, + uint64_t *protocol_features); /** Driver configure/close the device */ int (*dev_conf)(int vid); @@ -73,16 +85,28 @@ struct rte_vdpa_dev_ops { int (*get_notify_area)(int vid, int qid, uint64_t *offset, uint64_t *size); + /** Get statistics name */ + int (*get_stats_names)(struct rte_vdpa_device *dev, + struct rte_vdpa_stat_name *stats_names, + unsigned int size); + + /** Get statistics of the queue */ + int (*get_stats)(struct rte_vdpa_device *dev, int qid, + struct rte_vdpa_stat *stats, unsigned int n); + + /** Reset statistics of the queue */ + int (*reset_stats)(struct rte_vdpa_device *dev, int qid); + /** Reserved for future extension */ - void *reserved[5]; + void *reserved[2]; }; /** * vdpa device structure includes device address and device operations. */ struct rte_vdpa_device { - /** vdpa device address */ - struct rte_vdpa_dev_addr addr; + /** Generic device information */ + struct rte_device *device; /** vdpa device operations */ struct rte_vdpa_dev_ops *ops; } __rte_cache_aligned; @@ -98,10 +122,11 @@ struct rte_vdpa_device { * @param ops * the vdpa device operations * @return - * device id on success, -1 on failure + * vDPA device pointer on success, NULL on failure */ -int __rte_experimental -rte_vdpa_register_device(struct rte_vdpa_dev_addr *addr, +__rte_experimental +struct rte_vdpa_device * +rte_vdpa_register_device(struct rte_device *rte_dev, struct rte_vdpa_dev_ops *ops); /** @@ -111,12 +136,28 @@ rte_vdpa_register_device(struct rte_vdpa_dev_addr *addr, * Unregister a vdpa device * * @param did - * vdpa device id + * vDPA device pointer * @return * device id on success, -1 on failure */ -int __rte_experimental -rte_vdpa_unregister_device(int did); +__rte_experimental +int +rte_vdpa_unregister_device(struct rte_vdpa_device *); + +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice + * + * Find the device id of a vdpa device from its name + * + * @param name + * the vdpa device name + * @return + * device id on success, -1 on failure + */ +__rte_experimental +int +rte_vdpa_find_device_id_by_name(const char *name); /** * @warning @@ -129,8 +170,9 @@ rte_vdpa_unregister_device(int did); * @return * device id on success, -1 on failure */ -int __rte_experimental -rte_vdpa_find_device_id(struct rte_vdpa_dev_addr *addr); +__rte_experimental +int +rte_vdpa_find_device_id(struct rte_vdpa_device *dev); /** * @warning @@ -143,7 +185,8 @@ rte_vdpa_find_device_id(struct rte_vdpa_dev_addr *addr); * @return * rte_vdpa_device on success, NULL on failure */ -struct rte_vdpa_device * __rte_experimental +__rte_experimental +struct rte_vdpa_device * rte_vdpa_get_device(int did); /** @@ -155,7 +198,8 @@ rte_vdpa_get_device(int did); * @return * available vdpa device number */ -int __rte_experimental +__rte_experimental +int rte_vdpa_get_device_num(void); /** @@ -171,15 +215,17 @@ rte_vdpa_get_device_num(void); * @return * 0 on success, -1 on failure */ -int __rte_experimental +__rte_experimental +int rte_vhost_host_notifier_ctrl(int vid, bool enable); /** * @warning * @b EXPERIMENTAL: this API may change without prior notice * - * Synchronize the available ring from guest to mediated ring, help to - * check desc validity to protect against malicious guest driver. + * Synchronize the used ring from mediated ring to guest, log dirty + * page for each writeable buffer, caller should handle the used + * ring logging before device stop. * * @param vid * vhost device id @@ -188,28 +234,83 @@ rte_vhost_host_notifier_ctrl(int vid, bool enable); * @param vring_m * mediated virtio ring pointer * @return - * number of synced available entries on success, -1 on failure + * number of synced used entries on success, -1 on failure */ -int __rte_experimental -rte_vdpa_relay_vring_avail(int vid, uint16_t qid, void *vring_m); +__rte_experimental +int +rte_vdpa_relay_vring_used(int vid, uint16_t qid, void *vring_m); /** * @warning * @b EXPERIMENTAL: this API may change without prior notice * - * Synchronize the used ring from mediated ring to guest, log dirty - * page for each writeable buffer, caller should handle the used - * ring logging before device stop. + * Retrieve names of statistics of a vDPA device. * - * @param vid - * vhost device id + * There is an assumption that 'stat_names' and 'stats' arrays are matched + * by array index: stats_names[i].name => stats[i].value + * + * And the array index is same with id field of 'struct rte_vdpa_stat': + * stats[i].id == i + * + * @param did + * device id + * @param stats_names + * array of at least size elements to be filled. + * If set to NULL, the function returns the required number of elements. + * @param size + * The number of elements in stats_names array. + * @return + * A negative value on error, otherwise the number of entries filled in the + * stats name array. + */ +__rte_experimental +int +rte_vdpa_get_stats_names(int did, struct rte_vdpa_stat_name *stats_names, + unsigned int size); + +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice + * + * Retrieve statistics of a vDPA device. + * + * There is an assumption that 'stat_names' and 'stats' arrays are matched + * by array index: stats_names[i].name => stats[i].value + * + * And the array index is same with id field of 'struct rte_vdpa_stat': + * stats[i].id == i + * + * @param did + * device id * @param qid - * vhost queue id - * @param vring_m - * mediated virtio ring pointer + * queue id + * @param stats + * A pointer to a table of structure of type rte_vdpa_stat to be filled with + * device statistics ids and values. + * @param n + * The number of elements in stats array. * @return - * number of synced used entries on success, -1 on failure + * A negative value on error, otherwise the number of entries filled in the + * stats table. */ -int __rte_experimental -rte_vdpa_relay_vring_used(int vid, uint16_t qid, void *vring_m); +__rte_experimental +int +rte_vdpa_get_stats(int did, uint16_t qid, struct rte_vdpa_stat *stats, + unsigned int n); +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice + * + * Reset statistics of a vDPA device. + * + * @param did + * device id + * @param qid + * queue id + * @return + * 0 on success, a negative value on error. + */ +__rte_experimental +int +rte_vdpa_reset_stats(int did, uint16_t qid); #endif /* _RTE_VDPA_H_ */