Skip to content
  • Andy Whitcroft's avatar
    mm: record MAP_NORESERVE status on vmas and fix small page mprotect reservations · cdfd4325
    Andy Whitcroft authored
    
    
    With Mel's hugetlb private reservation support patches applied, strict
    overcommit semantics are applied to both shared and private huge page
    mappings.  This can be a problem if an application relied on unlimited
    overcommit semantics for private mappings.  An example of this would be an
    application which maps a huge area with the intention of using it very
    sparsely.  These application would benefit from being able to opt-out of
    the strict overcommit.  It should be noted that prior to hugetlb
    supporting demand faulting all mappings were fully populated and so
    applications of this type should be rare.
    
    This patch stack implements the MAP_NORESERVE mmap() flag for huge page
    mappings.  This flag has the same meaning as for small page mappings,
    suppressing reservations for that mapping.
    
    Thanks to Mel Gorman for reviewing a number of early versions of these
    patches.
    
    This patch:
    
    When a small page mapping is created with mmap() reservations are created
    by default for any memory pages required.  When the region is read/write
    the reservation is increased for every page, no reservation is needed for
    read-only regions (as they implicitly share the zero page).  Reservations
    are tracked via the VM_ACCOUNT vma flag which is present when the region
    has reservation backing it.  When we convert a region from read-only to
    read-write new reservations are aquired and VM_ACCOUNT is set.  However,
    when a read-only map is created with MAP_NORESERVE it is indistinguishable
    from a normal mapping.  When we then convert that to read/write we are
    forced to incorrectly create reservations for it as we have no record of
    the original MAP_NORESERVE.
    
    This patch introduces a new vma flag VM_NORESERVE which records the
    presence of the original MAP_NORESERVE flag.  This allows us to
    distinguish these two circumstances and correctly account the reserve.
    
    As well as fixing this FIXME in the code, this makes it much easier to
    introduce MAP_NORESERVE support for huge pages as this flag is available
    consistantly for the life of the mapping.  VM_ACCOUNT on the other hand is
    heavily used at the generic level in association with small pages.
    
    Signed-off-by: default avatarAndy Whitcroft <apw@shadowen.org>
    Cc: Mel Gorman <mel@csn.ul.ie>
    Cc: Adam Litke <agl@us.ibm.com>
    Cc: Johannes Weiner <hannes@saeurebad.de>
    Cc: Andy Whitcroft <apw@shadowen.org>
    Cc: William Lee Irwin III <wli@holomorphy.com>
    Cc: Hugh Dickins <hugh@veritas.com>
    Cc: Michael Kerrisk <mtk.manpages@googlemail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    cdfd4325