Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 316716
b: refs/heads/master
c: 6575820
h: refs/heads/master
v: v3
  • Loading branch information
Tejun Heo committed Jul 17, 2012
1 parent bcb9e0f commit bb980c6
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 4 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: 3270476a6c0ce322354df8679652f060d66526dc
refs/heads/master: 6575820221f7a4dd6eadecf7bf83cdd154335eda
5 changes: 3 additions & 2 deletions trunk/include/linux/cpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,9 @@ enum {
/* migration should happen before other stuff but after perf */
CPU_PRI_PERF = 20,
CPU_PRI_MIGRATION = 10,
/* prepare workqueues for other notifiers */
CPU_PRI_WORKQUEUE = 5,
/* bring up workqueues before normal notifiers and down after */
CPU_PRI_WORKQUEUE_UP = 5,
CPU_PRI_WORKQUEUE_DOWN = -5,
};

#define CPU_ONLINE 0x0002 /* CPU (unsigned)v is up */
Expand Down
38 changes: 37 additions & 1 deletion trunk/kernel/workqueue.c
Original file line number Diff line number Diff line change
Expand Up @@ -3644,6 +3644,41 @@ static int __devinit workqueue_cpu_callback(struct notifier_block *nfb,
return NOTIFY_BAD;
}

/*
* Workqueues should be brought up before normal priority CPU notifiers.
* This will be registered high priority CPU notifier.
*/
static int __devinit workqueue_cpu_up_callback(struct notifier_block *nfb,
unsigned long action,
void *hcpu)
{
switch (action & ~CPU_TASKS_FROZEN) {
case CPU_UP_PREPARE:
case CPU_UP_CANCELED:
case CPU_DOWN_FAILED:
case CPU_ONLINE:
return workqueue_cpu_callback(nfb, action, hcpu);
}
return NOTIFY_OK;
}

/*
* Workqueues should be brought down after normal priority CPU notifiers.
* This will be registered as low priority CPU notifier.
*/
static int __devinit workqueue_cpu_down_callback(struct notifier_block *nfb,
unsigned long action,
void *hcpu)
{
switch (action & ~CPU_TASKS_FROZEN) {
case CPU_DOWN_PREPARE:
case CPU_DYING:
case CPU_POST_DEAD:
return workqueue_cpu_callback(nfb, action, hcpu);
}
return NOTIFY_OK;
}

#ifdef CONFIG_SMP

struct work_for_cpu {
Expand Down Expand Up @@ -3839,7 +3874,8 @@ static int __init init_workqueues(void)
unsigned int cpu;
int i;

cpu_notifier(workqueue_cpu_callback, CPU_PRI_WORKQUEUE);
cpu_notifier(workqueue_cpu_up_callback, CPU_PRI_WORKQUEUE_UP);
cpu_notifier(workqueue_cpu_down_callback, CPU_PRI_WORKQUEUE_DOWN);

/* initialize gcwqs */
for_each_gcwq_cpu(cpu) {
Expand Down

0 comments on commit bb980c6

Please sign in to comment.