Commit c11c731a authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

Merge branch 'fix-page-fragment-handling-when-page_size-4k'

Dimitri Daskalakis says:

====================
Fix page fragment handling when PAGE_SIZE > 4K

FBNIC operates on fixed size descriptors (4K). When the OS supports pages
larger than 4K, we fragment the page across multiple descriptors.

While performance testing, I found several issues with our page fragment
handling, resulting in low throughput and potential RX stalls.
====================

Link: https://patch.msgid.link/20260324195123.3486219-1-dimitri.daskalakis1@gmail.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 2edfa317 f3567dd4
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -197,7 +197,7 @@ static int fbnic_dbg_bdq_desc_seq_show(struct seq_file *s, void *v)
		return 0;
	}

	for (i = 0; i <= ring->size_mask; i++) {
	for (i = 0; i < (ring->size_mask + 1) * FBNIC_BD_FRAG_COUNT; i++) {
		u64 bd = le64_to_cpu(ring->desc[i]);

		seq_printf(s, "%04x %#04llx %#014llx\n", i,
+3 −3
Original line number Diff line number Diff line
@@ -927,7 +927,7 @@ static void fbnic_fill_bdq(struct fbnic_ring *bdq)
		/* Force DMA writes to flush before writing to tail */
		dma_wmb();

		writel(i, bdq->doorbell);
		writel(i * FBNIC_BD_FRAG_COUNT, bdq->doorbell);
	}
}

@@ -2564,7 +2564,7 @@ static void fbnic_enable_bdq(struct fbnic_ring *hpq, struct fbnic_ring *ppq)
	hpq->tail = 0;
	hpq->head = 0;

	log_size = fls(hpq->size_mask);
	log_size = fls(hpq->size_mask) + ilog2(FBNIC_BD_FRAG_COUNT);

	/* Store descriptor ring address and size */
	fbnic_ring_wr32(hpq, FBNIC_QUEUE_BDQ_HPQ_BAL, lower_32_bits(hpq->dma));
@@ -2576,7 +2576,7 @@ static void fbnic_enable_bdq(struct fbnic_ring *hpq, struct fbnic_ring *ppq)
	if (!ppq->size_mask)
		goto write_ctl;

	log_size = fls(ppq->size_mask);
	log_size = fls(ppq->size_mask) + ilog2(FBNIC_BD_FRAG_COUNT);

	/* Add enabling of PPQ to BDQ control */
	bdq_ctl |= FBNIC_QUEUE_BDQ_CTL_PPQ_ENABLE;