i40e: Fix a bug where a client close can be called before an open is complete
authorAnjali Singhai Jain <anjali.singhai@intel.com>
Wed, 27 Jul 2016 19:02:30 +0000 (12:02 -0700)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Thu, 18 Aug 2016 18:43:10 +0000 (11:43 -0700)
The client->open call in this path was not protected with the
client instance mutex, and hence the client->close can get initiated
before the open completes.

Change-Id: I0ed60c38868dd3f44966b6ed49a063d0e5b7edf5
Signed-off-by: Anjali Singhai Jain <anjali.singhai@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/i40e/i40e_client.c

index e6b9263..8726269 100644 (file)
@@ -541,6 +541,7 @@ void i40e_client_subtask(struct i40e_pf *pf)
                         client->name, pf->hw.pf_id,
                         pf->hw.bus.device, pf->hw.bus.func);
 
+               mutex_lock(&i40e_client_instance_mutex);
                /* Send an Open request to the client */
                atomic_inc(&cdev->ref_cnt);
                if (client->ops && client->ops->open)
@@ -554,6 +555,7 @@ void i40e_client_subtask(struct i40e_pf *pf)
                        atomic_dec(&client->ref_cnt);
                        continue;
                }
+               mutex_unlock(&i40e_client_instance_mutex);
        }
        mutex_unlock(&i40e_client_mutex);
 }