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 244784563B; Wed, 17 Jul 2024 22:02:04 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 0139240669; Wed, 17 Jul 2024 22:02:04 +0200 (CEST) Received: from mail-qk1-f171.google.com (mail-qk1-f171.google.com [209.85.222.171]) by mails.dpdk.org (Postfix) with ESMTP id 60A27402B3 for ; Wed, 17 Jul 2024 22:02:02 +0200 (CEST) Received: by mail-qk1-f171.google.com with SMTP id af79cd13be357-79ef7635818so196485a.3 for ; Wed, 17 Jul 2024 13:02:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=atomicrules-com.20230601.gappssmtp.com; s=20230601; t=1721246521; x=1721851321; 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=kWAhM14x2VkxkFI9XoWSVcrU/k/eWN3ueMhPLChFXos=; b=lDKG3JdKSHzAwIeCuHr7+zNmuk5RccYWhNTH7UIOiXmaChuuRPMG6Eo1Ttod84HbQp OxucLYvon8+2lJZW0mb0Q4AKq2COe0HOoy7CMKRplv7k4mzpj1pSezTj6PDD2rZ5dZKN BjFLhquNfstbxh0tCvOG/jP6qt4EUkRGlz5vHtkGYWJx4DYunO9bolImM7HN+n4eN9Rx pL/TzMrAcKnLK/qmrV90YUU0l8DuIUjI/sKJJxwXCaigtAgyIeZeg8ziP5uUBcVMMDz0 8zrVowkj1NlVkDCMkSpp5QvI1YVoYMTdjUp9bPci7e3WvezminFjnA/eIM+ttU+gUOug Zbew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1721246521; x=1721851321; 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=kWAhM14x2VkxkFI9XoWSVcrU/k/eWN3ueMhPLChFXos=; b=lWq2TsxEqaKmdRnLyoQcHYtKb3qAEkjDDsa3jeL5Nj2ZdVv3/HbjAxiWyjrjb7RaMw smmevul6UtNO25ViNtFqUCNINMcTzghN6nJJnsVnEc3qJLbVClu+qOaD0OHZTU2qlWR2 tBZ/Skp63LxNCtYE7+At1+7TFRo9t1KFUcRoov2ubiencOeuG54JYxmIMwnks4Uo94DM Luaayb+bNUClbZK3WDX0eSzkoBodsz/WfR8wVJ0RWlrfZW9O8aF6e66LJ1tBlZlHqA+P GUb0Q7y/Ca6y2j7zTy1TjoBf6e39s/dHkM9Lpih5mPZEVbrADkJYFuuwWcNZQQjEgJTC hnrA== X-Gm-Message-State: AOJu0YztZb833MhQDz5KElvZLT/xYyQTjZZpesFvSWQJWtfx8lYFsRHc +DWMGDlEAmKYh8IERoS+ly+Wk+L6eE//g4gB/SbwekH7mWcP6/kIGepGXQnLaxeh+LKrQd9WnON gXw== X-Google-Smtp-Source: AGHT+IGY7Oqgn8z1w1F0fSOvjLIueUMVFU5jpauUk/M0ZmOBu1QIxzt8LyDrhioopHr9KA7dn/beAg== X-Received: by 2002:a05:620a:d8b:b0:79e:fd11:7ab3 with SMTP id af79cd13be357-7a1874e4743mr336476685a.46.1721246521142; Wed, 17 Jul 2024 13:02:01 -0700 (PDT) Received: from localhost.localdomain (pool-173-48-111-149.bstnma.fios.verizon.net. [173.48.111.149]) by smtp.gmail.com with ESMTPSA id af79cd13be357-7a160c637cesm441290885a.82.2024.07.17.13.02.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Jul 2024 13:02:00 -0700 (PDT) From: Ed Czeck To: dev@dpdk.org, ferruh.yigit@amd.com Cc: stable@dpdk.org, Shepard Siegel , John Miller Subject: [PATCH v3] net/ark: fix index arithmetic bug Date: Wed, 17 Jul 2024 16:01:49 -0400 Message-Id: <20240717200149.2646056-1-ed.czeck@atomicrules.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240716210631.2557642-1-ed.czeck@atomicrules.com> References: <20240716210631.2557642-1-ed.czeck@atomicrules.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Behavior for signed integer overflow is not defined which can causes undesired behavior at values near max and min bounds. The used of unsigned is defined as to use modulo arithmetic which is the desired behavior. This patch replaces int32_t with uint32_t except for necessary casts. Fixes: 9ee9e0d3b85e ("net/ark: update to reflect FPGA updates") Cc: stable@dpdk.org Signed-off-by: Ed Czeck --- v3: * Clarify commit message. int_32_t overflow is undefined, while uint32_t is defined as modulo. * Additional comments in code. v2: * update patch to apply to dpdk-next-net --- drivers/net/ark/ark_ethdev_tx.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/drivers/net/ark/ark_ethdev_tx.c b/drivers/net/ark/ark_ethdev_tx.c index 9c89c85f50..e8a4c617fc 100644 --- a/drivers/net/ark/ark_ethdev_tx.c +++ b/drivers/net/ark/ark_ethdev_tx.c @@ -39,8 +39,8 @@ struct __rte_cache_aligned ark_tx_queue { uint32_t queue_mask; /* 3 indexes to the paired data rings. */ - int32_t prod_index; /* where to put the next one */ - int32_t free_index; /* mbuf has been freed */ + uint32_t prod_index; /* where to put the next one */ + uint32_t free_index; /* mbuf has been freed */ /* The queue Id is used to identify the HW Q */ uint16_t phys_qid; @@ -49,7 +49,7 @@ struct __rte_cache_aligned ark_tx_queue { /* next cache line - fields written by device */ alignas(RTE_CACHE_LINE_MIN_SIZE) RTE_MARKER cacheline1; - volatile int32_t cons_index; /* hw is done, can be freed */ + volatile uint32_t cons_index; /* hw is done, can be freed */ }; /* Forward declarations */ @@ -108,7 +108,7 @@ eth_ark_xmit_pkts(void *vtxq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) uint32_t user_meta[5]; int stat; - int32_t prod_index_limit; + uint32_t prod_index_limit; uint16_t nb; uint8_t user_len = 0; const uint32_t min_pkt_len = ARK_MIN_TX_PKTLEN; @@ -123,8 +123,13 @@ eth_ark_xmit_pkts(void *vtxq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) /* leave 4 elements mpu data */ prod_index_limit = queue->queue_size + queue->free_index - 4; + /* Populate the buffer bringing prod_index upto or slightly beyond + * prod_index_limit. Prod_index will increament by 2 or more each + * iteration. Note: indexes are uint32_t, cast to (signed) int32_t + * to catch the slight overage case; e.g. (200 - 201) + */ for (nb = 0; - (nb < nb_pkts) && (prod_index_limit - queue->prod_index) > 0; + (nb < nb_pkts) && (int32_t)(prod_index_limit - queue->prod_index) > 0; ++nb) { mbuf = tx_pkts[nb]; @@ -194,13 +199,13 @@ eth_ark_tx_jumbo(struct ark_tx_queue *queue, struct rte_mbuf *mbuf, uint32_t *user_meta, uint8_t meta_cnt) { struct rte_mbuf *next; - int32_t free_queue_space; + uint32_t free_queue_space; uint8_t flags = ARK_DDM_SOP; free_queue_space = queue->queue_mask - (queue->prod_index - queue->free_index); /* We need up to 4 mbufs for first header and 2 for subsequent ones */ - if (unlikely(free_queue_space < (2 + (2 * mbuf->nb_segs)))) + if (unlikely(free_queue_space < (2U + (2U * mbuf->nb_segs)))) return -1; while (mbuf != NULL) { @@ -392,10 +397,11 @@ free_completed_tx(struct ark_tx_queue *queue) { struct rte_mbuf *mbuf; union ark_tx_meta *meta; - int32_t top_index; + uint32_t top_index; top_index = queue->cons_index; /* read once */ - while ((top_index - queue->free_index) > 0) { + + while ((int32_t)(top_index - queue->free_index) > 0) { meta = &queue->meta_q[queue->free_index & queue->queue_mask]; if (likely((meta->flags & ARK_DDM_SOP) != 0)) { mbuf = queue->bufs[queue->free_index & -- 2.34.1