vhost: add device op when notification to guest is sent
[dpdk.git] / lib / librte_vhost / rte_vhost.h
index c9c3929..878e339 100644 (file)
@@ -23,6 +23,7 @@ extern "C" {
 /* These are not C++-aware. */
 #include <linux/vhost.h>
 #include <linux/virtio_ring.h>
+#include <linux/virtio_net.h>
 
 #define RTE_VHOST_USER_CLIENT          (1ULL << 0)
 #define RTE_VHOST_USER_NO_RECONNECT    (1ULL << 1)
@@ -121,47 +122,34 @@ enum rte_vhost_msg_result {
        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 handler specific vhost user
- * messages prior to the master message handling
+ * Function prototype for the vhost backend to handle specific vhost user
+ * messages.
  *
  * @param vid
  *  vhost device id
  * @param msg
  *  Message pointer.
- * @param skip_master
- *  If the handler requires skipping the master message handling, this variable
- *  shall be written 1, otherwise 0.
  * @return
- *  VH_RESULT_OK on success, VH_RESULT_REPLY on success with reply,
- *  VH_RESULT_ERR on failure
+ *  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_pre_handle)(int vid,
-               void *msg, uint32_t *skip_master);
-
-/**
- * Function prototype for the vhost backend to handler specific vhost user
- * messages after the master message handling is done
- *
- * @param vid
- *  vhost device id
- * @param msg
- *  Message pointer.
- * @return
- *  VH_RESULT_OK on success, VH_RESULT_REPLY on success with reply,
- *  VH_RESULT_ERR on failure
- */
-typedef enum rte_vhost_msg_result (*rte_vhost_msg_post_handle)(int vid,
-               void *msg);
+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 {
-       rte_vhost_msg_pre_handle pre_msg_handle;
-       rte_vhost_msg_post_handle post_msg_handle;
+       /* 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;
 };
 
 /**
@@ -184,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 */
 };
 
 /**
@@ -325,7 +321,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);
 
 /**
@@ -336,7 +333,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);
 
 /**
@@ -347,7 +345,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);
 
 /**
@@ -415,7 +414,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_set_protocol_features(const char *path,
                uint64_t protocol_features);
 
@@ -429,7 +429,8 @@ rte_vhost_driver_set_protocol_features(const char *path,
  * @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);
 
@@ -443,7 +444,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);
 
 /**
@@ -555,7 +557,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);
 
@@ -603,7 +605,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.
  *
@@ -668,7 +670,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);
 
 /**
@@ -685,7 +688,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);
 
@@ -703,7 +707,8 @@ 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);
 
@@ -719,7 +724,8 @@ rte_vhost_set_vring_base(int vid, uint16_t queue_id,
  * @return
  *  0 on success, -1 on failure
  */
-int __rte_experimental
+__rte_experimental
+int
 rte_vhost_extern_callback_register(int vid,
                struct rte_vhost_user_extern_ops const * const ops, void *ctx);
 
@@ -731,7 +737,8 @@ rte_vhost_extern_callback_register(int vid,
  * @return
  *  device id
  */
-int __rte_experimental
+__rte_experimental
+int
 rte_vhost_get_vdpa_device_id(int vid);
 
 #ifdef __cplusplus