mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-10 10:39:26 +00:00
net: hns3: bugfix for buffer not free problem during resetting
[ Upstream commit73b907a083
] When hns3_get_ring_config()/hns3_queue_to_ring()/ hns3_get_vector_ring_chain() failed during resetting, the allocated memory has not been freed before these three functions return. So this patch adds error handler in these functions to fix it. Fixes:76ad4f0ee7
("net: hns3: Add support of HNS3 Ethernet Driver for hip08 SoC") Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
3d9bc014c5
commit
b0465d06d4
1 changed files with 21 additions and 3 deletions
|
@ -2547,7 +2547,7 @@ static int hns3_get_vector_ring_chain(struct hns3_enet_tqp_vector *tqp_vector,
|
|||
chain = devm_kzalloc(&pdev->dev, sizeof(*chain),
|
||||
GFP_KERNEL);
|
||||
if (!chain)
|
||||
return -ENOMEM;
|
||||
goto err_free_chain;
|
||||
|
||||
cur_chain->next = chain;
|
||||
chain->tqp_index = tx_ring->tqp->tqp_index;
|
||||
|
@ -2577,7 +2577,7 @@ static int hns3_get_vector_ring_chain(struct hns3_enet_tqp_vector *tqp_vector,
|
|||
while (rx_ring) {
|
||||
chain = devm_kzalloc(&pdev->dev, sizeof(*chain), GFP_KERNEL);
|
||||
if (!chain)
|
||||
return -ENOMEM;
|
||||
goto err_free_chain;
|
||||
|
||||
cur_chain->next = chain;
|
||||
chain->tqp_index = rx_ring->tqp->tqp_index;
|
||||
|
@ -2592,6 +2592,16 @@ static int hns3_get_vector_ring_chain(struct hns3_enet_tqp_vector *tqp_vector,
|
|||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_free_chain:
|
||||
cur_chain = head->next;
|
||||
while (cur_chain) {
|
||||
chain = cur_chain->next;
|
||||
devm_kfree(&pdev->dev, chain);
|
||||
cur_chain = chain;
|
||||
}
|
||||
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static void hns3_free_vector_ring_chain(struct hns3_enet_tqp_vector *tqp_vector,
|
||||
|
@ -2836,8 +2846,10 @@ static int hns3_queue_to_ring(struct hnae3_queue *tqp,
|
|||
return ret;
|
||||
|
||||
ret = hns3_ring_get_cfg(tqp, priv, HNAE3_RING_TYPE_RX);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
devm_kfree(priv->dev, priv->ring_data[tqp->tqp_index].ring);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -2864,6 +2876,12 @@ static int hns3_get_ring_config(struct hns3_nic_priv *priv)
|
|||
|
||||
return 0;
|
||||
err:
|
||||
while (i--) {
|
||||
devm_kfree(priv->dev, priv->ring_data[i].ring);
|
||||
devm_kfree(priv->dev,
|
||||
priv->ring_data[i + h->kinfo.num_tqps].ring);
|
||||
}
|
||||
|
||||
devm_kfree(&pdev->dev, priv->ring_data);
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue