Hi Jin,

On 6/26/19 6:38 PM, JinYu wrote:
This patch introduces two new messages VHOST_USER_GET_INFLIGHT_FD
and VHOST_USER_SET_INFLIGHT_FD to support transferring a shared
buffer between qemu and backend.

Firstly, qemu uses VHOST_USER_GET_INFLIGHT_FD to get the
shared buffer from backend. Then qemu should send it back
through VHOST_USER_SET_INFLIGHT_FD each time we start vhost-user.

This shared buffer is used to process inflight I/O when backend
reconnect.

Signed-off-by: LinLi <[email protected]>
Signed-off-by: XunNi <[email protected]>
Signed-off-by: YuZhang <[email protected]>
Signed-off-by: JinYu <[email protected]>
---
V1 - specify the APIs are split-ring only
---
  lib/librte_vhost/rte_vhost.h           |  99 +++++++++
  lib/librte_vhost/rte_vhost_version.map |   4 +
  lib/librte_vhost/vhost.c               | 135 ++++++++++++
  lib/librte_vhost/vhost.h               |  12 +
  lib/librte_vhost/vhost_user.c          | 292 +++++++++++++++++++++++++
  lib/librte_vhost/vhost_user.h          |  13 +-
  6 files changed, 554 insertions(+), 1 deletion(-)

diff --git a/lib/librte_vhost/rte_vhost.h b/lib/librte_vhost/rte_vhost.h
index 0226b3eff..c9959c15a 100644
--- a/lib/librte_vhost/rte_vhost.h
+++ b/lib/librte_vhost/rte_vhost.h
@@ -71,6 +71,10 @@ extern "C" {
  #define VHOST_USER_PROTOCOL_F_HOST_NOTIFIER 11
  #endif
+#ifndef VHOST_USER_PROTOCOL_F_INFLIGHT_SHMFD
+#define VHOST_USER_PROTOCOL_F_INFLIGHT_SHMFD 12
+#endif
+
  /** Indicate whether protocol features negotiation is supported. */
  #ifndef VHOST_USER_F_PROTOCOL_FEATURES
  #define VHOST_USER_F_PROTOCOL_FEATURES        30
@@ -98,12 +102,41 @@ struct rte_vhost_memory {
        struct rte_vhost_mem_region regions[];
  };
+struct inflight_desc_split {
+       uint8_t         inflight;
+       uint8_t         padding[5];
+       uint16_t        next;
+       uint64_t        counter;
+};
+
+struct inflight_info_split {
+       uint64_t                features;
+       uint16_t                version;
+       uint16_t                desc_num;
+       uint16_t                last_inflight_io;
+       uint16_t                used_idx;
+       struct inflight_desc_split desc[0];
+};
+
+struct resubmit_desc {
+       uint16_t index;
+       uint64_t counter;
+};
+
+struct resubmit_info {
+       struct resubmit_desc    *resubmit_list;
+       uint16_t                resubmit_num;
+};
+
  struct rte_vhost_vring {
        struct vring_desc       *desc;
        struct vring_avail      *avail;
        struct vring_used       *used;
        uint64_t                log_guest_addr;
+ struct inflight_info_split *inflight;
+       struct resubmit_info    *resubmit_inflight;
+

This is breaking the ABI, and discussing with Tiwei, we think it could
be avoided by defining its own structure of inflight and inflight
resubmit pointers. More below:

        /** Deprecated, use rte_vhost_vring_call() instead. */
        int                     callfd;
@@ -603,6 +636,22 @@ uint16_t rte_vhost_dequeue_burst(int vid, uint16_t queue_id,
   */
  int rte_vhost_get_mem_table(int vid, struct rte_vhost_memory **mem);
+/**
+ * Get guest vring info, including the vring address, vring size, inflight, 
etc.
+ *
+ * @param vid
+ *  vhost device ID
+ * @param vring_idx
+ *  vring index
+ * @param vring
+ *  the structure to hold the requested vring info
+ * @return
+ *  0 on success, -1 on failure
+ */
+int __rte_experimental
+rte_vhost_get_vhost_vring_with_inflight_split(int vid, uint16_t vring_idx,
+                             struct rte_vhost_vring *vring);

Here a new API is introduced to get vting info with inflight.
It could be just changed to get only the inflight info. It means the
caller would first call rte_vhost_get_vhost_vring() and then the new
function, which I guess may be renamed to:

rte_vhost_get_vhost_vring_inflight_split

Other than that, the patch looks good to me.

(Next time, please run get_maintainer.sh script so that all the
maintainers are in Cc:).

Thanks,
Maxime

Reply via email to