aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/cio/device.c
diff options
context:
space:
mode:
authorSebastian Ott <sebott@linux.vnet.ibm.com>2010-02-26 16:37:24 -0500
committerMartin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com>2010-02-26 16:37:29 -0500
commitbe5d3823f29c09676abd2eeea4f9767bc4a1a531 (patch)
tree0a89be6c2b36e1db6f1118cf2b483c84d1ac8def /drivers/s390/cio/device.c
parent6f5d09a0e9731a39a4d52a5902daec72c1e43692 (diff)
[S390] cio: consolidate workqueues
We used to maintain 2 singlethreaded workqueues for synchronization and to trigger work from interrupt context. Since our latest cio changes we only use one of these workqueues. So get rid of the unused workqueue, rename the remaining one to "cio_work_q" and move its ownership to the channel subsystem driver. Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390/cio/device.c')
-rw-r--r--drivers/s390/cio/device.c28
1 files changed, 6 insertions, 22 deletions
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c
index a6c7d5426fb..9c9ea45141a 100644
--- a/drivers/s390/cio/device.c
+++ b/drivers/s390/cio/device.c
@@ -136,7 +136,6 @@ static int io_subchannel_sch_event(struct subchannel *, int);
136static int io_subchannel_chp_event(struct subchannel *, struct chp_link *, 136static int io_subchannel_chp_event(struct subchannel *, struct chp_link *,
137 int); 137 int);
138static void recovery_func(unsigned long data); 138static void recovery_func(unsigned long data);
139struct workqueue_struct *ccw_device_work;
140wait_queue_head_t ccw_device_init_wq; 139wait_queue_head_t ccw_device_init_wq;
141atomic_t ccw_device_init_count; 140atomic_t ccw_device_init_count;
142 141
@@ -163,7 +162,7 @@ static void io_subchannel_settle(void)
163{ 162{
164 wait_event(ccw_device_init_wq, 163 wait_event(ccw_device_init_wq,
165 atomic_read(&ccw_device_init_count) == 0); 164 atomic_read(&ccw_device_init_count) == 0);
166 flush_workqueue(ccw_device_work); 165 flush_workqueue(cio_work_q);
167} 166}
168 167
169static struct css_driver io_subchannel_driver = { 168static struct css_driver io_subchannel_driver = {
@@ -188,27 +187,13 @@ int __init io_subchannel_init(void)
188 atomic_set(&ccw_device_init_count, 0); 187 atomic_set(&ccw_device_init_count, 0);
189 setup_timer(&recovery_timer, recovery_func, 0); 188 setup_timer(&recovery_timer, recovery_func, 0);
190 189
191 ccw_device_work = create_singlethread_workqueue("cio"); 190 ret = bus_register(&ccw_bus_type);
192 if (!ccw_device_work) 191 if (ret)
193 return -ENOMEM; 192 return ret;
194 slow_path_wq = create_singlethread_workqueue("kslowcrw");
195 if (!slow_path_wq) {
196 ret = -ENOMEM;
197 goto out_err;
198 }
199 if ((ret = bus_register (&ccw_bus_type)))
200 goto out_err;
201
202 ret = css_driver_register(&io_subchannel_driver); 193 ret = css_driver_register(&io_subchannel_driver);
203 if (ret) 194 if (ret)
204 goto out_err; 195 bus_unregister(&ccw_bus_type);
205 196
206 return 0;
207out_err:
208 if (ccw_device_work)
209 destroy_workqueue(ccw_device_work);
210 if (slow_path_wq)
211 destroy_workqueue(slow_path_wq);
212 return ret; 197 return ret;
213} 198}
214 199
@@ -2028,7 +2013,7 @@ void ccw_device_sched_todo(struct ccw_device *cdev, enum cdev_todo todo)
2028 /* Get workqueue ref. */ 2013 /* Get workqueue ref. */
2029 if (!get_device(&cdev->dev)) 2014 if (!get_device(&cdev->dev))
2030 return; 2015 return;
2031 if (!queue_work(slow_path_wq, &cdev->private->todo_work)) { 2016 if (!queue_work(cio_work_q, &cdev->private->todo_work)) {
2032 /* Already queued, release workqueue ref. */ 2017 /* Already queued, release workqueue ref. */
2033 put_device(&cdev->dev); 2018 put_device(&cdev->dev);
2034 } 2019 }
@@ -2041,5 +2026,4 @@ EXPORT_SYMBOL(ccw_driver_register);
2041EXPORT_SYMBOL(ccw_driver_unregister); 2026EXPORT_SYMBOL(ccw_driver_unregister);
2042EXPORT_SYMBOL(get_ccwdev_by_busid); 2027EXPORT_SYMBOL(get_ccwdev_by_busid);
2043EXPORT_SYMBOL(ccw_bus_type); 2028EXPORT_SYMBOL(ccw_bus_type);
2044EXPORT_SYMBOL(ccw_device_work);
2045EXPORT_SYMBOL_GPL(ccw_device_get_subchannel_id); 2029EXPORT_SYMBOL_GPL(ccw_device_get_subchannel_id);