From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id AFC04A0543 for ; Sat, 5 Nov 2022 18:13:02 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id AB3DF42D1C; Sat, 5 Nov 2022 18:13:02 +0100 (CET) Received: from mail-wr1-f45.google.com (mail-wr1-f45.google.com [209.85.221.45]) by mails.dpdk.org (Postfix) with ESMTP id 473CD400D5 for ; Sat, 5 Nov 2022 18:13:01 +0100 (CET) Received: by mail-wr1-f45.google.com with SMTP id l14so10909160wrw.2 for ; Sat, 05 Nov 2022 10:13:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=HRmhbS8usi8UlmntVM9SD3JxqcKEjbrsjWI0KADlldc=; b=L0vViEx9pCdVVzrIIga7a3fbY1Oa/Dvss50ssaNgUxb6BBF3TqkZ/1VnBTXaIOYzvq p0f8VBxvXED1x/MJLYAvmuAC05Kps3sy0EZKCt21zUB1tR+cY2b1wKk8RCTokEPp7At6 tpj6BXk8rvItskrzuhvC58Su9ab1RXH+B9A5jqg4HuiRRvbGKtjAvPOX6sS60JqGyANI +FDkXZ4PdAw5JboV1l90JvkrFD6lnoM9Jxda9QwnB9zl5/T5Slk/JpsEcA6WzhN8UlWj Ueih3iQjRVF4EtBJblRyhUSahA7lYvZGnNtRoJfO1z/3/EMmBcm9cFXSCNG4qjLcUBK7 iCbw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=HRmhbS8usi8UlmntVM9SD3JxqcKEjbrsjWI0KADlldc=; b=zMAWKZx8zlYjkSO15axi2XlKCXMRKgfpdAjurNVEyJDpBLPYLhIR9d31dT1oRhuGPJ a86GcY0UlJ3spO1WhAea4L1qHn92YDzWcvMVJ+NbpQbVnjQWxml8ScwSIVPB9NXtT5hq 1cGYva0RM+/AI+eiSpof/O8UanN0CHLvm18+NfHBc7Kk1KaPE/3YA/VPNR7Jyur0reJU IXe/VMW7+XXrqaEpu1bsYvW4/gxdD6aF29WrMmk21Qkb3Gs9scnMXCj3EURz61Q4G4db crIFxwhrwP1NZIf4EmGHKg/2xbxOYY9QtQVLnFObkas8zZ2XwK12Gnjj7PGn7/h8PdkG y0Hw== X-Gm-Message-State: ACrzQf2/yBdn03+AKDT/aGzv+I1S+7kFrQhi1L3Ki1BnZCdzepr32Y/3 +EDjrsXiDCUY9u6EaYvkqyy5fawq/gk= X-Google-Smtp-Source: AMsMyM7fREEu6BigHkS97jHmb1eukazYpITpxIsXB1G6e62KSktgYZrThnfpOwKdcyTtAjZ8ff+Fig== X-Received: by 2002:adf:dd12:0:b0:236:6ef7:dacf with SMTP id a18-20020adfdd12000000b002366ef7dacfmr25812408wrm.204.1667668380976; Sat, 05 Nov 2022 10:13:00 -0700 (PDT) Received: from localhost ([2a01:4b00:d307:1000:f1d3:eb5e:11f4:a7d9]) by smtp.gmail.com with ESMTPSA id j27-20020a05600c1c1b00b003a8434530bbsm7026779wms.13.2022.11.05.10.13.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 05 Nov 2022 10:13:00 -0700 (PDT) From: luca.boccassi@gmail.com To: Changpeng Liu Cc: Chenbo Xia , dpdk stable Subject: patch 'vhost: add non-blocking API for posting interrupt' has been queued to stable release 20.11.7 Date: Sat, 5 Nov 2022 17:11:21 +0000 Message-Id: <20221105171146.1520039-22-luca.boccassi@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20221105171146.1520039-1-luca.boccassi@gmail.com> References: <20221103092758.1099402-100-luca.boccassi@gmail.com> <20221105171146.1520039-1-luca.boccassi@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org 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 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 Reviewed-by: Chenbo Xia --- 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@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)