git: 8daa60945080 - stable/14 - if_genet: don't load DMA mapping when tx_queue is full

From: Mitchell Horne <mhorne_at_FreeBSD.org>
Date: Thu, 04 Jul 2024 13:32:25 UTC
The branch stable/14 has been updated by mhorne:

URL: https://cgit.FreeBSD.org/src/commit/?id=8daa60945080c602f2a65ed2a0f2333c15bd947e

commit 8daa60945080c602f2a65ed2a0f2333c15bd947e
Author:     Mitchell Horne <mhorne@FreeBSD.org>
AuthorDate: 2024-06-27 17:26:54 +0000
Commit:     Mitchell Horne <mhorne@FreeBSD.org>
CommitDate: 2024-07-04 13:31:54 +0000

    if_genet: don't load DMA mapping when tx_queue is full
    
    gen_encap() always calls bus_dmamap_load_mbuf_sg() into 'map' (which is
    the current tx_queue). If the tx_queue is full, it will load with a
    'map' that already has a currently active mapping. This violates the
    busdma(9) KPI.
    
    Checking for a full queue and returning ENOBUFS will allow
    gen_start_locked() to set the IFF_DRV_OACTIVE faster without having to
    needlessly check if the mbuf will fit (it won't).
    
    PR:             256482
    Reviewed by:    mhorne
    MFC after:      1 week
    Submitted by:   ghuckriede@blackberry.com
    
    (cherry picked from commit a35f66510917f5ac21c11e9642174cda7718fbc6)
---
 sys/arm64/broadcom/genet/if_genet.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/sys/arm64/broadcom/genet/if_genet.c b/sys/arm64/broadcom/genet/if_genet.c
index 40fc096208c6..8fb46a7552f1 100644
--- a/sys/arm64/broadcom/genet/if_genet.c
+++ b/sys/arm64/broadcom/genet/if_genet.c
@@ -1070,6 +1070,10 @@ gen_encap(struct gen_softc *sc, struct mbuf **mp)
 	GEN_ASSERT_LOCKED(sc);
 
 	q = &sc->tx_queue[DEF_TXQUEUE];
+	if (q->queued == q->nentries) {
+		/* tx_queue is full */
+		return (ENOBUFS);
+	}
 
 	m = *mp;