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 23B9A4563B for ; Wed, 17 Jul 2024 22:38:36 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 1DA91406B4; Wed, 17 Jul 2024 22:38:36 +0200 (CEST) Received: from mail-qt1-f179.google.com (mail-qt1-f179.google.com [209.85.160.179]) by mails.dpdk.org (Postfix) with ESMTP id F353D40669 for ; Wed, 17 Jul 2024 22:38:34 +0200 (CEST) Received: by mail-qt1-f179.google.com with SMTP id d75a77b69052e-44953ab0e2bso500011cf.0 for ; Wed, 17 Jul 2024 13:38:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=atomicrules-com.20230601.gappssmtp.com; s=20230601; t=1721248714; x=1721853514; 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=NnRDC2Bkd+j4OT83EUTWRdvBvnS6V791C+85OVeBMjA=; b=ZSEfuSUDUY0HuWgl0Fwb3PDrlTVnSUenqPf5v9kRlaQqaIAlBaE+pmBYB5aY2xoZE5 Lx9RnZ5XA0J81BlB2ep4UIiMWLjbwxTLjoJszFHYJx4eLp+mxOGPZ7n3eTE7svSjxwIe mM+L1ilBp34wObrkPEGz9P//DZ8FFq7wVvnCRoBVY8C3wbOjZe2IMrx09+vqOhsM11jT jNrV6v2RL1Lj1SIeo5dBH3bfjz5i2ZhqyS3I901vCbOD8bNmqHdhNKHNS1VxoS0I0p9v uccLvHYueDBycsBCIEBYD1Py+QaMt/UQpEeOf/PxeJ+x/HTBoHaOilh2Tmlf9ZZvO93h SGtw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1721248714; x=1721853514; 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=NnRDC2Bkd+j4OT83EUTWRdvBvnS6V791C+85OVeBMjA=; b=EOE32GS5khyGd2sGZfT3M8GKwimqFbdYBexN3Ap6hmoYhtkiFSdb189m4SRhhZ0MhJ f/vtsZSSnEsX5IEUKHpcosuxTJbdY0CZCe3H2fLVVQ7XfoDmqj65kFeYBjb9Ve0FJeSr eqiGXGFVVzNHtVDNA98+mDQGx5r1GtP8X61uUaOLP1Rak5eBm/6nlbMStU7nhdMi2J0Y 9vyx2I1m/FrbdPoHwViSPdJKgG17jxm7C72l9/2CAPTXwRBEP0lUS8lJRWCgwvd3PGlW yaX/oNaz4312shom56igDhTclW8+uLulQ9+9RHVBt29++K8KtRIvlbILTRLJSev5nLYS oB1w== X-Gm-Message-State: AOJu0Yy2ykAfwFjDWXyhDTt4IoEWs78ydEp1gmvjatNFpCbSVBMSwU9n FHSWOL9ZbUz1Rn16Dd+4nTJvePX3TZ539zLJx4NS3GbvEZRIel6ITiXBdfEYNg== X-Google-Smtp-Source: AGHT+IFTPj6CdRDNCyq8RnNMTuup9yBYtmNXhUe1RBzwgZsHPEjD9aohYOfy+uD1Tz3zGViKwFxGTA== X-Received: by 2002:ad4:596a:0:b0:6b5:88:7cc8 with SMTP id 6a1803df08f44-6b78c9fb6e1mr42609176d6.7.1721248714280; Wed, 17 Jul 2024 13:38:34 -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 6a1803df08f44-6b79c609694sm2012176d6.91.2024.07.17.13.38.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Jul 2024 13:38:33 -0700 (PDT) From: Ed Czeck To: dev@dpdk.org, ferruh.yigit@amd.com Cc: stable@dpdk.org, Shepard Siegel , John Miller Subject: [PATCH v5] net/ark: fix index arithmetic bug Date: Wed, 17 Jul 2024 16:38:30 -0400 Message-Id: <20240717203830.2648483-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: 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 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 --- v5: * fix typo in comment v4: * fix typo in comment 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..ca6cd297a1 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 up to or slightly beyond + * prod_index_limit. Prod_index will increment 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