[dm-devel] more workqueue play
Christophe Saout
christophe at saout.de
Tue Feb 17 12:30:03 UTC 2004
Hi,
I think I need to be a bit nicer with the spinlock.
--- linux.orig/drivers/md/kcopyd.c 2004-02-17 15:43:10.000000000 +0100
+++ linux/drivers/md/kcopyd.c 2004-02-17 18:04:09.851419000 +0100
@@ -235,6 +235,7 @@
static void unqueue_pagewait_jobs(struct kcopyd_client *kc)
{
struct list_head *tmp, *tmp2;
+ LIST_HEAD(jobs);
unsigned int nr;
spin_lock(&kc->lock);
@@ -247,10 +248,16 @@
break;
nr -= job->nr_pages;
- list_del(&job->pagewait_list);
- queue_job(job, run_pages_job);
+ list_move_tail(&job->pagewait_list, &jobs);
}
spin_unlock(&kc->lock);
+
+ list_for_each (tmp, &jobs) {
+ struct kcopyd_job *job =
+ list_entry(tmp, struct kcopyd_job, pagewait_list);
+
+ queue_job(job, run_pages_job);
+ }
}
static void queue_pagewait_job(struct kcopyd_job *job)
@@ -258,7 +265,7 @@
struct kcopyd_client *kc = job->kc;
spin_lock(&kc->lock);
- list_add(&job->pagewait_list, &kc->pagewait_jobs);
+ list_add_tail(&job->pagewait_list, &kc->pagewait_jobs);
spin_unlock(&kc->lock);
}
More information about the dm-devel
mailing list