mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-18 22:14:16 +00:00
net: hns3: refactor the get/put_vector function
There is a get_vector function, which allocate the vectors for a client, but there is not a put_vector to free the vector. This patch introduces the put_vector function in order to fix the coalesce configuration lost problem during reset process. Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com> Signed-off-by: Peng Li <lipeng321@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ec77789032
commit
0d3e6631de
4 changed files with 37 additions and 10 deletions
|
@ -265,6 +265,8 @@ struct hnae3_ae_dev {
|
||||||
* Get tc size of handle
|
* Get tc size of handle
|
||||||
* get_vector()
|
* get_vector()
|
||||||
* Get vector number and vector information
|
* Get vector number and vector information
|
||||||
|
* put_vector()
|
||||||
|
* Put the vector in hdev
|
||||||
* map_ring_to_vector()
|
* map_ring_to_vector()
|
||||||
* Map rings to vector
|
* Map rings to vector
|
||||||
* unmap_ring_from_vector()
|
* unmap_ring_from_vector()
|
||||||
|
@ -375,6 +377,7 @@ struct hnae3_ae_ops {
|
||||||
|
|
||||||
int (*get_vector)(struct hnae3_handle *handle, u16 vector_num,
|
int (*get_vector)(struct hnae3_handle *handle, u16 vector_num,
|
||||||
struct hnae3_vector_info *vector_info);
|
struct hnae3_vector_info *vector_info);
|
||||||
|
int (*put_vector)(struct hnae3_handle *handle, int vector_num);
|
||||||
int (*map_ring_to_vector)(struct hnae3_handle *handle,
|
int (*map_ring_to_vector)(struct hnae3_handle *handle,
|
||||||
int vector_num,
|
int vector_num,
|
||||||
struct hnae3_ring_chain_node *vr_chain);
|
struct hnae3_ring_chain_node *vr_chain);
|
||||||
|
|
|
@ -2721,6 +2721,10 @@ static int hns3_nic_uninit_vector_data(struct hns3_nic_priv *priv)
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
ret = h->ae_algo->ops->put_vector(h, tqp_vector->vector_irq);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
hns3_free_vector_ring_chain(tqp_vector, &vector_ring_chain);
|
hns3_free_vector_ring_chain(tqp_vector, &vector_ring_chain);
|
||||||
|
|
||||||
if (priv->tqp_vector[i].irq_init_flag == HNS3_VECTOR_INITED) {
|
if (priv->tqp_vector[i].irq_init_flag == HNS3_VECTOR_INITED) {
|
||||||
|
|
|
@ -2969,6 +2969,24 @@ static int hclge_get_vector_index(struct hclge_dev *hdev, int vector)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int hclge_put_vector(struct hnae3_handle *handle, int vector)
|
||||||
|
{
|
||||||
|
struct hclge_vport *vport = hclge_get_vport(handle);
|
||||||
|
struct hclge_dev *hdev = vport->back;
|
||||||
|
int vector_id;
|
||||||
|
|
||||||
|
vector_id = hclge_get_vector_index(hdev, vector);
|
||||||
|
if (vector_id < 0) {
|
||||||
|
dev_err(&hdev->pdev->dev,
|
||||||
|
"Get vector index fail. vector_id =%d\n", vector_id);
|
||||||
|
return vector_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
hclge_free_vector(hdev, vector_id);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static u32 hclge_get_rss_key_size(struct hnae3_handle *handle)
|
static u32 hclge_get_rss_key_size(struct hnae3_handle *handle)
|
||||||
{
|
{
|
||||||
return HCLGE_RSS_KEY_SIZE;
|
return HCLGE_RSS_KEY_SIZE;
|
||||||
|
@ -3523,18 +3541,13 @@ static int hclge_unmap_ring_frm_vector(struct hnae3_handle *handle,
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = hclge_bind_ring_with_vector(vport, vector_id, false, ring_chain);
|
ret = hclge_bind_ring_with_vector(vport, vector_id, false, ring_chain);
|
||||||
if (ret) {
|
if (ret)
|
||||||
dev_err(&handle->pdev->dev,
|
dev_err(&handle->pdev->dev,
|
||||||
"Unmap ring from vector fail. vectorid=%d, ret =%d\n",
|
"Unmap ring from vector fail. vectorid=%d, ret =%d\n",
|
||||||
vector_id,
|
vector_id,
|
||||||
ret);
|
ret);
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Free this MSIX or MSI vector */
|
return ret;
|
||||||
hclge_free_vector(hdev, vector_id);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int hclge_cmd_set_promisc_mode(struct hclge_dev *hdev,
|
int hclge_cmd_set_promisc_mode(struct hclge_dev *hdev,
|
||||||
|
@ -5994,6 +6007,7 @@ static const struct hnae3_ae_ops hclge_ops = {
|
||||||
.map_ring_to_vector = hclge_map_ring_to_vector,
|
.map_ring_to_vector = hclge_map_ring_to_vector,
|
||||||
.unmap_ring_from_vector = hclge_unmap_ring_frm_vector,
|
.unmap_ring_from_vector = hclge_unmap_ring_frm_vector,
|
||||||
.get_vector = hclge_get_vector,
|
.get_vector = hclge_get_vector,
|
||||||
|
.put_vector = hclge_put_vector,
|
||||||
.set_promisc_mode = hclge_set_promisc_mode,
|
.set_promisc_mode = hclge_set_promisc_mode,
|
||||||
.set_loopback = hclge_set_loopback,
|
.set_loopback = hclge_set_loopback,
|
||||||
.start = hclge_ae_start,
|
.start = hclge_ae_start,
|
||||||
|
|
|
@ -627,13 +627,18 @@ static int hclgevf_unmap_ring_from_vector(
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = hclgevf_bind_ring_to_vector(handle, false, vector, ring_chain);
|
ret = hclgevf_bind_ring_to_vector(handle, false, vector, ring_chain);
|
||||||
if (ret) {
|
if (ret)
|
||||||
dev_err(&handle->pdev->dev,
|
dev_err(&handle->pdev->dev,
|
||||||
"Unmap ring from vector fail. vector=%d, ret =%d\n",
|
"Unmap ring from vector fail. vector=%d, ret =%d\n",
|
||||||
vector_id,
|
vector_id,
|
||||||
ret);
|
ret);
|
||||||
return ret;
|
|
||||||
}
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int hclgevf_put_vector(struct hnae3_handle *handle, int vector)
|
||||||
|
{
|
||||||
|
struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
|
||||||
|
|
||||||
hclgevf_free_vector(hdev, vector);
|
hclgevf_free_vector(hdev, vector);
|
||||||
|
|
||||||
|
@ -1466,6 +1471,7 @@ static const struct hnae3_ae_ops hclgevf_ops = {
|
||||||
.map_ring_to_vector = hclgevf_map_ring_to_vector,
|
.map_ring_to_vector = hclgevf_map_ring_to_vector,
|
||||||
.unmap_ring_from_vector = hclgevf_unmap_ring_from_vector,
|
.unmap_ring_from_vector = hclgevf_unmap_ring_from_vector,
|
||||||
.get_vector = hclgevf_get_vector,
|
.get_vector = hclgevf_get_vector,
|
||||||
|
.put_vector = hclgevf_put_vector,
|
||||||
.reset_queue = hclgevf_reset_tqp,
|
.reset_queue = hclgevf_reset_tqp,
|
||||||
.set_promisc_mode = hclgevf_set_promisc_mode,
|
.set_promisc_mode = hclgevf_set_promisc_mode,
|
||||||
.get_mac_addr = hclgevf_get_mac_addr,
|
.get_mac_addr = hclgevf_get_mac_addr,
|
||||||
|
|
Loading…
Add table
Reference in a new issue