From patchwork Mon Jan 3 14:22:01 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Andrzej Ostruszka X-Patchwork-Id: 105573 X-Patchwork-Delegate: david.marchand@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id DC36DA04A3; Mon, 3 Jan 2022 15:23:19 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id C93FF41141; Mon, 3 Jan 2022 15:23:19 +0100 (CET) Received: from mail-lj1-f173.google.com (mail-lj1-f173.google.com [209.85.208.173]) by mails.dpdk.org (Postfix) with ESMTP id B982C410E0 for ; Mon, 3 Jan 2022 15:23:18 +0100 (CET) Received: by mail-lj1-f173.google.com with SMTP id t2so4346988ljo.6 for ; Mon, 03 Jan 2022 06:23:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=kKD5oJ9I3HjP3Kul2CGaiVsddV3DusCGzMiY/on0koI=; b=5sRsvX88CRdl1A3dOrALFG5YQZrZ9e9sh7BOFAnfgQZSx588woIvbGsLEsmzbQ/d5c IIXvUnCDgcN4KJvM8fUxtfObmkjRWUp1CM5Ug0CZ+gS9AIdTt+DbGYOv4T0KWXNFDdQa BnjCy1fpdANuf8TS+uLuYHYuV2kQzWdTogIdwgJpjHmzr1pwezA+B1x2jcPHa8qHXCsq qrvkzb+1f3vwYq55k6Libvrx3jPYMYAN47bulWPYzKJTP+vPxJZRaPZW9a9Xz6nXEjzr fVBMn44eKzyD/HVv52fgUf4UbnXdHmwOLVZh3VANrHrOatKD0MTknFEOWCW2dt43jad8 kG+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=kKD5oJ9I3HjP3Kul2CGaiVsddV3DusCGzMiY/on0koI=; b=XNNfRwswCMT+djXW5ppeGMVa7IS8bURHF0AqEzOoyHgsnyWp8gjzrA7muWyUARgex9 TeLDnyasJq09LJRlnY+KyB4FxEszN4Jomq7CNKP5AXPfvVZez+Ka5qMmPvRcZ1Wmf8tr WwSu1lE9Tju2d4MtKJFJ7udDmqaWyt6jtEgzvTKlJuli/827/Q4ATafzvjG4bsSjc3el Q46mycgATYQBnPram6K6uLEyaEXCSQbRy12gxtfVivLrR+nbb/ohWzJ6wyU288cGYlJr AMgqYRvXBkiA7lEhNk69bT6tetxfVp6XKH4HaaiG8RhxAyg52RbmGr3Ygk2sQLordmcg CB2Q== X-Gm-Message-State: AOAM532t9MzTXV+g1ryvzDAeUfrgEH4JKGuwqJ4C27gqGu8yA5XvdrIe 6jnRu5Oy5s1rtcAVyL9DX5uHEt41za+qJg== X-Google-Smtp-Source: ABdhPJwDYkInDR66Xlab2lljIT0GOau5LZH1BHtv1ZKye+9ppfOuV4JhCa79H6hXLPARNPZCP5RSMA== X-Received: by 2002:a05:651c:114b:: with SMTP id h11mr38277649ljo.439.1641219798348; Mon, 03 Jan 2022 06:23:18 -0800 (PST) Received: from andrzejo-l.semihalf.net ([83.142.187.84]) by smtp.googlemail.com with ESMTPSA id p19sm3420800ljj.17.2022.01.03.06.23.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Jan 2022 06:23:18 -0800 (PST) From: Andrzej Ostruszka To: dev@dpdk.org Cc: upstream@semihalf.com, Andrzej Ostruszka Subject: [PATCH 1/1] ring: fix off by 1 mistake Date: Mon, 3 Jan 2022 15:22:01 +0100 Message-Id: <20220103142201.475552-2-amo@semihalf.com> X-Mailer: git-send-email 2.34.1.448.ga2b2bfdf31-goog In-Reply-To: <20220103142201.475552-1-amo@semihalf.com> References: <20220103142201.475552-1-amo@semihalf.com> MIME-Version: 1.0 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 When enqueueing/dequeueing to/from the ring we try to optimize by manual loop unrolling. The check for this optimization looks like: if (likely(idx + n < size)) { where 'idx' points to the first usable element (empty slot for enqueue, data for dequeue). The correct comparison here should be '<=' instead of '<'. This is not a functional error since we fall back to the loop with correct checks on indexes. Just a minor suboptimal behaviour for the case when we want to enqueue/dequeue exactly the number of elements that we have in the ring before wrapping to its beginning. Signed-off-by: Andrzej Ostruszka Reviewed-by: Morten Brørup Reviewed-by: Olivier Matz Acked-by: Konstantin Ananyev --- lib/ring/rte_ring_elem_pvt.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/ring/rte_ring_elem_pvt.h b/lib/ring/rte_ring_elem_pvt.h index 275ec55393..83788c56e6 100644 --- a/lib/ring/rte_ring_elem_pvt.h +++ b/lib/ring/rte_ring_elem_pvt.h @@ -17,7 +17,7 @@ __rte_ring_enqueue_elems_32(struct rte_ring *r, const uint32_t size, unsigned int i; uint32_t *ring = (uint32_t *)&r[1]; const uint32_t *obj = (const uint32_t *)obj_table; - if (likely(idx + n < size)) { + if (likely(idx + n <= size)) { for (i = 0; i < (n & ~0x7); i += 8, idx += 8) { ring[idx] = obj[i]; ring[idx + 1] = obj[i + 1]; @@ -62,7 +62,7 @@ __rte_ring_enqueue_elems_64(struct rte_ring *r, uint32_t prod_head, uint32_t idx = prod_head & r->mask; uint64_t *ring = (uint64_t *)&r[1]; const unaligned_uint64_t *obj = (const unaligned_uint64_t *)obj_table; - if (likely(idx + n < size)) { + if (likely(idx + n <= size)) { for (i = 0; i < (n & ~0x3); i += 4, idx += 4) { ring[idx] = obj[i]; ring[idx + 1] = obj[i + 1]; @@ -95,7 +95,7 @@ __rte_ring_enqueue_elems_128(struct rte_ring *r, uint32_t prod_head, uint32_t idx = prod_head & r->mask; rte_int128_t *ring = (rte_int128_t *)&r[1]; const rte_int128_t *obj = (const rte_int128_t *)obj_table; - if (likely(idx + n < size)) { + if (likely(idx + n <= size)) { for (i = 0; i < (n & ~0x1); i += 2, idx += 2) memcpy((void *)(ring + idx), (const void *)(obj + i), 32); @@ -151,7 +151,7 @@ __rte_ring_dequeue_elems_32(struct rte_ring *r, const uint32_t size, unsigned int i; uint32_t *ring = (uint32_t *)&r[1]; uint32_t *obj = (uint32_t *)obj_table; - if (likely(idx + n < size)) { + if (likely(idx + n <= size)) { for (i = 0; i < (n & ~0x7); i += 8, idx += 8) { obj[i] = ring[idx]; obj[i + 1] = ring[idx + 1]; @@ -196,7 +196,7 @@ __rte_ring_dequeue_elems_64(struct rte_ring *r, uint32_t prod_head, uint32_t idx = prod_head & r->mask; uint64_t *ring = (uint64_t *)&r[1]; unaligned_uint64_t *obj = (unaligned_uint64_t *)obj_table; - if (likely(idx + n < size)) { + if (likely(idx + n <= size)) { for (i = 0; i < (n & ~0x3); i += 4, idx += 4) { obj[i] = ring[idx]; obj[i + 1] = ring[idx + 1]; @@ -229,7 +229,7 @@ __rte_ring_dequeue_elems_128(struct rte_ring *r, uint32_t prod_head, uint32_t idx = prod_head & r->mask; rte_int128_t *ring = (rte_int128_t *)&r[1]; rte_int128_t *obj = (rte_int128_t *)obj_table; - if (likely(idx + n < size)) { + if (likely(idx + n <= size)) { for (i = 0; i < (n & ~0x1); i += 2, idx += 2) memcpy((void *)(obj + i), (void *)(ring + idx), 32); switch (n & 0x1) {