On Thu, Oct 12, 2017 at 09:32:17AM -0700, Linus Torvalds wrote:
On Thu, Oct 12, 2017 at 6:51 AM, Jan Kara [off-list ref] wrote:
quoted
When thinking a bit more about this I've realized one problem: Currently
user can call mmap() with MAP_SHARED type and MAP_SYNC or MAP_DIRECT flags
and he will get the new semantics (if the kernel happens to support it). I
think that is undesirable [..]
Why?
If you have a performance preference for MAP_DIRECT or something like
that, but you don't want to *enforce* it, you'd use just plain
MAP_SHARED with it.
Ie there may well be "I want this to work, possibly with downsides" issues.
So it seems to be a reasonable model, and disallowing it seems to
limit people and not really help anything.
I don't think for MAP_DIRECT it matters (and I think we shouldn't have
MAP_DIRECT to start with, see the discussions later in the thread).
But for the main use case, MAP_SYNC you really want a hard error when you
don't get it. And while we could tell people that they should only use
MAP_SYNC with MAP_SHARED_VALIDATE instead of MAP_SHARED chances that they
get it wrong are extremely high. On the other hand if you really only
want a flag to optimize calling mmap twice is very little overhead, and
a very good documentation of you intent:
addr = mmap(...., MAP_SHARED_VALIDATE | MAP_DIRECT, ...);
if (!addr && errno = EOPNOTSUPP) {
/* MAP_DIRECT didn't work, we'll just cope using blah, blah */
addr = mmap(...., MAP_SHARED, ...);
}
if (!addr)
goto handle_error;