From patchwork Mon Mar 5 15:59:59 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tomasz Kulasek X-Patchwork-Id: 35662 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 44A485F1F; Mon, 5 Mar 2018 17:00:18 +0100 (CET) Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by dpdk.org (Postfix) with ESMTP id 32B5D4C77 for ; Mon, 5 Mar 2018 17:00:16 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Mar 2018 08:00:14 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.47,427,1515484800"; d="scan'208";a="36070528" Received: from unknown (HELO Sent) ([10.103.102.195]) by orsmga001.jf.intel.com with SMTP; 05 Mar 2018 08:00:12 -0800 Received: by Sent (sSMTP sendmail emulation); Mon, 05 Mar 2018 17:00:11 +0100 From: Tomasz Kulasek To: yliu@fridaylinux.org Cc: daniel.verkamp@intel.com, james.r.harris@intel.com, pawelx.wodkowski@intel.com, dev@dpdk.org, Dariusz Stojaczyk Date: Mon, 5 Mar 2018 16:59:59 +0100 Message-Id: <20180305155959.21212-1-tomaszx.kulasek@intel.com> X-Mailer: git-send-email 2.16.1 Subject: [dpdk-dev] [PATCH] vhost: add API for getting last_idx of vrings X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" vhost-net devices might keep track of last descriptors indices by themselves, and assuming they initially start at 0, but that is not the case for vhost-scsi. Initial last descriptor indices are set via VHOST_USER_SET_VRING_BASE message, and we cannot possibly predict what will they be. Setting these to vqueue->used->idx is also not an option, because there might be some yet unprocessed requests between these and the actual last_idx. This patch adds API for getting/setting last descriptor indices of vrings, so that they can be synchronized between user-device and rte_vhost. The last_idx flow could be as following: * vhost start, * received SET_VRING_BASE msg, last_idx is set on rte_vhost side, * created user-device, last_idx pulled from rte_vhost, * requests are being processed by user-device, last_idx changes, * destroyed user-device, last_idx pushed to rte_vhost, * at this point, vrings could be recreated and another SET_VRING_BASE message could arrive, so last_idx would be set * recreated user-device, last_idx pulled from rte_vhost. Signed-off-by: Dariusz Stojaczyk Signed-off-by: Tomasz Kulasek --- lib/librte_vhost/rte_vhost.h | 24 ++++++++++++++++++++++++ lib/librte_vhost/vhost.c | 27 +++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/lib/librte_vhost/rte_vhost.h b/lib/librte_vhost/rte_vhost.h index d33206997..b9ba058d1 100644 --- a/lib/librte_vhost/rte_vhost.h +++ b/lib/librte_vhost/rte_vhost.h @@ -62,6 +62,9 @@ struct rte_vhost_vring { int kickfd; uint16_t size; + + uint16_t last_avail_idx; + uint16_t last_used_idx; }; /** @@ -434,6 +437,27 @@ int rte_vhost_vring_call(int vid, uint16_t vring_idx); */ uint32_t rte_vhost_rx_queue_count(int vid, uint16_t qid); +/** + * Set id of the last descriptors in avail and used guest vrings. + * + * In case user application operates directly on buffers, it should use this + * function on device destruction to retrieve the same values later on in device + * creation via rte_vhost_get_vhost_vring(int, uint16_t, struct rte_vhost_vring *) + * + * @param vid + * vhost device ID + * @param vring_idx + * vring index + * @param last_avail_idx + * id of the last descriptor in avail ring to be set + * @param last_used_idx + * id of the last descriptor in used ring to be set + * @return + * 0 on success, -1 on failure + */ +int rte_vhost_set_vhost_vring_last_idx(int vid, uint16_t vring_idx, + uint16_t last_avail_idx, uint16_t last_used_idx); + #ifdef __cplusplus } #endif diff --git a/lib/librte_vhost/vhost.c b/lib/librte_vhost/vhost.c index a407067e2..a82dc5a62 100644 --- a/lib/librte_vhost/vhost.c +++ b/lib/librte_vhost/vhost.c @@ -512,6 +512,9 @@ rte_vhost_get_vhost_vring(int vid, uint16_t vring_idx, vring->kickfd = vq->kickfd; vring->size = vq->size; + vring->last_avail_idx = vq->last_avail_idx; + vring->last_used_idx = vq->last_used_idx; + return 0; } @@ -627,3 +630,27 @@ rte_vhost_rx_queue_count(int vid, uint16_t qid) return *((volatile uint16_t *)&vq->avail->idx) - vq->last_avail_idx; } + +int +rte_vhost_set_vhost_vring_last_idx(int vid, uint16_t vring_idx, + uint16_t last_avail_idx, uint16_t last_used_idx) +{ + struct virtio_net *dev; + struct vhost_virtqueue *vq; + + dev = get_device(vid); + if (!dev) + return -1; + + if (vring_idx >= VHOST_MAX_VRING) + return -1; + + vq = dev->virtqueue[vring_idx]; + if (!vq) + return -1; + + vq->last_avail_idx = last_avail_idx; + vq->last_used_idx = last_used_idx; + + return 0; +}