aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/workqueue.c
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2012-08-03 13:30:46 -0400
committerTejun Heo <tj@kernel.org>2012-08-03 13:30:46 -0400
commit7beb2edf44b4dea820c733046ad7666d092bb4b6 (patch)
treeef264acb53bf3e0c2349792bceb6a19806d8867c /kernel/workqueue.c
parentb5490077274482efde57a50b060b99bc839acd45 (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.c74
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}
1262EXPORT_SYMBOL_GPL(delayed_work_timer_fn); 1262EXPORT_SYMBOL_GPL(delayed_work_timer_fn);
1263 1263
1264static 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);
1275bool queue_delayed_work_on(int cpu, struct workqueue_struct *wq, 1315bool 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