bnxt_en: Fix aggregation buffer leak under OOM condition.
authorMichael Chan <michael.chan@broadcom.com>
Wed, 22 May 2019 23:12:54 +0000 (19:12 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 11 Jun 2019 10:22:34 +0000 (12:22 +0200)
[ Upstream commit 296d5b54163964b7ae536b8b57dfbd21d4e868e1 ]

For every RX packet, the driver replenishes all buffers used for that
packet and puts them back into the RX ring and RX aggregation ring.
In one code path where the RX packet has one RX buffer and one or more
aggregation buffers, we missed recycling the aggregation buffer(s) if
we are unable to allocate a new SKB buffer.  This leads to the
aggregation ring slowly running out of buffers over time.  Fix it
by properly recycling the aggregation buffers.

Fixes: c0c050c58d84 ("bnxt_en: New Broadcom ethernet driver.")
Reported-by: Rakesh Hemnani <rhemnani@fb.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/ethernet/broadcom/bnxt/bnxt.c

index 620a470eb4c8382870cba97c2b64fe15183e56f1..fbe3c2c114f9344f6334e81a4900031289dd3455 100644 (file)
@@ -1425,6 +1425,8 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_napi *bnapi, u32 *raw_cons,
                skb = bnxt_copy_skb(bnapi, data, len, dma_addr);
                bnxt_reuse_rx_data(rxr, cons, data);
                if (!skb) {
+                       if (agg_bufs)
+                               bnxt_reuse_rx_agg_bufs(bnapi, cp_cons, agg_bufs);
                        rc = -ENOMEM;
                        goto next_rx;
                }