Commit 7d0b3451 authored by Jian Shen's avatar Jian Shen Committed by David S. Miller

net: hns3: use mutex vport_lock instead of mutex umv_lock

Currently, the driver use mutex umv_lock to protect the variable
vport->share_umv_size. And there is already a mutex vport_lock
being defined in the driver, which is designed to protect the
resource of vport. So we can use vport_lock instead of umv_lock.

Furthermore, there is a time window for protect share_umv_size
between checking UMV space and doing MAC configuration in the
lin function hclge_add_uc_addr_common(). It should be extended.

This patch uses mutex vport_lock intead of spin lock umv_lock to
protect share_umv_size, and adjusts the mutex's range.
Signed-off-by: default avatarJian Shen <shenjian15@huawei.com>
Signed-off-by: default avatarHuazhong Tan <tanhuazhong@huawei.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c631c696
...@@ -7250,7 +7250,6 @@ static int hclge_init_umv_space(struct hclge_dev *hdev) ...@@ -7250,7 +7250,6 @@ static int hclge_init_umv_space(struct hclge_dev *hdev)
"failed to alloc umv space, want %u, get %u\n", "failed to alloc umv space, want %u, get %u\n",
hdev->wanted_umv_size, allocated_size); hdev->wanted_umv_size, allocated_size);
mutex_init(&hdev->umv_mutex);
hdev->max_umv_size = allocated_size; hdev->max_umv_size = allocated_size;
hdev->priv_umv_size = hdev->max_umv_size / (hdev->num_alloc_vport + 1); hdev->priv_umv_size = hdev->max_umv_size / (hdev->num_alloc_vport + 1);
hdev->share_umv_size = hdev->priv_umv_size + hdev->share_umv_size = hdev->priv_umv_size +
...@@ -7269,21 +7268,25 @@ static void hclge_reset_umv_space(struct hclge_dev *hdev) ...@@ -7269,21 +7268,25 @@ static void hclge_reset_umv_space(struct hclge_dev *hdev)
vport->used_umv_num = 0; vport->used_umv_num = 0;
} }
mutex_lock(&hdev->umv_mutex); mutex_lock(&hdev->vport_lock);
hdev->share_umv_size = hdev->priv_umv_size + hdev->share_umv_size = hdev->priv_umv_size +
hdev->max_umv_size % (hdev->num_alloc_vport + 1); hdev->max_umv_size % (hdev->num_alloc_vport + 1);
mutex_unlock(&hdev->umv_mutex); mutex_unlock(&hdev->vport_lock);
} }
static bool hclge_is_umv_space_full(struct hclge_vport *vport) static bool hclge_is_umv_space_full(struct hclge_vport *vport, bool need_lock)
{ {
struct hclge_dev *hdev = vport->back; struct hclge_dev *hdev = vport->back;
bool is_full; bool is_full;
mutex_lock(&hdev->umv_mutex); if (need_lock)
mutex_lock(&hdev->vport_lock);
is_full = (vport->used_umv_num >= hdev->priv_umv_size && is_full = (vport->used_umv_num >= hdev->priv_umv_size &&
hdev->share_umv_size == 0); hdev->share_umv_size == 0);
mutex_unlock(&hdev->umv_mutex);
if (need_lock)
mutex_unlock(&hdev->vport_lock);
return is_full; return is_full;
} }
...@@ -7292,7 +7295,6 @@ static void hclge_update_umv_space(struct hclge_vport *vport, bool is_free) ...@@ -7292,7 +7295,6 @@ static void hclge_update_umv_space(struct hclge_vport *vport, bool is_free)
{ {
struct hclge_dev *hdev = vport->back; struct hclge_dev *hdev = vport->back;
mutex_lock(&hdev->umv_mutex);
if (is_free) { if (is_free) {
if (vport->used_umv_num > hdev->priv_umv_size) if (vport->used_umv_num > hdev->priv_umv_size)
hdev->share_umv_size++; hdev->share_umv_size++;
...@@ -7305,7 +7307,6 @@ static void hclge_update_umv_space(struct hclge_vport *vport, bool is_free) ...@@ -7305,7 +7307,6 @@ static void hclge_update_umv_space(struct hclge_vport *vport, bool is_free)
hdev->share_umv_size--; hdev->share_umv_size--;
vport->used_umv_num++; vport->used_umv_num++;
} }
mutex_unlock(&hdev->umv_mutex);
} }
static struct hclge_mac_node *hclge_find_mac_node(struct list_head *list, static struct hclge_mac_node *hclge_find_mac_node(struct list_head *list,
...@@ -7446,12 +7447,15 @@ int hclge_add_uc_addr_common(struct hclge_vport *vport, ...@@ -7446,12 +7447,15 @@ int hclge_add_uc_addr_common(struct hclge_vport *vport,
*/ */
ret = hclge_lookup_mac_vlan_tbl(vport, &req, &desc, false); ret = hclge_lookup_mac_vlan_tbl(vport, &req, &desc, false);
if (ret == -ENOENT) { if (ret == -ENOENT) {
if (!hclge_is_umv_space_full(vport)) { mutex_lock(&hdev->vport_lock);
if (!hclge_is_umv_space_full(vport, false)) {
ret = hclge_add_mac_vlan_tbl(vport, &req, NULL); ret = hclge_add_mac_vlan_tbl(vport, &req, NULL);
if (!ret) if (!ret)
hclge_update_umv_space(vport, false); hclge_update_umv_space(vport, false);
mutex_unlock(&hdev->vport_lock);
return ret; return ret;
} }
mutex_unlock(&hdev->vport_lock);
if (!(vport->overflow_promisc_flags & HNAE3_OVERFLOW_UPE)) if (!(vport->overflow_promisc_flags & HNAE3_OVERFLOW_UPE))
dev_err(&hdev->pdev->dev, "UC MAC table full(%u)\n", dev_err(&hdev->pdev->dev, "UC MAC table full(%u)\n",
...@@ -7503,10 +7507,13 @@ int hclge_rm_uc_addr_common(struct hclge_vport *vport, ...@@ -7503,10 +7507,13 @@ int hclge_rm_uc_addr_common(struct hclge_vport *vport,
hnae3_set_bit(req.entry_type, HCLGE_MAC_VLAN_BIT0_EN_B, 0); hnae3_set_bit(req.entry_type, HCLGE_MAC_VLAN_BIT0_EN_B, 0);
hclge_prepare_mac_addr(&req, addr, false); hclge_prepare_mac_addr(&req, addr, false);
ret = hclge_remove_mac_vlan_tbl(vport, &req); ret = hclge_remove_mac_vlan_tbl(vport, &req);
if (!ret) if (!ret) {
mutex_lock(&hdev->vport_lock);
hclge_update_umv_space(vport, true); hclge_update_umv_space(vport, true);
else if (ret == -ENOENT) mutex_unlock(&hdev->vport_lock);
} else if (ret == -ENOENT) {
ret = 0; ret = 0;
}
return ret; return ret;
} }
...@@ -10163,7 +10170,7 @@ static int hclge_set_vf_spoofchk(struct hnae3_handle *handle, int vf, ...@@ -10163,7 +10170,7 @@ static int hclge_set_vf_spoofchk(struct hnae3_handle *handle, int vf,
dev_warn(&hdev->pdev->dev, dev_warn(&hdev->pdev->dev,
"vf %d vlan table is full, enable spoof check may cause its packet send fail\n", "vf %d vlan table is full, enable spoof check may cause its packet send fail\n",
vf); vf);
else if (enable && hclge_is_umv_space_full(vport)) else if (enable && hclge_is_umv_space_full(vport, true))
dev_warn(&hdev->pdev->dev, dev_warn(&hdev->pdev->dev,
"vf %d mac table is full, enable spoof check may cause its packet send fail\n", "vf %d mac table is full, enable spoof check may cause its packet send fail\n",
vf); vf);
......
...@@ -831,7 +831,6 @@ struct hclge_dev { ...@@ -831,7 +831,6 @@ struct hclge_dev {
u16 priv_umv_size; u16 priv_umv_size;
/* unicast mac vlan space shared by PF and its VFs */ /* unicast mac vlan space shared by PF and its VFs */
u16 share_umv_size; u16 share_umv_size;
struct mutex umv_mutex; /* protect share_umv_size */
DECLARE_KFIFO(mac_tnl_log, struct hclge_mac_tnl_stats, DECLARE_KFIFO(mac_tnl_log, struct hclge_mac_tnl_stats,
HCLGE_MAC_TNL_LOG_SIZE); HCLGE_MAC_TNL_LOG_SIZE);
......
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