Skip to content

Commit

Permalink
IB/hfi1: Correct oversized ring allocation
Browse files Browse the repository at this point in the history
[ Upstream commit b536d4b ]

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>
  • Loading branch information
Mike Marciniszyn authored and gregkh committed May 19, 2021
1 parent bcbdb48 commit 98138aa
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 8 deletions.
3 changes: 2 additions & 1 deletion drivers/infiniband/hw/hfi1/ipoib.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
14 changes: 7 additions & 7 deletions drivers/infiniband/hw/hfi1/ipoib_tx.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;

Expand All @@ -764,7 +764,7 @@ int hfi1_ipoib_txreq_init(struct hfi1_ipoib_dev_priv *priv)
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);
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 98138aa

Please sign in to comment.