[S87,v5,1/7] i40e: Fix attach VF to VM issue

Message ID 20180308225211.12254-1-jeffrey.t.kirsher@intel.com
State Accepted
Delegated to: Jeff Kirsher
Headers show
Series
  • [S87,v5,1/7] i40e: Fix attach VF to VM issue
Related show

Commit Message

Jeff Kirsher March 8, 2018, 10:52 p.m.
From: Paweł Jabłoński <pawel.jablonski@intel.com>

Fix for "Resource temporarily unavailable" problem when virsh is
trying to attach a device to VM. When the VF driver is loaded on
host and virsh is trying to attach it to the VM and set a MAC
address, it ends with a race condition between i40e_reset_vf and
i40e_ndo_set_vf_mac functions. The bug is fixed by adding polling
in i40e_ndo_set_vf_mac function For when the VF is in Reset mode.

Signed-off-by: Paweł Jabłoński <pawel.jablonski@intel.com>
---
 drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

Comments

Bowers, AndrewX March 12, 2018, 7:29 p.m. | #1
> -----Original Message-----

> From: Intel-wired-lan [mailto:intel-wired-lan-bounces@osuosl.org] On

> Behalf Of Jeff Kirsher

> Sent: Thursday, March 8, 2018 2:52 PM

> To: intel-wired-lan@lists.osuosl.org

> Cc: Jablonski, Pawel <pawel.jablonski@intel.com>

> Subject: [Intel-wired-lan] [S87 v5 1/7] i40e: Fix attach VF to VM issue

> 

> From: Paweł Jabłoński <pawel.jablonski@intel.com>

> 

> Fix for "Resource temporarily unavailable" problem when virsh is trying to

> attach a device to VM. When the VF driver is loaded on host and virsh is

> trying to attach it to the VM and set a MAC address, it ends with a race

> condition between i40e_reset_vf and i40e_ndo_set_vf_mac functions. The

> bug is fixed by adding polling in i40e_ndo_set_vf_mac function For when the

> VF is in Reset mode.

> 

> Signed-off-by: Paweł Jabłoński <pawel.jablonski@intel.com>

> ---

>  drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 11 +++++++++++

>  1 file changed, 11 insertions(+)


Tested-by: Andrew Bowers <andrewx.bowers@intel.com>

Patch

diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
index 6049a5640f26..8559c099525d 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
@@ -3742,6 +3742,7 @@  int i40e_ndo_set_vf_mac(struct net_device *netdev, int vf_id, u8 *mac)
 	int ret = 0;
 	struct hlist_node *h;
 	int bkt;
+	u8 i;
 
 	/* validate the request */
 	if (vf_id >= pf->num_alloc_vfs) {
@@ -3753,6 +3754,16 @@  int i40e_ndo_set_vf_mac(struct net_device *netdev, int vf_id, u8 *mac)
 
 	vf = &(pf->vf[vf_id]);
 	vsi = pf->vsi[vf->lan_vsi_idx];
+
+	/* When the VF is resetting wait until it is done.
+	 * It can take up to 200 milliseconds,
+	 * but wait for up to 300 milliseconds to be safe.
+	 */
+	for (i = 0; i < 15; i++) {
+		if (test_bit(I40E_VF_STATE_INIT, &vf->vf_states))
+			break;
+		msleep(20);
+	}
 	if (!test_bit(I40E_VF_STATE_INIT, &vf->vf_states)) {
 		dev_err(&pf->pdev->dev, "VF %d still in reset. Try again.\n",
 			vf_id);