Re: Question about mmap syscall and POSIX standard on mips arch

From: Al Viro
Date: Thu Oct 18 2018 - 00:32:07 EST

[mips folks Cc'd]

On Thu, Oct 18, 2018 at 11:26:02AM +0800, Hongzhi, Song wrote:
> Hi all,
> Ltp has a POSIX teatcase about mmap, 24-2.c.

[basically, MAP_FIXED mmap with addr + len > TASK_SIZE fails with
-EINVAL on mips and -ENOMEM elsewhere]

> Under POSIX standard, the expected errno should be ENOMEM
> when the specific [addr+len] exceeds the bound of memory.

The mmap() function may fail if:

The addr argument (if MAP_FIXED was specified) or off is not a multiple
of the page size as returned by sysconf(), or is considered invalid by
the implementation.

So that behaviour gets past POSIX. That part is mostly about the
things like cache aliasing constraints, etc., but it leaves enough
space to weasel out. Said that, this

MAP_FIXED was specified, and the range [addr,addr+len) exceeds that allowed
for the address space of a process; or, if MAP_FIXED was not specified and
there is insufficient room in the address space to effect the mapping.

is a lot more specific, so switching to -ENOMEM there might be a good idea,
especially since on other architectures we do get -ENOMEM in that case,