Lai Jiangshan
ee378aa49b
workqueue: fix possible idle worker depletion across CPU hotplug
...
To simplify both normal and CPU hotplug paths, worker management is
prevented while CPU hoplug is in progress. This is achieved by CPU
hotplug holding the same exclusion mechanism used by workers to ensure
there's only one manager per pool.
If someone else seems to be performing the manager role, workers
proceed to execute work items. CPU hotplug using the same mechanism
can lead to idle worker depletion because all workers could proceed to
execute work items while CPU hotplug is in progress and CPU hotplug
itself wouldn't actually perform the worker management duty - it
doesn't guarantee that there's an idle worker left when it releases
management.
This idle worker depletion, under extreme circumstances, can break
forward-progress guarantee and thus lead to deadlock.
This patch fixes the bug by using separate mechanisms for manager
exclusion among workers and hotplug exclusion. For manager exclusion,
POOL_MANAGING_WORKERS which was restored by the previous patch is
used. pool->manager_mutex is now only used for exclusion between the
elected manager and CPU hotplug. The elected manager won't proceed
without holding pool->manager_mutex.
This ensures that the worker which won the manager position can't skip
managing while CPU hotplug is in progress. It will block on
manager_mutex and perform management after CPU hotplug is complete.
Note that hotplug may happen while waiting for manager_mutex. A
manager isn't either on idle or busy list and thus the hoplug code
can't unbind/rebind it. Make the manager handle its own un/rebinding.
tj: Updated comment and description.
Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
2012-09-10 10:05:54 -07:00
..
debug
kdb: Switch to nolock variants of kmsg_dump functions
2012-07-21 10:34:00 -07:00
events
uprobes: __replace_page() needs munlock_vma_page()
2012-07-30 11:27:25 +02:00
gcov
irq
irqdomain changes for Linux v3.6
2012-07-31 20:44:03 -07:00
power
NMI watchdog: fix for lockup detector breakage on resume
2012-07-30 17:25:13 -07:00
sched
Merge branch 'perf-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
2012-07-31 15:34:13 -07:00
time
Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
2012-07-22 11:35:46 -07:00
trace
Staging tree patches for 3.6-rc1
2012-07-26 11:14:49 -07:00
.gitignore
acct.c
async.c
[SCSI] async: make async_synchronize_full() flush all work regardless of domain
2012-07-20 09:07:37 +01:00
audit.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
2012-08-01 10:26:23 -07:00
audit.h
audit_tree.c
VFS: Make clone_mnt()/copy_tree()/collect_mounts() return errors
2012-07-14 16:37:27 +04:00
audit_watch.c
get rid of kern_path_parent()
2012-07-14 16:35:02 +04:00
auditfilter.c
auditsc.c
seccomp: remove duplicated failure logging
2012-04-14 11:13:20 +10:00
backtracetest.c
bounds.c
capability.c
userns: Teach inode_capable to understand inodes whose uids map to other namespaces.
2012-05-15 14:59:24 -07:00
cgroup.c
Merge branch 'for-3.6' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup
2012-07-24 17:47:44 -07:00
cgroup_freezer.c
cgroup: convert all non-memcg controllers to the new cftype interface
2012-04-01 12:09:55 -07:00
compat.c
new helper: sigsuspend()
2012-05-21 23:52:30 -04:00
configs.c
cpu.c
mm/hotplug: correctly setup fallback zonelists when creating new pgdat
2012-07-31 18:42:44 -07:00
cpu_pm.c
kernel/cpu_pm.c: fix various typos
2012-05-31 17:49:27 -07:00
cpuset.c
cpusets: Remove/update outdated comments
2012-07-24 13:53:28 +02:00
crash_dump.c
cred.c
keys: kill task_struct->replacement_session_keyring
2012-05-23 22:11:41 -04:00
delayacct.c
dma.c
Remove all #inclusions of asm/system.h
2012-03-28 18:30:03 +01:00
elfcore.c
exec_domain.c
exit.c
posix_types.h: Cleanup stale __NFDBITS and related definitions
2012-07-26 13:36:43 -07:00
extable.c
extable: Skip sorting if sorted at build time.
2012-04-19 15:06:55 -07:00
fork.c
memcg: rename config variables
2012-07-31 18:42:43 -07:00
freezer.c
futex.c
futex: Mark get_robust_list as deprecated
2012-03-29 11:37:17 +02:00
futex_compat.c
futex: Mark get_robust_list as deprecated
2012-03-29 11:37:17 +02:00
groups.c
userns: Convert in_group_p and in_egroup_p to use kgid_t
2012-05-03 03:29:33 -07:00
hrtimer.c
hrtimer: Update hrtimer base offsets each hrtimer_interrupt
2012-07-11 23:34:39 +02:00
hung_task.c
hung task debugging: Inject NMI when hung and going to panic
2012-04-25 12:39:25 +02:00
irq_work.c
irq_work: fix compile failure on tile from missing include
2012-04-13 13:15:16 -04:00
itimer.c
itimer: Use printk_once instead of WARN_ONCE
2012-04-10 11:00:30 +02:00
jump_label.c
kallsyms.c
vsprintf: fix %ps on non symbols when using kallsyms
2012-05-29 16:22:32 -07:00
kcmp.c
syscalls, x86: add __NR_kcmp syscall
2012-05-31 17:49:32 -07:00
Kconfig.freezer
Kconfig.hz
Kconfig.locks
locking/kconfig: Simplify INLINE_SPIN_UNLOCK usage
2012-03-23 13:18:57 +01:00
Kconfig.preempt
locking/kconfig: Simplify INLINE_SPIN_UNLOCK usage
2012-03-23 13:18:57 +01:00
kexec.c
kdump: append newline to the last lien of vmcoreinfo note
2012-07-30 17:25:20 -07:00
kfifo.c
[media] kernel:kfifo: export __kfifo_max_r symbol
2012-04-11 18:24:37 -03:00
kmod.c
kmod: avoid deadlock from recursive kmod call
2012-07-30 17:25:20 -07:00
kprobes.c
ksysfs.c
kthread.c
kthread_worker: reimplement flush_kthread_work() to allow freeing the work item being executed
2012-07-22 10:15:28 -07:00
latencytop.c
lglock.c
brlocks/lglocks: turn into functions
2012-05-29 23:28:41 -04:00
lockdep.c
lockdep_internals.h
lockdep_proc.c
lockdep_states.h
Makefile
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
2012-06-01 10:34:35 -07:00
module.c
Guard check in module loader against integer overflow
2012-05-23 22:28:53 +09:30
mutex-debug.c
mutex-debug.h
mutex.c
mutex.h
notifier.c
nsproxy.c
padata.c
padata: Fix cpu hotplug
2012-03-29 19:52:46 +08:00
panic.c
panic: fix a possible deadlock in panic()
2012-07-30 17:25:13 -07:00
params.c
params: replace printk(KERN_<LVL>...) with pr_<lvl>(...)
2012-05-04 17:28:18 -07:00
pid.c
mm: add a low limit to alloc_large_system_hash
2012-05-24 00:28:21 -04:00
pid_namespace.c
pidns: guarantee that the pidns init will be the last pidns process reaped
2012-06-20 14:39:36 -07:00
posix-cpu-timers.c
posix-timers.c
printk.c
printk: only look for prefix levels in kernel messages
2012-07-30 17:25:14 -07:00
profile.c
ptrace.c
userns: Convert ptrace, kill, set_priority permission checks to work with kuids and kgids
2012-05-03 03:28:51 -07:00
range.c
rcu.h
rcupdate.c
rcu: Consolidate tree/tiny __rcu_read_{,un}lock() implementations
2012-07-02 12:34:23 -07:00
rcutiny.c
rcu: Fix rcu_is_cpu_idle() #ifdef in TINY_RCU
2012-07-02 12:34:25 -07:00
rcutiny_plugin.h
rcu: Fix code-style issues involving "else"
2012-07-06 06:01:48 -07:00
rcutorture.c
rcu: Fix broken strings in RCU's source code.
2012-07-06 06:01:49 -07:00
rcutree.c
rcu: Fix code-style issues involving "else"
2012-07-06 06:01:48 -07:00
rcutree.h
Merge branches 'bigrtm.2012.07.04a', 'doctorture.2012.07.02a', 'fixes.2012.07.06a' and 'fnh.2012.07.02a' into HEAD
2012-07-06 05:59:30 -07:00
rcutree_plugin.h
rcu: Fix code-style issues involving "else"
2012-07-06 06:01:48 -07:00
rcutree_trace.c
rcu: Fix broken strings in RCU's source code.
2012-07-06 06:01:49 -07:00
relay.c
splice: fix racy pipe->buffers uses
2012-06-13 21:16:42 +02:00
res_counter.c
rescounters: add res_counter_uncharge_until()
2012-05-29 16:22:27 -07:00
resource.c
resource: make sure requested range is included in the root range
2012-07-30 17:25:21 -07:00
rtmutex-debug.c
rtmutex-debug.h
rtmutex-tester.c
rtmutex.c
rtmutex.h
rtmutex_common.h
rwsem.c
Remove all #inclusions of asm/system.h
2012-03-28 18:30:03 +01:00
seccomp.c
seccomp: fix build warnings when there is no CONFIG_SECCOMP_FILTER
2012-04-18 12:24:52 +10:00
semaphore.c
semaphore: fix improper comment reference to mutex
2012-04-05 17:15:55 -07:00
signal.c
signal: make sure we don't get stopped with pending task_work
2012-07-22 23:57:54 +04:00
smp.c
smp: Remove ipi_call_lock[_irq]()/ipi_call_unlock[_irq]()
2012-06-05 17:27:14 +02:00
smpboot.c
smpboot, idle: Fix comment mismatch over idle_threads_init()
2012-05-24 22:58:08 +02:00
smpboot.h
smpboot: Remove leftover declaration
2012-06-11 15:07:52 +02:00
softirq.c
mm: allow PF_MEMALLOC from softirq context
2012-07-31 18:42:45 -07:00
spinlock.c
locking/kconfig: Simplify INLINE_SPIN_UNLOCK usage
2012-03-23 13:18:57 +01:00
srcu.c
rcu: Implement per-domain single-threaded call_srcu() state machine
2012-04-30 10:48:25 -07:00
stacktrace.c
stop_machine.c
sys.c
kernel/sys.c: avoid argv_free(NULL)
2012-07-30 17:25:13 -07:00
sys_ni.c
syscalls, x86: add __NR_kcmp syscall
2012-05-31 17:49:32 -07:00
sysctl.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
2012-08-01 10:26:23 -07:00
sysctl_binary.c
mm: prepare for removal of obsolete /proc/sys/vm/nr_pdflush_threads
2012-07-31 18:42:40 -07:00
task_work.c
deal with task_work callbacks adding more work
2012-07-22 23:57:57 +04:00
taskstats.c
taskstats: check nla_reserve() return
2012-07-30 17:25:21 -07:00
test_kprobes.c
time.c
time: Remove bogus comments
2012-03-15 18:17:55 -07:00
timeconst.pl
timer.c
timers: Improve get_next_timer_interrupt()
2012-06-06 13:49:02 +02:00
tracepoint.c
tsacct.c
uid16.c
userns: Convert setting and getting uid and gid system calls to use kuid and kgid
2012-05-03 03:28:41 -07:00
up.c
user-return-notifier.c
user.c
userns: Silence silly gcc warning.
2012-05-19 15:44:40 -06:00
user_namespace.c
userns: Store uid and gid values in struct cred with kuid_t and kgid_t types
2012-05-03 03:28:38 -07:00
utsname.c
userns: Use cred->user_ns instead of cred->user->user_ns
2012-04-07 16:55:51 -07:00
utsname_sysctl.c
wait.c
watchdog.c
NMI watchdog: fix for lockup detector breakage on resume
2012-07-30 17:25:13 -07:00
workqueue.c
workqueue: fix possible idle worker depletion across CPU hotplug
2012-09-10 10:05:54 -07:00
workqueue_sched.h