diff options
author | Tejun Heo <tj@kernel.org> | 2010-12-24 18:14:20 +0300 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2010-12-24 18:14:20 +0300 |
commit | 883624a08cb4144343e7362d9fff0e2c69613ebf (patch) | |
tree | 9c2ba7c942e76d2b333ec9853f293ef5bfac5ca3 /drivers | |
parent | ee4569a3a75e1a5ed53b0c4ff4d9fc456aa98ef1 (diff) | |
download | linux-883624a08cb4144343e7362d9fff0e2c69613ebf.tar.xz |
ioc4: use static work_struct for ioc4_load_modules()
There is no reason to dynamically allocate work_struct for
ioc4_load_modules(). It makes the code more complex and makes it
impossible to flush the work directly. Use static work
ioc4_load_modules_work instead and flush it directly on exit.
This removes the use of flush_scheduled_work() which is being
deprecated.
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Brent Casavant <bcasavan@sgi.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/misc/ioc4.c | 29 |
1 files changed, 9 insertions, 20 deletions
diff --git a/drivers/misc/ioc4.c b/drivers/misc/ioc4.c index 193206602d88..668d41e594a9 100644 --- a/drivers/misc/ioc4.c +++ b/drivers/misc/ioc4.c @@ -273,13 +273,11 @@ ioc4_variant(struct ioc4_driver_data *idd) static void __devinit ioc4_load_modules(struct work_struct *work) { - /* arg just has to be freed */ - request_module("sgiioc4"); - - kfree(work); } +static DECLARE_WORK(ioc4_load_modules_work, ioc4_load_modules); + /* Adds a new instance of an IOC4 card */ static int __devinit ioc4_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id) @@ -396,21 +394,12 @@ ioc4_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id) * PCI device. */ if (idd->idd_variant != IOC4_VARIANT_PCI_RT) { - struct work_struct *work; - work = kzalloc(sizeof(struct work_struct), GFP_KERNEL); - if (!work) { - printk(KERN_WARNING - "%s: IOC4 unable to allocate memory for " - "load of sub-modules.\n", __func__); - } else { - /* Request the module from a work procedure as the - * modprobe goes out to a userland helper and that - * will hang if done directly from ioc4_probe(). - */ - printk(KERN_INFO "IOC4 loading sgiioc4 submodule\n"); - INIT_WORK(work, ioc4_load_modules); - schedule_work(work); - } + /* Request the module from a work procedure as the modprobe + * goes out to a userland helper and that will hang if done + * directly from ioc4_probe(). + */ + printk(KERN_INFO "IOC4 loading sgiioc4 submodule\n"); + schedule_work(&ioc4_load_modules_work); } return 0; @@ -498,7 +487,7 @@ static void __exit ioc4_exit(void) { /* Ensure ioc4_load_modules() has completed before exiting */ - flush_scheduled_work(); + flush_work_sync(&ioc4_load_modules_work); pci_unregister_driver(&ioc4_driver); } |