/**
* Device and vring operations.
*/
-struct virtio_net_device_ops {
+struct vhost_device_ops {
int (*new_device)(int vid); /**< Add device. */
void (*destroy_device)(int vid); /**< Remove device. */
int (*vring_state_changed)(int vid, uint16_t queue_id, int enable); /**< triggered when a vring is enabled or disabled */
- void *reserved[5]; /**< Reserved for future extension */
+ /**
+ * Features could be changed after the feature negotiation.
+ * For example, VHOST_F_LOG_ALL will be set/cleared at the
+ * start/end of live migration, respectively. This callback
+ * is used to inform the application on such change.
+ */
+ int (*features_changed)(int vid, uint64_t features);
+
+ void *reserved[4]; /**< Reserved for future extension */
};
/**
return 0;
}
+#define RTE_VHOST_NEED_LOG(features) ((features) & (1ULL << VHOST_F_LOG_ALL))
+
+/**
+ * Log the memory write start with given address.
+ *
+ * This function only need be invoked when the live migration starts.
+ * Therefore, we won't need call it at all in the most of time. For
+ * making the performance impact be minimum, it's suggested to do a
+ * check before calling it:
+ *
+ * if (unlikely(RTE_VHOST_NEED_LOG(features)))
+ * rte_vhost_log_write(vid, addr, len);
+ *
+ * @param vid
+ * vhost device ID
+ * @param addr
+ * the starting address for write
+ * @param len
+ * the length to write
+ */
+void rte_vhost_log_write(int vid, uint64_t addr, uint64_t len);
+
+/**
+ * Log the used ring update start at given offset.
+ *
+ * Same as rte_vhost_log_write, it's suggested to do a check before
+ * calling it:
+ *
+ * if (unlikely(RTE_VHOST_NEED_LOG(features)))
+ * rte_vhost_log_used_vring(vid, vring_idx, offset, len);
+ *
+ * @param vid
+ * vhost device ID
+ * @param vring_idx
+ * the vring index
+ * @param offset
+ * the offset inside the used ring
+ * @param len
+ * the length to write
+ */
+void rte_vhost_log_used_vring(int vid, uint16_t vring_idx,
+ uint64_t offset, uint64_t len);
+
int rte_vhost_enable_guest_notification(int vid, uint16_t queue_id, int enable);
/**
/* Register callbacks. */
int rte_vhost_driver_callback_register(const char *path,
- struct virtio_net_device_ops const * const ops);
-/* Start vhost driver session blocking loop. */
-int rte_vhost_driver_session_start(void);
+ struct vhost_device_ops const * const ops);
+
+/**
+ *
+ * Start the vhost-user driver.
+ *
+ * This function triggers the vhost-user negotiation.
+ *
+ * @param path
+ * The vhost-user socket file path
+ * @return
+ * 0 on success, -1 on failure
+ */
+int rte_vhost_driver_start(const char *path);
/**
* Get the MTU value of the device if set in QEMU.
* is allocated.
*
* @param vid
- * virtio-net device ID
+ * vhost device ID
*
* @return
* The numa node, -1 on failure
* Get the number of queues the device supports.
*
* Note this function is deprecated, as it returns a queue pair number,
- * which is virtio-net specific. Instead, rte_vhost_get_vring_num should
+ * which is vhost specific. Instead, rte_vhost_get_vring_num should
* be used.
*
* @param vid
- * virtio-net device ID
+ * vhost device ID
*
* @return
* The number of queues, 0 on failure
* file path.
*
* @param vid
- * virtio-net device ID
+ * vhost device ID
* @param buf
* The buffer to stored the queried ifname
* @param len
* Get how many avail entries are left in the queue
*
* @param vid
- * virtio-net device ID
+ * vhost device ID
* @param queue_id
* virtio queue index
*
* count is returned to indicate the number of packets that were succesfully
* added to the RX queue.
* @param vid
- * virtio-net device ID
+ * vhost device ID
* @param queue_id
* virtio queue index in mq case
* @param pkts
* construct host mbufs, copies guest buffer content to host mbufs and
* store them in pkts to be processed.
* @param vid
- * virtio-net device
+ * vhost device ID
* @param queue_id
* virtio queue index in mq case
* @param mbuf_pool