]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ibmvnic: account for bufs already saved in indir_buf
authorSukadev Bhattiprolu <sukadev@linux.ibm.com>
Thu, 24 Jun 2021 04:13:13 +0000 (21:13 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 14 Jul 2021 15:00:03 +0000 (17:00 +0200)
[ Upstream commit 72368f8b2b9e4106072a2728bed3367d54641c22 ]

This fixes a crash in replenish_rx_pool() when called from ibmvnic_poll()
after a previous call to replenish_rx_pool() encountered an error when
allocating a socket buffer.

Thanks to Rick Lindsley and Dany Madden for helping debug the crash.

Fixes: 4f0b6812e9b9 ("ibmvnic: Introduce batched RX buffer descriptor transmission")
Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/ibm/ibmvnic.c

index e8f4bdb1079c67120a75894bfba9a66e3560b4a1..f1a6f454fe97daa80d8f64180ddc12a477cf8221 100644 (file)
@@ -328,7 +328,14 @@ static void replenish_rx_pool(struct ibmvnic_adapter *adapter,
 
        rx_scrq = adapter->rx_scrq[pool->index];
        ind_bufp = &rx_scrq->ind_buf;
-       for (i = 0; i < count; ++i) {
+
+       /* netdev_skb_alloc() could have failed after we saved a few skbs
+        * in the indir_buf and we would not have sent them to VIOS yet.
+        * To account for them, start the loop at ind_bufp->index rather
+        * than 0. If we pushed all the skbs to VIOS, ind_bufp->index will
+        * be 0.
+        */
+       for (i = ind_bufp->index; i < count; ++i) {
                skb = netdev_alloc_skb(adapter->netdev, pool->buff_size);
                if (!skb) {
                        dev_err(dev, "Couldn't replenish rx buff\n");