vserver 1.9.5.x5
[linux-2.6.git] / kernel / workqueue.c
index 987fbc2..5301935 100644 (file)
@@ -8,7 +8,7 @@
  *
  * Derived from the taskqueue/keventd code by:
  *
- *   David Woodhouse <dwmw2@redhat.com>
+ *   David Woodhouse <dwmw2@infradead.org>
  *   Andrew Morton <andrewm@uow.edu.au>
  *   Kai Petzke <wpp@marie.physik.tu-berlin.de>
  *   Theodore Ts'o <tytso@mit.edu>
@@ -64,7 +64,7 @@ struct workqueue_struct {
 
 /* All the per-cpu workqueues on the system, for hotplug cpu to add/remove
    threads to each one as cpus come/go. */
-static spinlock_t workqueue_lock = SPIN_LOCK_UNLOCKED;
+static DEFINE_SPINLOCK(workqueue_lock);
 static LIST_HEAD(workqueues);
 
 /* If it's single threaded, it isn't in the list of workqueues. */
@@ -188,7 +188,7 @@ static int worker_thread(void *__cwq)
 
        current->flags |= PF_NOFREEZE;
 
-       set_user_nice(current, -10);
+       set_user_nice(current, -5);
 
        /* Block and flush all signals */
        sigfillset(&blocked);
@@ -398,6 +398,26 @@ int fastcall schedule_delayed_work(struct work_struct *work, unsigned long delay
        return queue_delayed_work(keventd_wq, work, delay);
 }
 
+int schedule_delayed_work_on(int cpu,
+                       struct work_struct *work, unsigned long delay)
+{
+       int ret = 0;
+       struct timer_list *timer = &work->timer;
+
+       if (!test_and_set_bit(0, &work->pending)) {
+               BUG_ON(timer_pending(timer));
+               BUG_ON(!list_empty(&work->entry));
+               /* This stores keventd_wq for the moment, for the timer_fn */
+               work->wq_data = keventd_wq;
+               timer->expires = jiffies + delay;
+               timer->data = (unsigned long)work;
+               timer->function = delayed_work_timer_fn;
+               add_timer_on(timer, cpu);
+               ret = 1;
+       }
+       return ret;
+}
+
 void flush_scheduled_work(void)
 {
        flush_workqueue(keventd_wq);
@@ -465,8 +485,10 @@ static int __devinit workqueue_cpu_callback(struct notifier_block *nfb,
 
        case CPU_ONLINE:
                /* Kick off worker threads. */
-               list_for_each_entry(wq, &workqueues, list)
+               list_for_each_entry(wq, &workqueues, list) {
+                       kthread_bind(wq->cpu_wq[hotcpu].thread, hotcpu);
                        wake_up_process(wq->cpu_wq[hotcpu].thread);
+               }
                break;
 
        case CPU_UP_CANCELED:
@@ -505,5 +527,5 @@ EXPORT_SYMBOL_GPL(destroy_workqueue);
 
 EXPORT_SYMBOL(schedule_work);
 EXPORT_SYMBOL(schedule_delayed_work);
+EXPORT_SYMBOL(schedule_delayed_work_on);
 EXPORT_SYMBOL(flush_scheduled_work);
-