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 656F743C60 for ; Thu, 7 Mar 2024 02:36:45 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 5620342EE3; Thu, 7 Mar 2024 02:36:45 +0100 (CET) Received: from mail-wm1-f49.google.com (mail-wm1-f49.google.com [209.85.128.49]) by mails.dpdk.org (Postfix) with ESMTP id 918B042EE3 for ; Thu, 7 Mar 2024 02:36:43 +0100 (CET) Received: by mail-wm1-f49.google.com with SMTP id 5b1f17b1804b1-412fe981ef1so2032375e9.1 for ; Wed, 06 Mar 2024 17:36:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1709775403; x=1710380203; darn=dpdk.org; 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=VRufgISMDjViC+lzlEQ62ukjE4jflRbegz4VdJ92CXg=; b=mMGGllrHgXcAJOhn3g1BW7fHWwIRuXh8kiQuoRLwX0wDjQr2AfRq9mrgdkfxgomhUZ NUGTKRk+BehaADfYfZ6brg6byW8ZHt0fzETkH43WqXe2W4p5rVTzCCRIqp6LZd17HpAd v7VP3Ax/tQR3M2zORPAwDrnHpUxkZlkrwkso2OP89hzEciqjcRVCGn0pVidu8ouMy1dS Fef48sBJSTTYVkBcbptE46Ilp9w8os9kC4uc5Lp8mhLgjPUMkXEwiW2OBxawhh6Bft7R szpL/eG+W/juUAzPor/xiwZAete/hjwmZp2K9f0XVxRGUne+ztOs+lmv2FgNgEidcyaF HSnA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709775403; x=1710380203; 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=VRufgISMDjViC+lzlEQ62ukjE4jflRbegz4VdJ92CXg=; b=cUp9mh8ig0be4XRnN/Nfoyu2CPjF+aydrCc64ehoF8ys9dZPymAYjdDCeVLcznXDbp j5M/I3Bcw0MM6X/CN9JaRtYX+3UWweG9dn+E0ulFpmxmnwdQDcElNT/M0Kry5ivfJM+T l4D76CdKGF4hSjR9Wt35CquDVxwjKG5WzkOEp1WsbYPeJ00SLs/ij0TXt5XbLZBqj+NV 9DRdH5vfhcVcLBYLC51JLfV25XLvgI9dGKF2Pp2SugwfrlXCluYhYUuE0xoMkKHTj0eh q2JsT6wadOlzW/tB1A7eP6Kil6WJPHSnDNnYO7KUVQqG9PSf9nuEgYfSSD0GAIIa4SYD LHww== X-Gm-Message-State: AOJu0YxQQaAN4qty2M7Wzo5zONggGj1yY1lSZGy8kAla+vEeywqqKmna AOv9fKXtQeL8Y6BCADJbG8d5pLU94rhknWFSw2x6nEufOh65H+o5S1QR7cNb9mQ= X-Google-Smtp-Source: AGHT+IFI6ilRxBaFaotbl7rCI3+hvzkU0EVS1vRuXJtf8xOhmCMYExWp4Lxcu/31sFef/2Z+y7OhKw== X-Received: by 2002:a05:600c:1c23:b0:412:f0cc:2e60 with SMTP id j35-20020a05600c1c2300b00412f0cc2e60mr55822wms.3.1709775403192; Wed, 06 Mar 2024 17:36:43 -0800 (PST) Received: from localhost ([137.220.120.171]) by smtp.gmail.com with ESMTPSA id t7-20020a05600c450700b00413103af563sm280202wmo.0.2024.03.06.17.36.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Mar 2024 17:36:42 -0800 (PST) From: luca.boccassi@gmail.com To: Long Li Cc: dpdk stable Subject: patch 'net/mana: handle MR cache expansion failure' has been queued to stable release 22.11.5 Date: Thu, 7 Mar 2024 01:31:37 +0000 Message-Id: <20240307013159.1735343-80-luca.boccassi@gmail.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240307013159.1735343-1-luca.boccassi@gmail.com> References: <20240307013159.1735343-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 22.11.5 Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet. It will be pushed if I get no objections before 03/09/24. 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/bluca/dpdk-stable This queued commit can be viewed at: https://github.com/bluca/dpdk-stable/commit/706c98e249c6273c7006a599dbffca14bb731a1c Thanks. Luca Boccassi --- >From 706c98e249c6273c7006a599dbffca14bb731a1c Mon Sep 17 00:00:00 2001 From: Long Li Date: Thu, 8 Feb 2024 16:05:04 -0800 Subject: [PATCH] net/mana: handle MR cache expansion failure [ upstream commit 0c7bc26bb0b39bfe8999f422329bd52861b43a72 ] On MR cache expansion failure, the request should fail as there is no path to get a new MR into the tree. Attempting to insert a new MR to the cache tree will result in memory violation. Fixes: 0f5db3c68ba7 ("net/mana: implement memory registration") Signed-off-by: Long Li --- drivers/net/mana/mana.h | 6 +++--- drivers/net/mana/mr.c | 45 ++++++++++++++++++++++++++++------------- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/drivers/net/mana/mana.h b/drivers/net/mana/mana.h index f70a3e0b3d..57576c62e4 100644 --- a/drivers/net/mana/mana.h +++ b/drivers/net/mana/mana.h @@ -517,9 +517,9 @@ void mana_del_pmd_mr(struct mana_mr_cache *mr); void mana_mempool_chunk_cb(struct rte_mempool *mp, void *opaque, struct rte_mempool_memhdr *memhdr, unsigned int idx); -struct mana_mr_cache *mana_mr_btree_lookup(struct mana_mr_btree *bt, - uint16_t *idx, - uintptr_t addr, size_t len); +int mana_mr_btree_lookup(struct mana_mr_btree *bt, uint16_t *idx, + uintptr_t addr, size_t len, + struct mana_mr_cache **cache); int mana_mr_btree_insert(struct mana_mr_btree *bt, struct mana_mr_cache *entry); int mana_mr_btree_init(struct mana_mr_btree *bt, int n, int socket); void mana_mr_btree_free(struct mana_mr_btree *bt); diff --git a/drivers/net/mana/mr.c b/drivers/net/mana/mr.c index dfb2412834..eb6d073a95 100644 --- a/drivers/net/mana/mr.c +++ b/drivers/net/mana/mr.c @@ -137,8 +137,12 @@ mana_find_pmd_mr(struct mana_mr_btree *local_mr_btree, struct mana_priv *priv, try_again: /* First try to find the MR in local queue tree */ - mr = mana_mr_btree_lookup(local_mr_btree, &idx, - (uintptr_t)mbuf->buf_addr, mbuf->buf_len); + ret = mana_mr_btree_lookup(local_mr_btree, &idx, + (uintptr_t)mbuf->buf_addr, mbuf->buf_len, + &mr); + if (ret) + return NULL; + if (mr) { DP_LOG(DEBUG, "Local mr lkey %u addr 0x%" PRIxPTR " len %zu", mr->lkey, mr->addr, mr->len); @@ -147,11 +151,14 @@ try_again: /* If not found, try to find the MR in global tree */ rte_spinlock_lock(&priv->mr_btree_lock); - mr = mana_mr_btree_lookup(&priv->mr_btree, &idx, - (uintptr_t)mbuf->buf_addr, - mbuf->buf_len); + ret = mana_mr_btree_lookup(&priv->mr_btree, &idx, + (uintptr_t)mbuf->buf_addr, + mbuf->buf_len, &mr); rte_spinlock_unlock(&priv->mr_btree_lock); + if (ret) + return NULL; + /* If found in the global tree, add it to the local tree */ if (mr) { ret = mana_mr_btree_insert(local_mr_btree, mr); @@ -227,22 +234,23 @@ mana_mr_btree_expand(struct mana_mr_btree *bt, int n) /* * Look for a region of memory in MR cache. */ -struct mana_mr_cache * -mana_mr_btree_lookup(struct mana_mr_btree *bt, uint16_t *idx, - uintptr_t addr, size_t len) +int mana_mr_btree_lookup(struct mana_mr_btree *bt, uint16_t *idx, + uintptr_t addr, size_t len, + struct mana_mr_cache **cache) { struct mana_mr_cache *table; uint16_t n; uint16_t base = 0; int ret; + *cache = NULL; + n = bt->len; - /* Try to double the cache if it's full */ if (n == bt->size) { ret = mana_mr_btree_expand(bt, bt->size << 1); if (ret) - return NULL; + return ret; } table = bt->table; @@ -261,14 +269,16 @@ mana_mr_btree_lookup(struct mana_mr_btree *bt, uint16_t *idx, *idx = base; - if (addr + len <= table[base].addr + table[base].len) - return &table[base]; + if (addr + len <= table[base].addr + table[base].len) { + *cache = &table[base]; + return 0; + } DP_LOG(DEBUG, "addr 0x%" PRIxPTR " len %zu idx %u sum 0x%" PRIxPTR " not found", addr, len, *idx, addr + len); - return NULL; + return 0; } int @@ -313,14 +323,21 @@ mana_mr_btree_insert(struct mana_mr_btree *bt, struct mana_mr_cache *entry) struct mana_mr_cache *table; uint16_t idx = 0; uint16_t shift; + int ret; - if (mana_mr_btree_lookup(bt, &idx, entry->addr, entry->len)) { + ret = mana_mr_btree_lookup(bt, &idx, entry->addr, entry->len, &table); + if (ret) + return ret; + + if (table) { DP_LOG(DEBUG, "Addr 0x%" PRIxPTR " len %zu exists in btree", entry->addr, entry->len); return 0; } if (bt->len >= bt->size) { + DP_LOG(ERR, "Btree overflow detected len %u size %u", + bt->len, bt->size); bt->overflow = 1; return -1; } -- 2.39.2 --- Diff of the applied patch vs upstream commit (please double-check if non-empty: --- --- - 2024-03-07 01:05:41.565493933 +0000 +++ 0080-net-mana-handle-MR-cache-expansion-failure.patch 2024-03-07 01:05:34.934942903 +0000 @@ -1 +1 @@ -From 0c7bc26bb0b39bfe8999f422329bd52861b43a72 Mon Sep 17 00:00:00 2001 +From 706c98e249c6273c7006a599dbffca14bb731a1c Mon Sep 17 00:00:00 2001 @@ -5,0 +6,2 @@ +[ upstream commit 0c7bc26bb0b39bfe8999f422329bd52861b43a72 ] + @@ -11 +12,0 @@ -Cc: stable@dpdk.org @@ -20 +21 @@ -index 4c56e6f746..3626925871 100644 +index f70a3e0b3d..57576c62e4 100644 @@ -23 +24 @@ -@@ -523,9 +523,9 @@ void mana_del_pmd_mr(struct mana_mr_cache *mr); +@@ -517,9 +517,9 @@ void mana_del_pmd_mr(struct mana_mr_cache *mr); @@ -37 +38 @@ -index c9d0f7ef5a..c4045141bc 100644 +index dfb2412834..eb6d073a95 100644 @@ -40 +41 @@ -@@ -138,8 +138,12 @@ mana_alloc_pmd_mr(struct mana_mr_btree *local_mr_btree, struct mana_priv *priv, +@@ -137,8 +137,12 @@ mana_find_pmd_mr(struct mana_mr_btree *local_mr_btree, struct mana_priv *priv, @@ -55 +56 @@ -@@ -148,11 +152,14 @@ try_again: +@@ -147,11 +151,14 @@ try_again: @@ -73 +74 @@ -@@ -228,22 +235,23 @@ mana_mr_btree_expand(struct mana_mr_btree *bt, int n) +@@ -227,22 +234,23 @@ mana_mr_btree_expand(struct mana_mr_btree *bt, int n) @@ -102 +103 @@ -@@ -262,14 +270,16 @@ mana_mr_btree_lookup(struct mana_mr_btree *bt, uint16_t *idx, +@@ -261,14 +269,16 @@ mana_mr_btree_lookup(struct mana_mr_btree *bt, uint16_t *idx, @@ -122 +123 @@ -@@ -314,14 +324,21 @@ mana_mr_btree_insert(struct mana_mr_btree *bt, struct mana_mr_cache *entry) +@@ -313,14 +323,21 @@ mana_mr_btree_insert(struct mana_mr_btree *bt, struct mana_mr_cache *entry)