Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 17034
b: refs/heads/master
c: f756d5e
h: refs/heads/master
v: v3
  • Loading branch information
Nathan Lynch authored and Linus Torvalds committed Jan 9, 2006
1 parent 483f107 commit 3dffd9a
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 7 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 945f390f02ce44a13aefc6d9449c99f33c9286a5
refs/heads/master: f756d5e256059018d753f0ba79980ebeb87a1bc0
16 changes: 10 additions & 6 deletions trunk/kernel/workqueue.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@
#include <linux/kthread.h>

/*
* The per-CPU workqueue (if single thread, we always use cpu 0's).
* The per-CPU workqueue (if single thread, we always use the first
* possible cpu).
*
* The sequence counters are for flush_scheduled_work(). It wants to wait
* until until all currently-scheduled works are completed, but it doesn't
Expand Down Expand Up @@ -69,6 +70,8 @@ struct workqueue_struct {
static DEFINE_SPINLOCK(workqueue_lock);
static LIST_HEAD(workqueues);

static int singlethread_cpu;

/* If it's single threaded, it isn't in the list of workqueues. */
static inline int is_single_threaded(struct workqueue_struct *wq)
{
Expand Down Expand Up @@ -102,7 +105,7 @@ int fastcall queue_work(struct workqueue_struct *wq, struct work_struct *work)

if (!test_and_set_bit(0, &work->pending)) {
if (unlikely(is_single_threaded(wq)))
cpu = any_online_cpu(cpu_online_map);
cpu = singlethread_cpu;
BUG_ON(!list_empty(&work->entry));
__queue_work(per_cpu_ptr(wq->cpu_wq, cpu), work);
ret = 1;
Expand All @@ -118,7 +121,7 @@ static void delayed_work_timer_fn(unsigned long __data)
int cpu = smp_processor_id();

if (unlikely(is_single_threaded(wq)))
cpu = any_online_cpu(cpu_online_map);
cpu = singlethread_cpu;

__queue_work(per_cpu_ptr(wq->cpu_wq, cpu), work);
}
Expand Down Expand Up @@ -267,7 +270,7 @@ void fastcall flush_workqueue(struct workqueue_struct *wq)

if (is_single_threaded(wq)) {
/* Always use first cpu's area. */
flush_cpu_workqueue(per_cpu_ptr(wq->cpu_wq, any_online_cpu(cpu_online_map)));
flush_cpu_workqueue(per_cpu_ptr(wq->cpu_wq, singlethread_cpu));
} else {
int cpu;

Expand Down Expand Up @@ -325,7 +328,7 @@ struct workqueue_struct *__create_workqueue(const char *name,
lock_cpu_hotplug();
if (singlethread) {
INIT_LIST_HEAD(&wq->list);
p = create_workqueue_thread(wq, any_online_cpu(cpu_online_map));
p = create_workqueue_thread(wq, singlethread_cpu);
if (!p)
destroy = 1;
else
Expand Down Expand Up @@ -379,7 +382,7 @@ void destroy_workqueue(struct workqueue_struct *wq)
/* We don't need the distraction of CPUs appearing and vanishing. */
lock_cpu_hotplug();
if (is_single_threaded(wq))
cleanup_workqueue_thread(wq, any_online_cpu(cpu_online_map));
cleanup_workqueue_thread(wq, singlethread_cpu);
else {
for_each_online_cpu(cpu)
cleanup_workqueue_thread(wq, cpu);
Expand Down Expand Up @@ -567,6 +570,7 @@ static int __devinit workqueue_cpu_callback(struct notifier_block *nfb,

void init_workqueues(void)
{
singlethread_cpu = first_cpu(cpu_possible_map);
hotcpu_notifier(workqueue_cpu_callback, 0);
keventd_wq = create_workqueue("events");
BUG_ON(!keventd_wq);
Expand Down

0 comments on commit 3dffd9a

Please sign in to comment.