From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 26C08542811 for ; Thu, 15 Oct 2026 15:24:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792077880; cv=none; b=kRxSBsBknZccVkrXisKGoUKGyaQnJD/7FJi0Eec5zi1PTg+crb/IpHdYwTQioFvcU//+o6gl4IN5opxXGuiIem1Y8MXquwalaVEm95e82SvSSxQ2NEMKb4SjsMw6P8RCCqajLByZZjbIbYg2hHEt3WIB4Pjkm3oYkyaRT+imN24= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792077880; c=relaxed/simple; bh=9pp2prIDYcWwyAEHMeDGckZuvWS2tpiaF9DKi7vPhtE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=QIMPnffp/SiRet+ct2j8WChKetxIqtNw/s5WXjb9W3SCxl6CM9YZX8J9kkxTs8Piq1+f8lCnDI6hh/52U1fcxj/kjFdA+Yt0L1smhOsgUDp45lBrnLzxWSYZHu2WA8p86g7DXpId9g+Ujwz7L/PcAoCMiEhB5RFPt0HF8afOHb8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=HFiU02IV; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="HFiU02IV" Received: by smtp.kernel.org (Postfix) with ESMTPSA id CA5DB1F000C7; Thu, 15 Oct 2026 15:24:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1792077870; bh=UmwBONPz89+JVFdUSpbAtFEpVioM6jedU5WsR7e1YLg=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=HFiU02IVgLxsMY+GceKYhnRyUswwOjHpLBeDBkrAIQXe0kH4cmoFKy7KZzMhZE1q4 bKDrV+bpoCvAGO8E2QoiCdLMNQwH1I8eY5TVDm2M2pQJ4lEg0WmE5cdyIGI8fyntmk UnHRz+m+EN09IMhhOUkc98JJXdObIbu1pPrW3PrXdjfxAiD+zfc9Pmt9xaBZr8ymMO sCXnuoinOlGjQmGxjAl7thz3fsUPSKD5SEhcwI+/czhL7OUEPshDPdQVuD3Gg0LOrR Ogctew34svmOI1gS0Y2Hbvhj8WsMjR67ikqEF4bfU9Kzr0IFQ+X7CfEsx3awboCMj9 2iedSe5ZQL+/Q== From: Linus Walleij Date: Thu, 15 Oct 2026 17:24:08 +0200 Subject: [PATCH net-next v5 08/14] net: ethernet: cortina: Rotate free queue page allocation Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20261015-gemini-ethernet-fixes-3-v5-8-b5c9e2f7b8a3@kernel.org> References: <20261015-gemini-ethernet-fixes-3-v5-0-b5c9e2f7b8a3@kernel.org> In-Reply-To: <20261015-gemini-ethernet-fixes-3-v5-0-b5c9e2f7b8a3@kernel.org> To: Hans Ulli Kroll , Andrew Lunn , "David S. Miller" , Jakub Kicinski , Paolo Abeni , =?utf-8?q?Micha=C5=82_Miros=C5=82aw?= , Myeonghun Pak , Eric Dumazet Cc: netdev@vger.kernel.org, Linus Walleij X-Mailer: b4 0.16.0 The free queue metadata bitmap currently searches for a free slot from zero for every page allocation. Under sustained traffic this repeatedly scans occupied low-numbered slots. Remember the position after the most recently allocated slot and wrap the bitmap search at its end. Reset the cursor when the bitmap is released so the two remain consistent across failed setup and teardown. This keeps allocation cost distributed across the metadata table. Assisted-by: LLM Signed-off-by: Linus Walleij --- drivers/net/ethernet/cortina/gemini.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/cortina/gemini.c b/drivers/net/ethernet/cortina/gemini.c index faab1bb865ab..1d71c5066457 100644 --- a/drivers/net/ethernet/cortina/gemini.c +++ b/drivers/net/ethernet/cortina/gemini.c @@ -174,6 +174,7 @@ struct gemini_ethernet { struct xarray freeq_mappings; unsigned int num_freeq_pages; unsigned long *freeq_page_bitmap; + unsigned int freeq_page_cursor; spinlock_t freeq_lock; /* Locks queue from reentrance */ }; @@ -745,12 +746,20 @@ static int geth_freeq_alloc_slot(struct gemini_ethernet *geth) lockdep_assert_held(&geth->freeq_lock); - slot = find_first_zero_bit(geth->freeq_page_bitmap, - geth->num_freeq_pages); - if (slot == geth->num_freeq_pages) - return -ENOSPC; + slot = find_next_zero_bit(geth->freeq_page_bitmap, + geth->num_freeq_pages, + geth->freeq_page_cursor); + if (slot == geth->num_freeq_pages) { + slot = find_first_zero_bit(geth->freeq_page_bitmap, + geth->freeq_page_cursor); + if (slot == geth->freeq_page_cursor) + return -ENOSPC; + } __set_bit(slot, geth->freeq_page_bitmap); + geth->freeq_page_cursor = slot + 1; + if (geth->freeq_page_cursor == geth->num_freeq_pages) + geth->freeq_page_cursor = 0; return slot; } @@ -1113,6 +1122,7 @@ static int geth_setup_freeq(struct gemini_ethernet *geth) if (!geth->freeq_page_bitmap) goto err_freeq_pages; geth->num_freeq_pages = page_slots; + geth->freeq_page_cursor = 0; /* Match the software pointer to the retained hardware pointer. */ rptr = GET_RPTR(geth->base + GLOBAL_SWFQ_RWPTR_REG); @@ -1144,6 +1154,7 @@ static int geth_setup_freeq(struct gemini_ethernet *geth) kfree(geth->freeq_pages); geth->freeq_pages = NULL; geth->num_freeq_pages = 0; + geth->freeq_page_cursor = 0; err_freeq: dma_free_coherent(geth->dev, sizeof(*geth->freeq_ring) << geth->freeq_order, @@ -1172,6 +1183,7 @@ static void geth_cleanup_freeq(struct gemini_ethernet *geth) kfree(geth->freeq_pages); geth->freeq_pages = NULL; geth->num_freeq_pages = 0; + geth->freeq_page_cursor = 0; dma_free_coherent(geth->dev, sizeof(*geth->freeq_ring) << geth->freeq_order, -- 2.56.0