X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_vhost%2Frte_vhost.h;h=19474bca07e89e793dc6bf6863d76810b495419d;hb=1dac0f3ef37a16f38f67b57d2e7c4a3830d8632b;hp=d280ac420d1eec59d4ec256345285f8371c4de0b;hpb=cd85039e7ee6c52cf9bc0628d7543dd75db02f5a;p=dpdk.git diff --git a/lib/librte_vhost/rte_vhost.h b/lib/librte_vhost/rte_vhost.h index d280ac420d..19474bca07 100644 --- a/lib/librte_vhost/rte_vhost.h +++ b/lib/librte_vhost/rte_vhost.h @@ -23,6 +23,7 @@ extern "C" { /* These are not C++-aware. */ #include #include +#include #define RTE_VHOST_USER_CLIENT (1ULL << 0) #define RTE_VHOST_USER_NO_RECONNECT (1ULL << 1) @@ -111,6 +112,46 @@ struct rte_vhost_vring { uint16_t size; }; +/** + * Possible results of the vhost user message handling callbacks + */ +enum rte_vhost_msg_result { + /* Message handling failed */ + RTE_VHOST_MSG_RESULT_ERR = -1, + /* Message handling successful */ + RTE_VHOST_MSG_RESULT_OK = 0, + /* Message handling successful and reply prepared */ + RTE_VHOST_MSG_RESULT_REPLY = 1, + /* Message not handled */ + RTE_VHOST_MSG_RESULT_NOT_HANDLED, +}; + +/** + * Function prototype for the vhost backend to handle specific vhost user + * messages. + * + * @param vid + * vhost device id + * @param msg + * Message pointer. + * @return + * RTE_VHOST_MSG_RESULT_OK on success, + * RTE_VHOST_MSG_RESULT_REPLY on success with reply, + * RTE_VHOST_MSG_RESULT_ERR on failure, + * RTE_VHOST_MSG_RESULT_NOT_HANDLED if message was not handled. + */ +typedef enum rte_vhost_msg_result (*rte_vhost_msg_handle)(int vid, void *msg); + +/** + * Optional vhost user message handlers. + */ +struct rte_vhost_user_extern_ops { + /* Called prior to the master message handling. */ + rte_vhost_msg_handle pre_msg_handle; + /* Called after the master message handling. */ + rte_vhost_msg_handle post_msg_handle; +}; + /** * Device and vring operations. */ @@ -131,7 +172,15 @@ struct vhost_device_ops { int (*new_connection)(int vid); void (*destroy_connection)(int vid); - void *reserved[2]; /**< Reserved for future extension */ + /** + * This callback gets called each time a guest gets notified + * about waiting packets. This is the interrupt handling trough + * the eventfd_write(callfd), which can be used for counting these + * "slow" syscalls. + */ + void (*guest_notified)(int vid); + + void *reserved[1]; /**< Reserved for future extension */ }; /** @@ -184,6 +233,7 @@ rte_vhost_gpa_to_vva(struct rte_vhost_memory *mem, uint64_t gpa) * @return * the host virtual address on success, 0 on failure */ +__rte_experimental static __rte_always_inline uint64_t rte_vhost_va_from_guest_pa(struct rte_vhost_memory *mem, uint64_t gpa, uint64_t *len) @@ -272,7 +322,8 @@ int rte_vhost_driver_unregister(const char *path); * @return * 0 on success, -1 on failure */ -int __rte_experimental +__rte_experimental +int rte_vhost_driver_attach_vdpa_device(const char *path, int did); /** @@ -283,7 +334,8 @@ rte_vhost_driver_attach_vdpa_device(const char *path, int did); * @return * 0 on success, -1 on failure */ -int __rte_experimental +__rte_experimental +int rte_vhost_driver_detach_vdpa_device(const char *path); /** @@ -294,7 +346,8 @@ rte_vhost_driver_detach_vdpa_device(const char *path); * @return * Device id, -1 on failure */ -int __rte_experimental +__rte_experimental +int rte_vhost_driver_get_vdpa_device_id(const char *path); /** @@ -352,6 +405,21 @@ int rte_vhost_driver_disable_features(const char *path, uint64_t features); */ int rte_vhost_driver_get_features(const char *path, uint64_t *features); +/** + * Set the protocol feature bits before feature negotiation. + * + * @param path + * The vhost-user socket file path + * @param protocol_features + * Supported protocol features + * @return + * 0 on success, -1 on failure + */ +__rte_experimental +int +rte_vhost_driver_set_protocol_features(const char *path, + uint64_t protocol_features); + /** * Get the protocol feature bits before feature negotiation. * @@ -362,7 +430,8 @@ int rte_vhost_driver_get_features(const char *path, uint64_t *features); * @return * 0 on success, -1 on failure */ -int __rte_experimental +__rte_experimental +int rte_vhost_driver_get_protocol_features(const char *path, uint64_t *protocol_features); @@ -376,7 +445,8 @@ rte_vhost_driver_get_protocol_features(const char *path, * @return * 0 on success, -1 on failure */ -int __rte_experimental +__rte_experimental +int rte_vhost_driver_get_queue_num(const char *path, uint32_t *queue_num); /** @@ -488,7 +558,7 @@ int rte_vhost_get_ifname(int vid, char *buf, size_t len); * virtio queue index * * @return - * num of avail entires left + * num of avail entries left */ uint16_t rte_vhost_avail_entries(int vid, uint16_t queue_id); @@ -536,7 +606,7 @@ uint16_t rte_vhost_dequeue_burst(int vid, uint16_t queue_id, /** * Get guest mem table: a list of memory regions. * - * An rte_vhost_vhost_memory object will be allocated internaly, to hold the + * An rte_vhost_vhost_memory object will be allocated internally, to hold the * guest memory regions. Application should free it at destroy_device() * callback. * @@ -601,7 +671,8 @@ uint32_t rte_vhost_rx_queue_count(int vid, uint16_t qid); * @return * 0 on success, -1 on failure */ -int __rte_experimental +__rte_experimental +int rte_vhost_get_log_base(int vid, uint64_t *log_base, uint64_t *log_size); /** @@ -618,7 +689,8 @@ rte_vhost_get_log_base(int vid, uint64_t *log_base, uint64_t *log_size); * @return * 0 on success, -1 on failure */ -int __rte_experimental +__rte_experimental +int rte_vhost_get_vring_base(int vid, uint16_t queue_id, uint16_t *last_avail_idx, uint16_t *last_used_idx); @@ -636,10 +708,28 @@ rte_vhost_get_vring_base(int vid, uint16_t queue_id, * @return * 0 on success, -1 on failure */ -int __rte_experimental +__rte_experimental +int rte_vhost_set_vring_base(int vid, uint16_t queue_id, uint16_t last_avail_idx, uint16_t last_used_idx); +/** + * Register external message handling callbacks + * + * @param vid + * vhost device ID + * @param ops + * virtio external callbacks to register + * @param ctx + * additional context passed to the callbacks + * @return + * 0 on success, -1 on failure + */ +__rte_experimental +int +rte_vhost_extern_callback_register(int vid, + struct rte_vhost_user_extern_ops const * const ops, void *ctx); + /** * Get vdpa device id for vhost device. * @@ -648,7 +738,8 @@ rte_vhost_set_vring_base(int vid, uint16_t queue_id, * @return * device id */ -int __rte_experimental +__rte_experimental +int rte_vhost_get_vdpa_device_id(int vid); #ifdef __cplusplus