Commit 640f93cc authored by Jia-Ju Bai's avatar Jia-Ju Bai Committed by David S. Miller

i40e: Fix a sleep-in-atomic bug

The driver may sleep under a spin lock, and the function call path is:
i40e_ndo_set_vf_port_vlan (acquire the lock by spin_lock_bh)
  i40e_vsi_remove_pvid
    i40e_vlan_stripping_disable
      i40e_aq_update_vsi_params
        i40e_asq_send_command
          mutex_lock --> may sleep

To fixed it, the spin lock is released before "i40e_vsi_remove_pvid", and
the lock is acquired again after this function.
Signed-off-by: default avatarJia-Ju Bai <baijiaju1990@163.com>
Tested-by: default avatarAndrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 849a44de
...@@ -3017,10 +3017,12 @@ int i40e_ndo_set_vf_port_vlan(struct net_device *netdev, int vf_id, ...@@ -3017,10 +3017,12 @@ int i40e_ndo_set_vf_port_vlan(struct net_device *netdev, int vf_id,
VLAN_VID_MASK)); VLAN_VID_MASK));
} }
spin_unlock_bh(&vsi->mac_filter_hash_lock);
if (vlan_id || qos) if (vlan_id || qos)
ret = i40e_vsi_add_pvid(vsi, vlanprio); ret = i40e_vsi_add_pvid(vsi, vlanprio);
else else
i40e_vsi_remove_pvid(vsi); i40e_vsi_remove_pvid(vsi);
spin_lock_bh(&vsi->mac_filter_hash_lock);
if (vlan_id) { if (vlan_id) {
dev_info(&pf->pdev->dev, "Setting VLAN %d, QOS 0x%x on VF %d\n", dev_info(&pf->pdev->dev, "Setting VLAN %d, QOS 0x%x on VF %d\n",
......
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