]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
IB/hfi1: Correct oversized ring allocation
authorMike Marciniszyn <mike.marciniszyn@cornelisnetworks.com>
Mon, 29 Mar 2021 13:54:09 +0000 (09:54 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 19 May 2021 08:29:30 +0000 (10:29 +0200)
[ Upstream commit b536d4b2a279733f440c911dc831764690b90050 ]

The completion ring for tx is using the wrong size to size the ring,
oversizing the ring by two orders of magniture.

Correct the allocation size and use kcalloc_node() to allocate the ring.
Fix mistaken GFP defines in similar allocations.

Link: https://lore.kernel.org/r/1617026056-50483-4-git-send-email-dennis.dalessandro@cornelisnetworks.com
Reviewed-by: Kaike Wan <kaike.wan@intel.com>
Signed-off-by: Mike Marciniszyn <mike.marciniszyn@cornelisnetworks.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@cornelisnetworks.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/infiniband/hw/hfi1/ipoib.h
drivers/infiniband/hw/hfi1/ipoib_tx.c

index f650cac9d424c2c6fe2ca4f9f8f1ca62e151f5bf..d30c23b6527aa58fa5f3f182f9b9e86a4de69eba 100644 (file)
@@ -52,8 +52,9 @@ union hfi1_ipoib_flow {
  * @producer_lock: producer sync lock
  * @consumer_lock: consumer sync lock
  */
+struct ipoib_txreq;
 struct hfi1_ipoib_circ_buf {
-       void **items;
+       struct ipoib_txreq **items;
        unsigned long head;
        unsigned long tail;
        unsigned long max_items;
index edd4eeac8dd1dd42760d723ac7a5717ee22d709f..cdc26ee3cf52d3b799e5d1719e129a82a53663e7 100644 (file)
@@ -702,14 +702,14 @@ int hfi1_ipoib_txreq_init(struct hfi1_ipoib_dev_priv *priv)
 
        priv->tx_napis = kcalloc_node(dev->num_tx_queues,
                                      sizeof(struct napi_struct),
-                                     GFP_ATOMIC,
+                                     GFP_KERNEL,
                                      priv->dd->node);
        if (!priv->tx_napis)
                goto free_txreq_cache;
 
        priv->txqs = kcalloc_node(dev->num_tx_queues,
                                  sizeof(struct hfi1_ipoib_txq),
-                                 GFP_ATOMIC,
+                                 GFP_KERNEL,
                                  priv->dd->node);
        if (!priv->txqs)
                goto free_tx_napis;
@@ -741,9 +741,9 @@ int hfi1_ipoib_txreq_init(struct hfi1_ipoib_dev_priv *priv)
                                             priv->dd->node);
 
                txq->tx_ring.items =
-                       vzalloc_node(array_size(tx_ring_size,
-                                               sizeof(struct ipoib_txreq)),
-                                    priv->dd->node);
+                       kcalloc_node(tx_ring_size,
+                                    sizeof(struct ipoib_txreq *),
+                                    GFP_KERNEL, priv->dd->node);
                if (!txq->tx_ring.items)
                        goto free_txqs;
 
@@ -764,7 +764,7 @@ free_txqs:
                struct hfi1_ipoib_txq *txq = &priv->txqs[i];
 
                netif_napi_del(txq->napi);
-               vfree(txq->tx_ring.items);
+               kfree(txq->tx_ring.items);
        }
 
        kfree(priv->txqs);
@@ -817,7 +817,7 @@ void hfi1_ipoib_txreq_deinit(struct hfi1_ipoib_dev_priv *priv)
                hfi1_ipoib_drain_tx_list(txq);
                netif_napi_del(txq->napi);
                (void)hfi1_ipoib_drain_tx_ring(txq, txq->tx_ring.max_items);
-               vfree(txq->tx_ring.items);
+               kfree(txq->tx_ring.items);
        }
 
        kfree(priv->txqs);