|
@@ -80,7 +80,6 @@ unsigned qib_wc_pat = 1; /* default (1) is to use PAT, not MTRR */
|
|
|
module_param_named(wc_pat, qib_wc_pat, uint, S_IRUGO);
|
|
|
MODULE_PARM_DESC(wc_pat, "enable write-combining via PAT mechanism");
|
|
|
|
|
|
-struct workqueue_struct *qib_wq;
|
|
|
struct workqueue_struct *qib_cq_wq;
|
|
|
|
|
|
static void verify_interrupt(unsigned long);
|
|
@@ -1044,24 +1043,10 @@ static int __init qlogic_ib_init(void)
|
|
|
if (ret)
|
|
|
goto bail;
|
|
|
|
|
|
- /*
|
|
|
- * We create our own workqueue mainly because we want to be
|
|
|
- * able to flush it when devices are being removed. We can't
|
|
|
- * use schedule_work()/flush_scheduled_work() because both
|
|
|
- * unregister_netdev() and linkwatch_event take the rtnl lock,
|
|
|
- * so flush_scheduled_work() can deadlock during device
|
|
|
- * removal.
|
|
|
- */
|
|
|
- qib_wq = create_workqueue("qib");
|
|
|
- if (!qib_wq) {
|
|
|
- ret = -ENOMEM;
|
|
|
- goto bail_dev;
|
|
|
- }
|
|
|
-
|
|
|
qib_cq_wq = create_singlethread_workqueue("qib_cq");
|
|
|
if (!qib_cq_wq) {
|
|
|
ret = -ENOMEM;
|
|
|
- goto bail_wq;
|
|
|
+ goto bail_dev;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -1091,8 +1076,6 @@ bail_unit:
|
|
|
idr_destroy(&qib_unit_table);
|
|
|
bail_cq_wq:
|
|
|
destroy_workqueue(qib_cq_wq);
|
|
|
-bail_wq:
|
|
|
- destroy_workqueue(qib_wq);
|
|
|
bail_dev:
|
|
|
qib_dev_cleanup();
|
|
|
bail:
|
|
@@ -1116,7 +1099,6 @@ static void __exit qlogic_ib_cleanup(void)
|
|
|
|
|
|
pci_unregister_driver(&qib_driver);
|
|
|
|
|
|
- destroy_workqueue(qib_wq);
|
|
|
destroy_workqueue(qib_cq_wq);
|
|
|
|
|
|
qib_cpulist_count = 0;
|
|
@@ -1289,7 +1271,7 @@ static int __devinit qib_init_one(struct pci_dev *pdev,
|
|
|
|
|
|
if (qib_mini_init || initfail || ret) {
|
|
|
qib_stop_timers(dd);
|
|
|
- flush_scheduled_work();
|
|
|
+ flush_workqueue(ib_wq);
|
|
|
for (pidx = 0; pidx < dd->num_pports; ++pidx)
|
|
|
dd->f_quiet_serdes(dd->pport + pidx);
|
|
|
if (qib_mini_init)
|
|
@@ -1338,8 +1320,8 @@ static void __devexit qib_remove_one(struct pci_dev *pdev)
|
|
|
|
|
|
qib_stop_timers(dd);
|
|
|
|
|
|
- /* wait until all of our (qsfp) schedule_work() calls complete */
|
|
|
- flush_scheduled_work();
|
|
|
+ /* wait until all of our (qsfp) queue_work() calls complete */
|
|
|
+ flush_workqueue(ib_wq);
|
|
|
|
|
|
ret = qibfs_remove(dd);
|
|
|
if (ret)
|