]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/4.19.35/bnxt_en-improve-rx-consumer-index-validity-check.patch
Linux 4.19.35
[thirdparty/kernel/stable-queue.git] / releases / 4.19.35 / bnxt_en-improve-rx-consumer-index-validity-check.patch
CommitLineData
a9fba688
SL
1From 35e967c49fde037a08c27e21e912bbe3aab8df7f Mon Sep 17 00:00:00 2001
2From: Michael Chan <michael.chan@broadcom.com>
3Date: Mon, 8 Apr 2019 17:39:54 -0400
4Subject: bnxt_en: Improve RX consumer index validity check.
5
6[ Upstream commit a1b0e4e684e9c300b9e759b46cb7a0147e61ddff ]
7
8There is logic to check that the RX/TPA consumer index is the expected
9index to work around a hardware problem. However, the potentially bad
10consumer index is first used to index into an array to reference an entry.
11This can potentially crash if the bad consumer index is beyond legal
12range. Improve the logic to use the consumer index for dereferencing
13after the validity check and log an error message.
14
15Fixes: fa7e28127a5a ("bnxt_en: Add workaround to detect bad opaque in rx completion (part 2)")
16Signed-off-by: Michael Chan <michael.chan@broadcom.com>
17Signed-off-by: David S. Miller <davem@davemloft.net>
18Signed-off-by: Sasha Levin <sashal@kernel.org>
19---
20 drivers/net/ethernet/broadcom/bnxt/bnxt.c | 10 +++++++---
21 1 file changed, 7 insertions(+), 3 deletions(-)
22
23diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
24index 0bd93bb7d1a2..a8abb47178be 100644
25--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
26+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
27@@ -1092,6 +1092,8 @@ static void bnxt_tpa_start(struct bnxt *bp, struct bnxt_rx_ring_info *rxr,
28 tpa_info = &rxr->rx_tpa[agg_id];
29
30 if (unlikely(cons != rxr->rx_next_cons)) {
31+ netdev_warn(bp->dev, "TPA cons %x != expected cons %x\n",
32+ cons, rxr->rx_next_cons);
33 bnxt_sched_reset(bp, rxr);
34 return;
35 }
36@@ -1544,15 +1546,17 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_napi *bnapi, u32 *raw_cons,
37 }
38
39 cons = rxcmp->rx_cmp_opaque;
40- rx_buf = &rxr->rx_buf_ring[cons];
41- data = rx_buf->data;
42- data_ptr = rx_buf->data_ptr;
43 if (unlikely(cons != rxr->rx_next_cons)) {
44 int rc1 = bnxt_discard_rx(bp, bnapi, raw_cons, rxcmp);
45
46+ netdev_warn(bp->dev, "RX cons %x != expected cons %x\n",
47+ cons, rxr->rx_next_cons);
48 bnxt_sched_reset(bp, rxr);
49 return rc1;
50 }
51+ rx_buf = &rxr->rx_buf_ring[cons];
52+ data = rx_buf->data;
53+ data_ptr = rx_buf->data_ptr;
54 prefetch(data_ptr);
55
56 misc = le32_to_cpu(rxcmp->rx_cmp_misc_v1);
57--
582.19.1
59