mm: account for MAP_SHARED mappings using VM_MAYSHARE and not VM_SHARED in hugetlbfs
authorMel Gorman <>
Thu, 28 May 2009 21:34:40 +0000 (14:34 -0700)
committerLinus Torvalds <>
Fri, 29 May 2009 15:40:03 +0000 (08:40 -0700)

hugetlbfs reserves huge pages but does not fault them at mmap() time to
ensure that future faults succeed.  The reservation behaviour differs
depending on whether the mapping was mapped MAP_SHARED or MAP_PRIVATE.
For MAP_SHARED mappings, hugepages are reserved when mmap() is first
called and are tracked based on information associated with the inode.
Other processes mapping MAP_SHARED use the same reservation.  MAP_PRIVATE
track the reservations based on the VMA created as part of the mmap()
operation.  Each process mapping MAP_PRIVATE must make its own

hugetlbfs currently checks if a VMA is MAP_SHARED with the VM_SHARED flag
and not VM_MAYSHARE.  For file-backed mappings, such as hugetlbfs,
VM_SHARED is set only if the mapping is MAP_SHARED and the file was opened
read-write.  If a shared memory mapping was mapped shared-read-write for
populating of data and mapped shared-read-only by other processes, then
hugetlbfs would account for the mapping as if it was MAP_PRIVATE.  This
causes processes to fail to map the file MAP_SHARED even though it should
succeed as the reservation is there.

This patch alters mm/hugetlb.c and replaces VM_SHARED with VM_MAYSHARE
when the intent of the code was to check whether the VMA was mapped

Signed-off-by: Mel Gorman <>
Cc: Hugh Dickins <>
Cc: Ingo Molnar <>
Cc: <>
Cc: Lee Schermerhorn <>
Cc: KOSAKI Motohiro <>
Cc: <>
Cc: Eric B Munson <>
Cc: Adam Litke <>
Cc: Andy Whitcroft <>
Signed-off-by: Andrew Morton <>
Signed-off-by: Linus Torvalds <>

No differences found