Commit b536d4b2 authored by Mike Marciniszyn's avatar Mike Marciniszyn Committed by Jason Gunthorpe

IB/hfi1: Correct oversized ring allocation

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.comReviewed-by: default avatarKaike Wan <kaike.wan@intel.com>
Signed-off-by: default avatarMike Marciniszyn <mike.marciniszyn@cornelisnetworks.com>
Signed-off-by: default avatarDennis Dalessandro <dennis.dalessandro@cornelisnetworks.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent 042a00f9
...@@ -52,8 +52,9 @@ union hfi1_ipoib_flow { ...@@ -52,8 +52,9 @@ union hfi1_ipoib_flow {
* @producer_lock: producer sync lock * @producer_lock: producer sync lock
* @consumer_lock: consumer sync lock * @consumer_lock: consumer sync lock
*/ */
struct ipoib_txreq;
struct hfi1_ipoib_circ_buf { struct hfi1_ipoib_circ_buf {
void **items; struct ipoib_txreq **items;
unsigned long head; unsigned long head;
unsigned long tail; unsigned long tail;
unsigned long max_items; unsigned long max_items;
......
...@@ -714,14 +714,14 @@ int hfi1_ipoib_txreq_init(struct hfi1_ipoib_dev_priv *priv) ...@@ -714,14 +714,14 @@ int hfi1_ipoib_txreq_init(struct hfi1_ipoib_dev_priv *priv)
priv->tx_napis = kcalloc_node(dev->num_tx_queues, priv->tx_napis = kcalloc_node(dev->num_tx_queues,
sizeof(struct napi_struct), sizeof(struct napi_struct),
GFP_ATOMIC, GFP_KERNEL,
priv->dd->node); priv->dd->node);
if (!priv->tx_napis) if (!priv->tx_napis)
goto free_txreq_cache; goto free_txreq_cache;
priv->txqs = kcalloc_node(dev->num_tx_queues, priv->txqs = kcalloc_node(dev->num_tx_queues,
sizeof(struct hfi1_ipoib_txq), sizeof(struct hfi1_ipoib_txq),
GFP_ATOMIC, GFP_KERNEL,
priv->dd->node); priv->dd->node);
if (!priv->txqs) if (!priv->txqs)
goto free_tx_napis; goto free_tx_napis;
...@@ -753,9 +753,9 @@ int hfi1_ipoib_txreq_init(struct hfi1_ipoib_dev_priv *priv) ...@@ -753,9 +753,9 @@ int hfi1_ipoib_txreq_init(struct hfi1_ipoib_dev_priv *priv)
priv->dd->node); priv->dd->node);
txq->tx_ring.items = txq->tx_ring.items =
vzalloc_node(array_size(tx_ring_size, kcalloc_node(tx_ring_size,
sizeof(struct ipoib_txreq)), sizeof(struct ipoib_txreq *),
priv->dd->node); GFP_KERNEL, priv->dd->node);
if (!txq->tx_ring.items) if (!txq->tx_ring.items)
goto free_txqs; goto free_txqs;
...@@ -776,7 +776,7 @@ int hfi1_ipoib_txreq_init(struct hfi1_ipoib_dev_priv *priv) ...@@ -776,7 +776,7 @@ int hfi1_ipoib_txreq_init(struct hfi1_ipoib_dev_priv *priv)
struct hfi1_ipoib_txq *txq = &priv->txqs[i]; struct hfi1_ipoib_txq *txq = &priv->txqs[i];
netif_napi_del(txq->napi); netif_napi_del(txq->napi);
vfree(txq->tx_ring.items); kfree(txq->tx_ring.items);
} }
kfree(priv->txqs); kfree(priv->txqs);
...@@ -829,7 +829,7 @@ void hfi1_ipoib_txreq_deinit(struct hfi1_ipoib_dev_priv *priv) ...@@ -829,7 +829,7 @@ void hfi1_ipoib_txreq_deinit(struct hfi1_ipoib_dev_priv *priv)
hfi1_ipoib_drain_tx_list(txq); hfi1_ipoib_drain_tx_list(txq);
netif_napi_del(txq->napi); netif_napi_del(txq->napi);
(void)hfi1_ipoib_drain_tx_ring(txq, txq->tx_ring.max_items); (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); kfree(priv->txqs);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment