Skip to content

Commit 4555f8f

Browse files
IronShenPaolo Abeni
authored andcommitted
net: hns3: fix concurrent setting vlan filter issue
The vport->req_vlan_fltr_en may be changed concurrently by function hclge_sync_vlan_fltr_state() called in periodic work task and function hclge_enable_vport_vlan_filter() called by user configuration. It may cause the user configuration inoperative. Fixes it by protect the vport->req_vlan_fltr by vport_lock. Fixes: 2ba3066 ("net: hns3: add support for modify VLAN filter state") Signed-off-by: Jian Shen <[email protected]> Signed-off-by: Jijie Shao <[email protected]> Reviewed-by: Simon Horman <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Paolo Abeni <[email protected]>
1 parent 897e860 commit 4555f8f

File tree

1 file changed

+21
-15
lines changed

1 file changed

+21
-15
lines changed

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9576,33 +9576,36 @@ static bool hclge_need_enable_vport_vlan_filter(struct hclge_vport *vport)
95769576
return false;
95779577
}
95789578

9579-
int hclge_enable_vport_vlan_filter(struct hclge_vport *vport, bool request_en)
9579+
static int __hclge_enable_vport_vlan_filter(struct hclge_vport *vport,
9580+
bool request_en)
95809581
{
9581-
struct hclge_dev *hdev = vport->back;
95829582
bool need_en;
95839583
int ret;
95849584

9585-
mutex_lock(&hdev->vport_lock);
9586-
9587-
vport->req_vlan_fltr_en = request_en;
9588-
95899585
need_en = hclge_need_enable_vport_vlan_filter(vport);
9590-
if (need_en == vport->cur_vlan_fltr_en) {
9591-
mutex_unlock(&hdev->vport_lock);
9586+
if (need_en == vport->cur_vlan_fltr_en)
95929587
return 0;
9593-
}
95949588

95959589
ret = hclge_set_vport_vlan_filter(vport, need_en);
9596-
if (ret) {
9597-
mutex_unlock(&hdev->vport_lock);
9590+
if (ret)
95989591
return ret;
9599-
}
96009592

96019593
vport->cur_vlan_fltr_en = need_en;
96029594

9595+
return 0;
9596+
}
9597+
9598+
int hclge_enable_vport_vlan_filter(struct hclge_vport *vport, bool request_en)
9599+
{
9600+
struct hclge_dev *hdev = vport->back;
9601+
int ret;
9602+
9603+
mutex_lock(&hdev->vport_lock);
9604+
vport->req_vlan_fltr_en = request_en;
9605+
ret = __hclge_enable_vport_vlan_filter(vport, request_en);
96039606
mutex_unlock(&hdev->vport_lock);
96049607

9605-
return 0;
9608+
return ret;
96069609
}
96079610

96089611
static int hclge_enable_vlan_filter(struct hnae3_handle *handle, bool enable)
@@ -10623,16 +10626,19 @@ static void hclge_sync_vlan_fltr_state(struct hclge_dev *hdev)
1062310626
&vport->state))
1062410627
continue;
1062510628

10626-
ret = hclge_enable_vport_vlan_filter(vport,
10627-
vport->req_vlan_fltr_en);
10629+
mutex_lock(&hdev->vport_lock);
10630+
ret = __hclge_enable_vport_vlan_filter(vport,
10631+
vport->req_vlan_fltr_en);
1062810632
if (ret) {
1062910633
dev_err(&hdev->pdev->dev,
1063010634
"failed to sync vlan filter state for vport%u, ret = %d\n",
1063110635
vport->vport_id, ret);
1063210636
set_bit(HCLGE_VPORT_STATE_VLAN_FLTR_CHANGE,
1063310637
&vport->state);
10638+
mutex_unlock(&hdev->vport_lock);
1063410639
return;
1063510640
}
10641+
mutex_unlock(&hdev->vport_lock);
1063610642
}
1063710643
}
1063810644

0 commit comments

Comments
 (0)