Re: [PATCH 1/2] mmap.2: clarify MAP_LOCKED semantic

From
Eric B Munson <hidden>
Date
2015-05-13 14:48:32
Also in
linux-mm, lkml
Reply to
Eric B Munson, 2015-05-13
On Wed, 13 May 2015, Eric B Munson wrote:
On Wed, 13 May 2015, Michal Hocko wrote:
quoted
From: Michal Hocko <redacted>

MAP_LOCKED had a subtly different semantic from mmap(2)+mlock(2) since
it has been introduced.
mlock(2) fails if the memory range cannot get populated to guarantee
that no future major faults will happen on the range. mmap(MAP_LOCKED) on
the other hand silently succeeds even if the range was populated only
partially.

Fixing this subtle difference in the kernel is rather awkward because
the memory population happens after mm locks have been dropped and so
the cleanup before returning failure (munlock) could operate on something
else than the originally mapped area.

E.g. speculative userspace page fault handler catching SEGV and doing
mmap(fault_addr, MAP_FIXED|MAP_LOCKED) might discard portion of a racing
mmap and lead to lost data. Although it is not clear whether such a
usage would be valid, mmap page doesn't explicitly describe requirements
for threaded applications so we cannot exclude this possibility.

This patch makes the semantic of MAP_LOCKED explicit and suggest using
mmap + mlock as the only way to guarantee no later major page faults.

Signed-off-by: Michal Hocko <redacted>
Does the problem still happend when MAP_POPULATE | MAP_LOCKED is used
(AFAICT MAP_POPULATE will cause the mmap to fail if all the pages cannot
be made present).

Either way this is a good catch.

Acked-by: Eric B Munson <redacted>
Sorry for the noise, this should have been a

Reviewed-by: Eric B Munson <redacted>

Attachments

Thread (14 messages) 14 messages, 7 authors, last reply 2016-05-11
Keyboard shortcuts
hback out one level
jnext message in thread / next series-diff position
kprevious message in thread / previous series-diff position
ldrill in
Escclose help / fold thread tree
?toggle this help