patch 'vhost: add non-blocking API for posting interrupt' has been queued to stable release 20.11.7

luca.boccassi at gmail.com luca.boccassi at gmail.com
Sat Nov 5 18:11:21 CET 2022


Hi,

FYI, your patch has been queued to stable release 20.11.7

Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 11/07/22. So please
shout if anyone has objections.

Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.

Queued patches are on a temporary branch at:
https://github.com/kevintraynor/dpdk-stable

This queued commit can be viewed at:
https://github.com/kevintraynor/dpdk-stable/commit/03d4ba0fe38dc41ef55878d34b19fc0c774e3637

Thanks.

Luca Boccassi

---
>From 03d4ba0fe38dc41ef55878d34b19fc0c774e3637 Mon Sep 17 00:00:00 2001
From: Changpeng Liu <changpeng.liu at intel.com>
Date: Mon, 17 Oct 2022 15:48:17 +0800
Subject: [PATCH] vhost: add non-blocking API for posting interrupt

[ upstream commit 830f7e790732b3a4b8830b181d399e317098d291 ]

Vhost-user library locks all VQ's access lock when processing
vring based messages, such as SET_VRING_KICK and SET_VRING_CALL,
and the data processing thread may already be started, e.g: SPDK
vhost-blk and vhost-scsi will start the data processing thread
when one vring is ready, then deadlock may happen when SPDK is
posting interrupts to VM.  Here, we add a new API which allows
caller to try again later for this case.

Bugzilla ID: 1015
Fixes: c5736998305d ("vhost: fix missing virtqueue lock protection")

Signed-off-by: Changpeng Liu <changpeng.liu at intel.com>
Reviewed-by: Chenbo Xia <chenbo.xia at intel.com>
---
 doc/guides/prog_guide/vhost_lib.rst |  6 ++++++
 lib/librte_vhost/rte_vhost.h        | 15 +++++++++++++++
 lib/librte_vhost/version.map        |  3 +++
 lib/librte_vhost/vhost.c            | 30 +++++++++++++++++++++++++++++
 4 files changed, 54 insertions(+)

diff --git a/doc/guides/prog_guide/vhost_lib.rst b/doc/guides/prog_guide/vhost_lib.rst
index 8970db8e5c..68fae4dc04 100644
--- a/doc/guides/prog_guide/vhost_lib.rst
+++ b/doc/guides/prog_guide/vhost_lib.rst
@@ -271,6 +271,12 @@ The following is an overview of some key Vhost API functions:
   Poll enqueue completion status from async data path. Completed packets
   are returned to applications through ``pkts``.
 
+* ``rte_vhost_vring_call_nonblock(int vid, uint16_t vring_idx)``
+
+  Notify the guest that used descriptors have been added to the vring. This function
+  will return -EAGAIN when vq's access lock is held by other thread, user should try
+  again later.
+
 Vhost-user Implementations
 --------------------------
 
