Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 30 Mar 2021 15:04:16 GMT
From:      Ryan Moeller <freqlabs@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: a42a0b77f0de - stable/11 - Fix array out of bound panic introduced in r306219.
Message-ID:  <202103301504.12UF4Gh4082182@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch stable/11 has been updated by freqlabs:

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

commit a42a0b77f0de636a91f79fa2fde8a507d88b79b7
Author:     Alexander Motin <mav@FreeBSD.org>
AuthorDate: 2019-05-28 18:32:04 +0000
Commit:     Ryan Moeller <freqlabs@FreeBSD.org>
CommitDate: 2021-03-30 15:02:24 +0000

    Fix array out of bound panic introduced in r306219.
    
    As I see, different NICs in different configurations may have different
    numbers of TX and RX queues.  The code was assuming 1:1 mapping between
    event queues (interrupts) and TX/RX queues.  Since number of interrupts
    is set to maximum of TX and RX queues, when those two are different, the
    system is doomed.
    
    I have no documentation or deep knowledge about this hardware, so this
    change is based on general observations and code reading.  If some of my
    guesses are wrong, please do better.  I just confirmed HP NC550SFP NICs
    are working now.
    
    MFC after:      2 weeks
    Sponsored by:   iXsystems, Inc.
    
    (cherry picked from commit 3582828053556ca0e05ed9aab3e78008a0595e09)
---
 sys/dev/oce/oce_if.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/sys/dev/oce/oce_if.c b/sys/dev/oce/oce_if.c
index 1de38d4528fc..362bc1776890 100644
--- a/sys/dev/oce/oce_if.c
+++ b/sys/dev/oce/oce_if.c
@@ -2395,10 +2395,20 @@ oce_eqd_set_periodic(POCE_SOFTC sc)
 			goto modify_eqd;
 		}
 
-		rq = sc->rq[i];
-		rxpkts = rq->rx_stats.rx_pkts;
-		wq = sc->wq[i];
-		tx_reqs = wq->tx_stats.tx_reqs;
+		if (i == 0) {
+			rq = sc->rq[0];
+			rxpkts = rq->rx_stats.rx_pkts;
+		} else
+			rxpkts = 0;
+		if (i + 1 < sc->nrqs) {
+			rq = sc->rq[i + 1];
+			rxpkts += rq->rx_stats.rx_pkts;
+		}
+		if (i < sc->nwqs) {
+			wq = sc->wq[i];
+			tx_reqs = wq->tx_stats.tx_reqs;
+		} else
+			tx_reqs = 0;
 		now = ticks;
 
 		if (!aic->ticks || now < aic->ticks ||



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202103301504.12UF4Gh4082182>