Skip to contentSkip to conversation

New: sparc64 mmap() returns EINVAL for non-MAP_FIXED hint within VA_EXCLUDE_START...END

Bug 221820 Andrew Morton 1 participant 1 message Aug 1 1 message not in the archive Memory management

lore
Share & tools
lore

Andrew Morton

author maintainer
#1 lore raw
In reply to a message not in the archive

(switched to email. Please respond via emailed reply-to-all, not via the bugzilla web interface).

Quoted 39 lines · On Sat, 01 Aug 2026 09:41:47 +0000 [email protected] wrote:

https://bugzilla.kernel.org/show_bug.cgi?id=221820

Bug ID: 221820
Summary: sparc64 mmap() returns EINVAL for non-MAP_FIXED hint
within VA_EXCLUDE_START...END
Product: Memory Management
Version: 2.5
Hardware: Sparc64
OS: Linux
Status: NEW
Severity: normal
Priority: P3
Component: Other
Assignee: [email protected]
Reporter: [email protected]
Regression: No

Repro:

    alexrp@niagara:~$ uname -a
    Linux niagara 7.1.3.1-sparc64-smp #1 SMP Debian 7.1.3-1+sunvdc (2026-07-12)
sparc64 GNU/Linux
    alexrp@niagara:~$ cat bug.c
    #include <errno.h>
    #include <stdio.h>
    #include <string.h>
    #include <sys/mman.h>
    #include <unistd.h>
    int main() {
        long pgsz = sysconf(_SC_PAGE_SIZE);
        void *addr = mmap((void *)0xfff80000fffc6000, pgsz, PROT_READ |
PROT_WRITE, \
          MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
        printf("%p (%s)\n", addr, strerror(errno));
    }
    alexrp@niagara:~$ cc bug.c
    alexrp@niagara:~$ ./a.out
    0xffffffffffffffff (Invalid argument)
Quoted 5 lines

I find this fairly surprising. I could understand if I had specified MAP_FIXED because in that case the kernel is unable to satisfy the requirements I've specified. But without MAP_FIXED, 0xfff80000fffc6000 is merely a hint and should be ignored if it falls within a VA range that the kernel considers off-limits.

Thanks.

That does seem wrong. It works for me on x86_64 so yes, it does appear to be a sparc thing.

The test code does have a few glitches which I don't think matter here, but below is chatgpt's fixed-up version. Could someone in sparcland please take a quick look?

#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
#include <unistd.h>

int main(void)

{
    long pgsz = sysconf(_SC_PAGE_SIZE);

    void *addr = mmap((void *)0xfff80000fffc6000,
                      pgsz,
                      PROT_READ | PROT_WRITE,
                      MAP_PRIVATE | MAP_ANONYMOUS,
                      -1,
                      0);

    if (addr == MAP_FAILED) {
        fprintf(stderr, "mmap failed: %s\n", strerror(errno));
        return 1;
    }

    printf("mapped at %p\n", addr);

    munmap(addr, pgsz);
    return 0;
}