Tejun Heo
ccea34b5d0
percpu: finer grained locking to break deadlock and allow atomic free
...
Impact: fix deadlock and allow atomic free
Percpu allocation always uses GFP_KERNEL and whole alloc/free paths
were protected by single mutex. All percpu allocations have been from
GFP_KERNEL-safe context and the original allocator had this assumption
too. However, by protecting both alloc and free paths with the same
mutex, the new allocator creates free -> alloc -> GFP_KERNEL
dependency which the original allocator didn't have. This can lead to
deadlock if free is called from FS or IO paths. Also, in general,
allocators are expected to allow free to be called from atomic
context.
This patch implements finer grained locking to break the deadlock and
allow atomic free. For details, please read the "Synchronization
rules" comment.
While at it, also add CONTEXT: to function comments to describe which
context they expect to be called from and what they do to it.
This problem was reported by Thomas Gleixner and Peter Zijlstra.
http://thread.gmane.org/gmane.linux.kernel/802384
Signed-off-by: Tejun Heo <tj@kernel.org>
Reported-by: Thomas Gleixner <tglx@linutronix.de>
Reported-by: Peter Zijlstra <peterz@infradead.org>
2009-03-07 14:46:35 +09:00
..
allocpercpu.c
percpu: kill percpu_alloc() and friends
2009-02-20 16:29:08 +09:00
backing-dev.c
Merge branch 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
2009-01-06 17:10:04 -08:00
bootmem.c
bootmem, x86: further fixes for arch-specific bootmem wrapping
2009-03-01 16:06:56 +09:00
bounce.c
bounce: don't rely on a zeroed bio_vec list
2008-12-29 08:29:52 +01:00
dmapool.c
dmapool: enable debugging for CONFIG_SLUB_DEBUG_ON too
2008-04-28 08:58:20 -07:00
fadvise.c
[CVE-2009-0029] System call wrapper special cases
2009-01-14 14:15:18 +01:00
failslab.c
SLUB: failslab support
2008-12-29 11:27:46 +02:00
filemap.c
x86, mm: dont use non-temporal stores in pagecache accesses
2009-03-02 11:06:49 +01:00
filemap_xip.c
x86, mm: dont use non-temporal stores in pagecache accesses
2009-03-02 11:06:49 +01:00
fremap.c
Do not account for the address space used by hugetlbfs using VM_ACCOUNT
2009-02-10 10:48:42 -08:00
highmem.c
x86, pat: avoid highmem cache attribute aliasing
2008-08-15 17:22:57 +02:00
hugetlb.c
Do not account for hugetlbfs quota at mmap() time if mapping [SHM|MAP]_NORESERVE
2009-02-11 12:38:09 -08:00
internal.h
mm: make get_user_pages() interruptible
2009-01-06 15:59:08 -08:00
Kconfig
Remove obsolete CONFIG_RESOURCES_64BIT
2009-01-06 15:59:14 -08:00
maccess.c
kgdb: fix optional arch functions and probe_kernel_*
2008-04-17 20:05:39 +02:00
madvise.c
[CVE-2009-0029] System call wrappers part 14
2009-01-14 14:15:24 +01:00
Makefile
percpu: implement new dynamic percpu allocator
2009-02-20 16:29:08 +09:00
memcontrol.c
memcg: NULL pointer dereference at rmdir on some NUMA systems
2009-01-29 18:04:44 -08:00
memory.c
do_wp_page: fix regression with execute in place
2009-02-05 12:56:48 -08:00
memory_hotplug.c
mm: remove GFP_HIGHUSER_PAGECACHE
2009-01-06 15:59:01 -08:00
mempolicy.c
[CVE-2009-0029] System call wrappers part 28
2009-01-14 14:15:30 +01:00
mempool.c
spelling fixes: mm/
2007-10-20 01:27:18 +02:00
migrate.c
migration: migrate_vmas should check "vma"
2009-02-11 14:25:34 -08:00
mincore.c
[CVE-2009-0029] System call wrappers part 14
2009-01-14 14:15:24 +01:00
mlock.c
Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
2009-02-17 14:27:39 -08:00
mm_init.c
mm: mminit_loglevel cannot be __meminitdata anymore
2008-08-20 15:40:30 -07:00
mmap.c
mm: rearrange exit_mmap() to unlock before arch_exit_mmap
2009-02-11 14:25:37 -08:00
mmu_notifier.c
mmu-notifiers: core
2008-07-28 16:30:21 -07:00
mmzone.c
mm: mark the correct zone as full when scanning zonelists
2008-09-13 14:41:52 -07:00
mprotect.c
Do not account for the address space used by hugetlbfs using VM_ACCOUNT
2009-02-10 10:48:42 -08:00
mremap.c
[CVE-2009-0029] System call wrappers part 13
2009-01-14 14:15:23 +01:00
msync.c
[CVE-2009-0029] System call wrappers part 13
2009-01-14 14:15:23 +01:00
nommu.c
uclinux: add process name to allocation error message
2009-01-27 16:42:03 +10:00
oom_kill.c
memcg: avoid deadlock caused by race between oom and cpuset_attach
2009-01-08 08:31:09 -08:00
page-writeback.c
mm: task dirty accounting fix
2009-02-18 15:37:54 -08:00
page_alloc.c
mm: fix memmap init for handling memory hole
2009-02-18 15:37:55 -08:00
page_cgroup.c
memcg: use __GFP_NOWARN in page cgroup allocation
2009-02-11 14:25:35 -08:00
page_io.c
block: fix bad definition of BIO_RW_SYNC
2009-02-18 10:32:00 +01:00
page_isolation.c
memory hotplug: fix page_zone() calculation in test_pages_isolated()
2008-11-06 15:41:19 -08:00
pagewalk.c
pagemap: pass mm into pagewalkers
2008-06-12 18:05:41 -07:00
pdflush.c
cpumask: convert mm/
2009-01-01 10:12:29 +10:30
percpu.c
percpu: finer grained locking to break deadlock and allow atomic free
2009-03-07 14:46:35 +09:00
prio_tree.c
spelling fixes: mm/
2007-10-20 01:27:18 +02:00
quicklist.c
mm: size of quicklists shouldn't be proportional to the number of CPUs
2008-09-02 19:21:38 -07:00
readahead.c
vmscan: split LRU lists into anon & file sets
2008-10-20 08:50:25 -07:00
rmap.c
mm: fix mlocked page counter mismatch
2009-02-11 14:25:35 -08:00
shmem.c
shmem: fix shared anonymous accounting
2009-02-25 12:21:42 -08:00
shmem_acl.c
[PATCH] sanitize ->permission() prototype
2008-07-26 20:53:14 -04:00
slab.c
mm: Export symbol ksize()
2009-02-12 17:50:46 +02:00
slob.c
mm: Export symbol ksize()
2009-02-12 17:50:46 +02:00
slub.c
mm: Export symbol ksize()
2009-02-12 17:50:46 +02:00
sparse-vmemmap.c
vmemmap: warn about page_structs with remote distance
2008-11-06 15:41:19 -08:00
sparse.c
meminit section warnings
2008-11-30 10:03:35 -08:00
swap.c
memcg: add zone_reclaim_stat
2009-01-08 08:31:08 -08:00
swap_state.c
memcg: mem+swap controller core
2009-01-08 08:31:05 -08:00
swapfile.c
PM/hibernate: fix "swap breaks after hibernation failures"
2009-02-21 14:17:17 -08:00
thrash.c
truncate.c
mmap: handle mlocked pages during map, remap, unmap
2008-10-20 08:52:31 -07:00
util.c
slab: introduce kzfree()
2009-02-20 17:57:48 -08:00
vmalloc.c
Merge branch 'x86/core' into core/percpu
2009-03-04 02:29:19 +01:00
vmscan.c
swsusp: clean up shrink_all_zones()
2009-02-21 14:17:17 -08:00
vmstat.c
cpumask: convert mm/
2009-01-01 10:12:29 +10:30