IB/hfi1: Fix an Oops on pci device force remove
This patch fixes an Oops on device unbind, when the device is used by a PSM user process. PSM processes access device resources which are freed on device removal. Similar protection exists in uverbs in ib_core for Verbs clients, but PSM doesn't use ib_uverbs hence a separate protection is required for PSM clients. Cc: Jason Gunthorpe <jgunthorpe@obsidianresearch.com> Reviewed-by: Ira Weiny <ira.weiny@intel.com> Reviewed-by: Dean Luick <dean.luick@intel.com> Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com> Signed-off-by: Tadeusz Struk <tadeusz.struk@intel.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
committed by
Doug Ledford
parent
d9ac4555fb
commit
acd7c8fe14
@ -1538,12 +1538,31 @@ bail:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void wait_for_clients(struct hfi1_devdata *dd)
|
||||
{
|
||||
/*
|
||||
* Remove the device init value and complete the device if there is
|
||||
* no clients or wait for active clients to finish.
|
||||
*/
|
||||
if (atomic_dec_and_test(&dd->user_refcount))
|
||||
complete(&dd->user_comp);
|
||||
|
||||
wait_for_completion(&dd->user_comp);
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
/* remove the /dev hfi1 interface */
|
||||
hfi1_device_remove(dd);
|
||||
|
||||
/* wait for existing user space clients to finish */
|
||||
wait_for_clients(dd);
|
||||
|
||||
/* unregister from IB core */
|
||||
hfi1_unregister_ib_device(dd);
|
||||
|
||||
@ -1558,8 +1577,6 @@ static void remove_one(struct pci_dev *pdev)
|
||||
/* wait until all of our (qsfp) queue_work() calls complete */
|
||||
flush_workqueue(ib_wq);
|
||||
|
||||
hfi1_device_remove(dd);
|
||||
|
||||
postinit_cleanup(dd);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user