@@ -643,8 +643,6 @@ static int set_rxmode(struct net_device *dev, int mtu, bool sleep_ok)
643
643
return ret ;
644
644
}
645
645
646
- static struct workqueue_struct * workq ;
647
-
648
646
/**
649
647
* link_start - enable a port
650
648
* @dev: the port to enable
@@ -3340,7 +3338,7 @@ static void cxgb4_queue_tid_release(struct tid_info *t, unsigned int chan,
3340
3338
adap -> tid_release_head = (void * * )((uintptr_t )p | chan );
3341
3339
if (!adap -> tid_release_task_busy ) {
3342
3340
adap -> tid_release_task_busy = true;
3343
- queue_work (workq , & adap -> tid_release_task );
3341
+ queue_work (adap -> workq , & adap -> tid_release_task );
3344
3342
}
3345
3343
spin_unlock_bh (& adap -> tid_release_lock );
3346
3344
}
@@ -4140,7 +4138,7 @@ void t4_db_full(struct adapter *adap)
4140
4138
notify_rdma_uld (adap , CXGB4_CONTROL_DB_FULL );
4141
4139
t4_set_reg_field (adap , SGE_INT_ENABLE3 ,
4142
4140
DBFIFO_HP_INT | DBFIFO_LP_INT , 0 );
4143
- queue_work (workq , & adap -> db_full_task );
4141
+ queue_work (adap -> workq , & adap -> db_full_task );
4144
4142
}
4145
4143
}
4146
4144
@@ -4150,7 +4148,7 @@ void t4_db_dropped(struct adapter *adap)
4150
4148
disable_dbs (adap );
4151
4149
notify_rdma_uld (adap , CXGB4_CONTROL_DB_FULL );
4152
4150
}
4153
- queue_work (workq , & adap -> db_drop_task );
4151
+ queue_work (adap -> workq , & adap -> db_drop_task );
4154
4152
}
4155
4153
4156
4154
static void uld_attach (struct adapter * adap , unsigned int uld )
@@ -6517,6 +6515,12 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
6517
6515
goto out_disable_device ;
6518
6516
}
6519
6517
6518
+ adapter -> workq = create_singlethread_workqueue ("cxgb4" );
6519
+ if (!adapter -> workq ) {
6520
+ err = - ENOMEM ;
6521
+ goto out_free_adapter ;
6522
+ }
6523
+
6520
6524
/* PCI device has been enabled */
6521
6525
adapter -> flags |= DEV_ENABLED ;
6522
6526
@@ -6715,6 +6719,9 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
6715
6719
out_unmap_bar0 :
6716
6720
iounmap (adapter -> regs );
6717
6721
out_free_adapter :
6722
+ if (adapter -> workq )
6723
+ destroy_workqueue (adapter -> workq );
6724
+
6718
6725
kfree (adapter );
6719
6726
out_disable_device :
6720
6727
pci_disable_pcie_error_reporting (pdev );
@@ -6736,6 +6743,11 @@ static void remove_one(struct pci_dev *pdev)
6736
6743
if (adapter ) {
6737
6744
int i ;
6738
6745
6746
+ /* Tear down per-adapter Work Queue first since it can contain
6747
+ * references to our adapter data structure.
6748
+ */
6749
+ destroy_workqueue (adapter -> workq );
6750
+
6739
6751
if (is_offload (adapter ))
6740
6752
detach_ulds (adapter );
6741
6753
@@ -6788,20 +6800,14 @@ static int __init cxgb4_init_module(void)
6788
6800
{
6789
6801
int ret ;
6790
6802
6791
- workq = create_singlethread_workqueue ("cxgb4" );
6792
- if (!workq )
6793
- return - ENOMEM ;
6794
-
6795
6803
/* Debugfs support is optional, just warn if this fails */
6796
6804
cxgb4_debugfs_root = debugfs_create_dir (KBUILD_MODNAME , NULL );
6797
6805
if (!cxgb4_debugfs_root )
6798
6806
pr_warn ("could not create debugfs entry, continuing\n" );
6799
6807
6800
6808
ret = pci_register_driver (& cxgb4_driver );
6801
- if (ret < 0 ) {
6809
+ if (ret < 0 )
6802
6810
debugfs_remove (cxgb4_debugfs_root );
6803
- destroy_workqueue (workq );
6804
- }
6805
6811
6806
6812
register_inet6addr_notifier (& cxgb4_inet6addr_notifier );
6807
6813
@@ -6813,8 +6819,6 @@ static void __exit cxgb4_cleanup_module(void)
6813
6819
unregister_inet6addr_notifier (& cxgb4_inet6addr_notifier );
6814
6820
pci_unregister_driver (& cxgb4_driver );
6815
6821
debugfs_remove (cxgb4_debugfs_root ); /* NULL ok */
6816
- flush_workqueue (workq );
6817
- destroy_workqueue (workq );
6818
6822
}
6819
6823
6820
6824
module_init (cxgb4_init_module );
0 commit comments