]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
i40e: Check client is open before calling client ops
authorCatherine Sullivan <catherine.sullivan@intel.com>
Mon, 15 Aug 2016 21:17:18 +0000 (14:17 -0700)
committerDhaval Giani <dhaval.giani@oracle.com>
Wed, 8 Mar 2017 00:38:09 +0000 (19:38 -0500)
Orabug: 24568124

We were having a race between the completion of the client open and
calls to the client ops so don't call a client op unless we are sure the
client is open.

Testing Hints: Load IWARP driver and make sure it works as expected.

Change-Id: I741f4f2aa4fcbfdad3e40dabbbb1b005856c396b
Signed-off-by: Catherine Sullivan <catherine.sullivan@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
(cherry picked from commit 91cdca4faa3e4085b37cc084b15955bb20ca2e31)
Signed-off-by: Brian Maly <brian.maly@oracle.com>
Signed-off-by: Dhaval Giani <dhaval.giani@oracle.com>
drivers/net/ethernet/intel/i40e/i40e_client.c

index 2af0811012bd9ea933a8d75f83016fb845a4ea1b..1035f885d57be569c8ad385348f5a1ffe4fa5191 100644 (file)
@@ -148,6 +148,11 @@ i40e_notify_client_of_vf_msg(struct i40e_vsi *vsi, u32 vf_id, u8 *msg, u16 len)
                                        "Cannot locate client instance virtual channel receive routine\n");
                                continue;
                        }
+                       if (!test_bit(__I40E_CLIENT_INSTANCE_OPENED,
+                                     &cdev->state)) {
+                               dev_dbg(&vsi->back->pdev->dev, "Client is not open, abort virtchnl_receive\n");
+                               continue;
+                       }
                        cdev->client->ops->virtchnl_receive(&cdev->lan_info,
                                                            cdev->client,
                                                            vf_id, msg, len);
@@ -169,6 +174,8 @@ void i40e_notify_client_of_l2_param_changes(struct i40e_vsi *vsi)
 
        if (!vsi)
                return;
+       memset(&params, 0, sizeof(params));
+       i40e_client_get_params(vsi, &params);
        mutex_lock(&i40e_client_instance_mutex);
        list_for_each_entry(cdev, &i40e_client_instances, list) {
                if (cdev->lan_info.pf == vsi->back) {
@@ -179,8 +186,11 @@ void i40e_notify_client_of_l2_param_changes(struct i40e_vsi *vsi)
                                        "Cannot locate client instance l2_param_change routine\n");
                                continue;
                        }
-                       memset(&params, 0, sizeof(params));
-                       i40e_client_get_params(vsi, &params);
+                       if (!test_bit(__I40E_CLIENT_INSTANCE_OPENED,
+                                     &cdev->state)) {
+                               dev_dbg(&vsi->back->pdev->dev, "Client is not open, abort l2 param change\n");
+                               continue;
+                       }
                        cdev->lan_info.params = params;
                        cdev->client->ops->l2_param_change(&cdev->lan_info,
                                                           cdev->client,
@@ -298,6 +308,11 @@ void i40e_notify_client_of_vf_reset(struct i40e_pf *pf, u32 vf_id)
                                        "Cannot locate client instance VF reset routine\n");
                                continue;
                        }
+                       if (!test_bit(__I40E_CLIENT_INSTANCE_OPENED,
+                                     &cdev->state)) {
+                               dev_dbg(&pf->pdev->dev, "Client is not open, abort vf-reset\n");
+                               continue;
+                       }
                        cdev->client->ops->vf_reset(&cdev->lan_info,
                                                    cdev->client, vf_id);
                }
@@ -328,6 +343,11 @@ void i40e_notify_client_of_vf_enable(struct i40e_pf *pf, u32 num_vfs)
                                        "Cannot locate client instance VF enable routine\n");
                                continue;
                        }
+                       if (!test_bit(__I40E_CLIENT_INSTANCE_OPENED,
+                                     &cdev->state)) {
+                               dev_dbg(&pf->pdev->dev, "Client is not open, abort vf-enable\n");
+                               continue;
+                       }
                        cdev->client->ops->vf_enable(&cdev->lan_info,
                                                     cdev->client, num_vfs);
                }
@@ -362,6 +382,11 @@ int i40e_vf_client_capable(struct i40e_pf *pf, u32 vf_id,
                                        "Cannot locate client instance VF capability routine\n");
                                continue;
                        }
+                       if (!test_bit(__I40E_CLIENT_INSTANCE_OPENED,
+                                     &cdev->state)) {
+                               dev_dbg(&pf->pdev->dev, "Client is not open, abort vf-capable\n");
+                               continue;
+                       }
                        capable = cdev->client->ops->vf_capable(&cdev->lan_info,
                                                                cdev->client,
                                                                vf_id);