aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDean Luick <[email protected]>2016-02-18 11:12:25 -0800
committerDoug Ledford <[email protected]>2016-03-10 20:45:44 -0500
commited6f653fe430ed4912aebec10a1b9d57813fe44c (patch)
treeccaa4092af6c120ee5eae1f245ed55274d6110a5
parente8aa284ba0cd2a1b6bfb3181a5b3b7f0bdefbe1a (diff)
staging/rdma/hfi1: Fix debugfs access race
Debugfs access races with the driver being ready. Make sure the driver is ready before debugfs files appear and debufs files are gone before the driver starts tearing down. Reviewed-by: Mike Marciniszyn <[email protected]> Signed-off-by: Dean Luick <[email protected]> Signed-off-by: Jubin John <[email protected]> Signed-off-by: Doug Ledford <[email protected]>
-rw-r--r--drivers/staging/rdma/hfi1/init.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/staging/rdma/hfi1/init.c b/drivers/staging/rdma/hfi1/init.c
index 2def53895d50..371ed293677d 100644
--- a/drivers/staging/rdma/hfi1/init.c
+++ b/drivers/staging/rdma/hfi1/init.c
@@ -983,7 +983,6 @@ void hfi1_free_devdata(struct hfi1_devdata *dd)
list_del(&dd->list);
spin_unlock_irqrestore(&hfi1_devs_lock, flags);
free_platform_config(dd);
- hfi1_dbg_ibdev_exit(&dd->verbs_dev);
rcu_barrier(); /* wait for rcu callbacks to complete */
free_percpu(dd->int_counter);
free_percpu(dd->rcv_limit);
@@ -1088,7 +1087,6 @@ struct hfi1_devdata *hfi1_alloc_devdata(struct pci_dev *pdev, size_t extra)
&pdev->dev,
"Could not alloc cpulist info, cpu affinity might be wrong\n");
}
- hfi1_dbg_ibdev_init(&dd->verbs_dev);
return dd;
bail:
@@ -1445,8 +1443,11 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
* we still create devices, so diags, etc. can be used
* to determine cause of problem.
*/
- if (!initfail && !ret)
+ if (!initfail && !ret) {
dd->flags |= HFI1_INITTED;
+ /* create debufs files after init and ib register */
+ hfi1_dbg_ibdev_init(&dd->verbs_dev);
+ }
j = hfi1_device_create(dd);
if (j)
@@ -1487,6 +1488,8 @@ static void remove_one(struct pci_dev *pdev)
{
struct hfi1_devdata *dd = pci_get_drvdata(pdev);
+ /* close debugfs files before ib unregister */
+ hfi1_dbg_ibdev_exit(&dd->verbs_dev);
/* unregister from IB core */
hfi1_unregister_ib_device(dd);