diff options
author | Tejun Heo <tj@kernel.org> | 2012-08-03 13:30:46 -0400 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2012-08-03 13:30:46 -0400 |
commit | 7beb2edf44b4dea820c733046ad7666d092bb4b6 (patch) | |
tree | ef264acb53bf3e0c2349792bceb6a19806d8867c /kernel/workqueue.c | |
parent | b5490077274482efde57a50b060b99bc839acd45 (diff) |
workqueue: factor out __queue_delayed_work() from queue_delayed_work_on()
This is to prepare for mod_delayed_work[_on]() and doesn't cause any
functional difference.
Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'kernel/workqueue.c')
-rw-r--r-- | kernel/workqueue.c | 74 |
1 files changed, 41 insertions, 33 deletions
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index eeae7707948..d7f1b7e2bba 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c | |||
@@ -1261,6 +1261,46 @@ void delayed_work_timer_fn(unsigned long __data) | |||
1261 | } | 1261 | } |
1262 | EXPORT_SYMBOL_GPL(delayed_work_timer_fn); | 1262 | EXPORT_SYMBOL_GPL(delayed_work_timer_fn); |
1263 | 1263 | ||
1264 | static void __queue_delayed_work(int cpu, struct workqueue_struct *wq, | ||
1265 | struct delayed_work *dwork, unsigned long delay) | ||
1266 | { | ||
1267 | struct timer_list *timer = &dwork->timer; | ||
1268 | struct work_struct *work = &dwork->work; | ||
1269 | unsigned int lcpu; | ||
1270 | |||
1271 | WARN_ON_ONCE(timer->function != delayed_work_timer_fn || | ||
1272 | timer->data != (unsigned long)dwork); | ||
1273 | BUG_ON(timer_pending(timer)); | ||
1274 | BUG_ON(!list_empty(&work->entry)); | ||
1275 | |||
1276 | timer_stats_timer_set_start_info(&dwork->timer); | ||
1277 | |||
1278 | /* | ||
1279 | * This stores cwq for the moment, for the timer_fn. Note that the | ||
1280 | * work's gcwq is preserved to allow reentrance detection for | ||
1281 | * delayed works. | ||
1282 | */ | ||
1283 | if (!(wq->flags & WQ_UNBOUND)) { | ||
1284 | struct global_cwq *gcwq = get_work_gcwq(work); | ||
1285 | |||
1286 | if (gcwq && gcwq->cpu != WORK_CPU_UNBOUND) | ||
1287 | lcpu = gcwq->cpu; | ||
1288 | else | ||
1289 | lcpu = raw_smp_processor_id(); | ||
1290 | } else { | ||
1291 | lcpu = WORK_CPU_UNBOUND; | ||
1292 | } | ||
1293 | |||
1294 | set_work_cwq(work, get_cwq(lcpu, wq), 0); | ||
1295 | |||
1296 | timer->expires = jiffies + delay; | ||
1297 | |||
1298 | if (unlikely(cpu != WORK_CPU_UNBOUND)) | ||
1299 | add_timer_on(timer, cpu); | ||
1300 | else | ||
1301 | add_timer(timer); | ||
1302 | } | ||
1303 | |||
1264 | /** | 1304 | /** |
1265 | * queue_delayed_work_on - queue work on specific CPU after delay | 1305 | * queue_delayed_work_on - queue work on specific CPU after delay |
1266 | * @cpu: CPU number to execute work on | 1306 | * @cpu: CPU number to execute work on |
@@ -1275,7 +1315,6 @@ EXPORT_SYMBOL_GPL(delayed_work_timer_fn); | |||
1275 | bool queue_delayed_work_on(int cpu, struct workqueue_struct *wq, | 1315 | bool queue_delayed_work_on(int cpu, struct workqueue_struct *wq, |
1276 | struct delayed_work *dwork, unsigned long delay) | 1316 | struct delayed_work *dwork, unsigned long delay) |
1277 | { | 1317 | { |
1278 | struct timer_list *timer = &dwork->timer; | ||
1279 | struct work_struct *work = &dwork->work; | 1318 | struct work_struct *work = &dwork->work; |
1280 | bool ret = false; | 1319 | bool ret = false; |
1281 | unsigned long flags; | 1320 | unsigned long flags; |
@@ -1287,38 +1326,7 @@ bool queue_delayed_work_on(int cpu, struct workqueue_struct *wq, | |||
1287 | local_irq_save(flags); | 1326 | local_irq_save(flags); |
1288 | 1327 | ||
1289 | if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) { | 1328 | if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) { |
1290 | unsigned int lcpu; | 1329 | __queue_delayed_work(cpu, wq, dwork, delay); |
1291 | |||
1292 | WARN_ON_ONCE(timer->function != delayed_work_timer_fn || | ||
1293 | timer->data != (unsigned long)dwork); | ||
1294 | BUG_ON(timer_pending(timer)); | ||
1295 | BUG_ON(!list_empty(&work->entry)); | ||
1296 | |||
1297 | timer_stats_timer_set_start_info(&dwork->timer); | ||
1298 | |||
1299 | /* | ||
1300 | * This stores cwq for the moment, for the timer_fn. | ||
1301 | * Note that the work's gcwq is preserved to allow | ||
1302 | * reentrance detection for delayed works. | ||
1303 | */ | ||
1304 | if (!(wq->flags & WQ_UNBOUND)) { | ||
1305 | struct global_cwq *gcwq = get_work_gcwq(work); | ||
1306 | |||
1307 | if (gcwq && gcwq->cpu != WORK_CPU_UNBOUND) | ||
1308 | lcpu = gcwq->cpu; | ||
1309 | else | ||
1310 | lcpu = raw_smp_processor_id(); | ||
1311 | } else | ||
1312 | lcpu = WORK_CPU_UNBOUND; | ||
1313 | |||
1314 | set_work_cwq(work, get_cwq(lcpu, wq), 0); | ||
1315 | |||
1316 | timer->expires = jiffies + delay; | ||
1317 | |||
1318 | if (unlikely(cpu != WORK_CPU_UNBOUND)) | ||
1319 | add_timer_on(timer, cpu); | ||
1320 | else | ||
1321 | add_timer(timer); | ||
1322 | ret = true; | 1330 | ret = true; |
1323 | } | 1331 | } |
1324 | 1332 | ||