diff --git a/lib/librte_vhost/rte_vhost.h b/lib/librte_vhost/rte_vhost.h
index 39fe428079..bafb176727 100644
--- a/lib/librte_vhost/rte_vhost.h
+++ b/lib/librte_vhost/rte_vhost.h
@@ -889,6 +889,21 @@ rte_vhost_clr_inflight_desc_packed(int vid, uint16_t vring_idx,
  */
 int rte_vhost_vring_call(int vid, uint16_t vring_idx);
 
+/**
+ * Notify the guest that used descriptors have been added to the vring.  This
+ * function acts as a memory barrier.  This function will return -EAGAIN when
+ * vq's access lock is held by other thread, user should try again later.
+ *
+ * @param vid
+ *  vhost device ID
+ * @param vring_idx
+ *  vring index
+ * @return
+ *  0 on success, -1 on failure, -EAGAIN for another retry
+ */
+__rte_experimental
+int rte_vhost_vring_call_nonblock(int vid, uint16_t vring_idx);
+
 /**
  * Get vhost RX queue avail count.
  *
diff --git a/lib/librte_vhost/version.map b/lib/librte_vhost/version.map
index 9183d6f2fc..6a7254f2c6 100644
--- a/lib/librte_vhost/version.map
+++ b/lib/librte_vhost/version.map
@@ -76,4 +76,7 @@ EXPERIMENTAL {
 	rte_vhost_async_channel_unregister;
 	rte_vhost_submit_enqueue_burst;
 	rte_vhost_poll_enqueue_completed;
+
+	# added in 22.11
+	rte_vhost_vring_call_nonblock;
 };
diff --git a/lib/librte_vhost/vhost.c b/lib/librte_vhost/vhost.c
index 11704d4a5f..cc5855ecfd 100644
--- a/lib/librte_vhost/vhost.c
+++ b/lib/librte_vhost/vhost.c
@@ -1277,6 +1277,36 @@ rte_vhost_vring_call(int vid, uint16_t vring_idx)
 	return 0;
 }
 
+int
+rte_vhost_vring_call_nonblock(int vid, uint16_t vring_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;
+
+	if (!rte_spinlock_trylock(&vq->access_lock))
+		return -EAGAIN;
+
+	if (vq_is_packed(dev))
+		vhost_vring_call_packed(dev, vq);
+	else
+		vhost_vring_call_split(dev, vq);
+
+	rte_spinlock_unlock(&vq->access_lock);
+
+	return 0;
+}
+
 uint16_t
 rte_vhost_avail_entries(int vid, uint16_t queue_id)
 {
-- 
2.34.1

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2022-11-05 17:11:10.596242782 +0000
+++ 0022-vhost-add-non-blocking-API-for-posting-interrupt.patch	2022-11-05 17:11:08.642941955 +0000
@@ -1 +1 @@
-From 830f7e790732b3a4b8830b181d399e317098d291 Mon Sep 17 00:00:00 2001
+From 03d4ba0fe38dc41ef55878d34b19fc0c774e3637 Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit 830f7e790732b3a4b8830b181d399e317098d291 ]
+
@@ -16 +17,0 @@
-Cc: stable at dpdk.org
@@ -21,6 +22,5 @@
- doc/guides/prog_guide/vhost_lib.rst    |  6 ++++++
- doc/guides/rel_notes/release_22_11.rst |  6 ++++++
- lib/vhost/rte_vhost.h                  | 15 +++++++++++++
- lib/vhost/version.map                  |  1 +
- lib/vhost/vhost.c                      | 30 ++++++++++++++++++++++++++
- 5 files changed, 58 insertions(+)
+ doc/guides/prog_guide/vhost_lib.rst |  6 ++++++
+ lib/librte_vhost/rte_vhost.h        | 15 +++++++++++++++
+ lib/librte_vhost/version.map        |  3 +++
+ lib/librte_vhost/vhost.c            | 30 +++++++++++++++++++++++++++++
+ 4 files changed, 54 insertions(+)
@@ -29 +29 @@
-index 0d9eca1f7d..e8bb8c9b7b 100644
+index 8970db8e5c..68fae4dc04 100644
@@ -32,3 +32,3 @@
-@@ -297,6 +297,12 @@ The following is an overview of some key Vhost API functions:
-   Clear in-flight packets which are submitted to async channel in vhost async data
-   path. Completed packets are returned to applications through ``pkts``.
+@@ -271,6 +271,12 @@ The following is an overview of some key Vhost API functions:
+   Poll enqueue completion status from async data path. Completed packets
+   are returned to applications through ``pkts``.
@@ -42,18 +42,2 @@
- * ``rte_vhost_vring_stats_get_names(int vid, uint16_t queue_id, struct rte_vhost_stat_name *names, unsigned int size)``
- 
-   This function returns the names of the queue statistics. It requires
-diff --git a/doc/guides/rel_notes/release_22_11.rst b/doc/guides/rel_notes/release_22_11.rst
-index c62acde891..6722832f3f 100644
---- a/doc/guides/rel_notes/release_22_11.rst
-+++ b/doc/guides/rel_notes/release_22_11.rst
-@@ -188,6 +188,12 @@ New Features
-   Added support to unconfigure DMA vChannel that is no longer used
-   by the vhost library.
- 
-+* **Added non-blocking notify API to vhost library.**
-+
-+  Added ``rte_vhost_vring_call_nonblock`` API to notify the guest that
-+  used descriptors have been added to the vring in non-blocking way.
-+  User should check the return value of this API and try again if needed.
-+
- * **Added support for MACsec in rte_security.**
+ Vhost-user Implementations
+ --------------------------
@@ -61,6 +45,5 @@
-   Added MACsec transform for rte_security session and added new API
-diff --git a/lib/vhost/rte_vhost.h b/lib/vhost/rte_vhost.h
-index bb7d86a432..d22b25cd4e 100644
---- a/lib/vhost/rte_vhost.h
-+++ b/lib/vhost/rte_vhost.h
-@@ -909,6 +909,21 @@ rte_vhost_clr_inflight_desc_packed(int vid, uint16_t vring_idx,
+diff --git a/lib/librte_vhost/rte_vhost.h b/lib/librte_vhost/rte_vhost.h
+index 39fe428079..bafb176727 100644
+--- a/lib/librte_vhost/rte_vhost.h
++++ b/lib/librte_vhost/rte_vhost.h
+@@ -889,6 +889,21 @@ rte_vhost_clr_inflight_desc_packed(int vid, uint16_t vring_idx,
@@ -88,8 +71,10 @@
-diff --git a/lib/vhost/version.map b/lib/vhost/version.map
-index 0b61870870..d64786fa71 100644
---- a/lib/vhost/version.map
-+++ b/lib/vhost/version.map
-@@ -97,6 +97,7 @@ EXPERIMENTAL {
- 
- 	# added in 22.11
- 	rte_vhost_async_dma_unconfigure;
+diff --git a/lib/librte_vhost/version.map b/lib/librte_vhost/version.map
+index 9183d6f2fc..6a7254f2c6 100644
+--- a/lib/librte_vhost/version.map
++++ b/lib/librte_vhost/version.map
+@@ -76,4 +76,7 @@ EXPERIMENTAL {
+ 	rte_vhost_async_channel_unregister;
+ 	rte_vhost_submit_enqueue_burst;
+ 	rte_vhost_poll_enqueue_completed;
++
++	# added in 22.11
@@ -98,7 +83,5 @@
- 
- INTERNAL {
-diff --git a/lib/vhost/vhost.c b/lib/vhost/vhost.c
-index 1bb01c2a2e..19c7b92c32 100644
---- a/lib/vhost/vhost.c
-+++ b/lib/vhost/vhost.c
-@@ -1318,6 +1318,36 @@ rte_vhost_vring_call(int vid, uint16_t vring_idx)
+diff --git a/lib/librte_vhost/vhost.c b/lib/librte_vhost/vhost.c
+index 11704d4a5f..cc5855ecfd 100644
+--- a/lib/librte_vhost/vhost.c
++++ b/lib/librte_vhost/vhost.c
+@@ -1277,6 +1277,36 @@ rte_vhost_vring_call(int vid, uint16_t vring_idx)


More information about the stable mailing list