linux/mm
Ken Chen ace4bd29c2 fix leaky resv_huge_pages when cpuset is in use
The internal hugetlb resv_huge_pages variable can permanently leak nonzero
value in the error path of hugetlb page fault handler when hugetlb page is
used in combination of cpuset.  The leaked count can permanently trap N
number of hugetlb pages in unusable "reserved" state.

Steps to reproduce the bug:

  (1) create two cpuset, user1 and user2
  (2) reserve 50 htlb pages in cpuset user1
  (3) attempt to shmget/shmat 50 htlb page inside cpuset user2
  (4) kernel oom the user process in step 3
  (5) ipcrm the shm segment

At this point resv_huge_pages will have a count of 49, even though
there are no active hugetlbfs file nor hugetlb shared memory segment
in the system.  The leak is permanent and there is no recovery method
other than system reboot. The leaked count will hold up all future use
of that many htlb pages in all cpusets.

The culprit is that the error path of alloc_huge_page() did not
properly undo the change it made to resv_huge_page, causing
inconsistent state.

Signed-off-by: Ken Chen <kenchen@google.com>
Cc: David Gibson <david@gibson.dropbear.id.au>
Cc: Adam Litke <agl@us.ibm.com>
Cc: Martin Bligh <mbligh@google.com>
Acked-by: David Gibson <dwg@au1.ibm.com>
Cc: <stable@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2007-05-09 12:30:48 -07:00
..
allocpercpu.c
backing-dev.c
bootmem.c
bounce.c
fadvise.c
filemap.c Remove do_sync_file_range() 2007-05-08 11:15:04 -07:00
filemap.h
filemap_xip.c
fremap.c
highmem.c
hugetlb.c fix leaky resv_huge_pages when cpuset is in use 2007-05-09 12:30:48 -07:00
internal.h Make page->private usable in compound pages 2007-05-07 12:12:53 -07:00
Kconfig Quicklists for page table pages 2007-05-07 12:12:54 -07:00
madvise.c mm: madvise avoid exclusive mmap_sem 2007-05-07 12:12:54 -07:00
Makefile Quicklists for page table pages 2007-05-07 12:12:54 -07:00
memory.c Add unitialized_var() macro for suppressing gcc warnings 2007-05-07 12:12:52 -07:00
memory_hotplug.c
mempolicy.c
mempool.c
migrate.c
mincore.c
mlock.c
mmap.c Remove unused variable in get_unmapped_area 2007-05-08 11:35:28 -07:00
mmzone.c
mprotect.c
mremap.c
msync.c
nommu.c move die notifier handling to common code 2007-05-08 11:15:04 -07:00
oom_kill.c oom: fix constraint deadlock 2007-05-07 12:12:55 -07:00
page-writeback.c Factor outstanding I/O error handling 2007-05-08 11:14:57 -07:00
page_alloc.c Add white list into modpost.c for memory hotplug code and ia64's machvec section 2007-05-08 11:14:57 -07:00
page_io.c
pdflush.c
prio_tree.c
quicklist.c Quicklists for page table pages 2007-05-07 12:12:54 -07:00
readahead.c readahead: code cleanup 2007-05-07 12:12:52 -07:00
rmap.c fbdev: mm: Deferred IO support 2007-05-08 11:15:26 -07:00
shmem.c slab allocators: Remove SLAB_DEBUG_INITIAL flag 2007-05-07 12:12:57 -07:00
shmem_acl.c
slab.c krealloc: fix kerneldoc comments 2007-05-09 12:30:46 -07:00
slob.c slob: fix page order calculation on not 4KB page 2007-05-07 12:12:57 -07:00
slub.c krealloc: fix kerneldoc comments 2007-05-09 12:30:46 -07:00
sparse.c Add white list into modpost.c for memory hotplug code and ia64's machvec section 2007-05-08 11:14:57 -07:00
swap.c Make page->private usable in compound pages 2007-05-07 12:12:53 -07:00
swap_state.c
swapfile.c mm: make read_cache_page synchronous 2007-05-07 12:12:51 -07:00
thrash.c
tiny-shmem.c
truncate.c
util.c
vmalloc.c move die notifier handling to common code 2007-05-08 11:15:04 -07:00
vmscan.c Factor outstanding I/O error handling 2007-05-08 11:14:57 -07:00
vmstat.c