linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Avi Kivity <avi@scylladb.com>
To: linux-mm <linux-mm@kvack.org>
Subject: Possible regression with file madvise(MADV_COLLAPSE)
Date: Wed, 09 Oct 2024 18:54:06 +0300	[thread overview]
Message-ID: <8ac28fb858a2394cc72c3dc5924f1fd031fc6fe0.camel@scylladb.com> (raw)

On Linux 6.10.10 with CONFIG_READ_ONLY_THP_FOR_FS=y,
madvise(MADV_COLLAPSE) on  program text fails with EINVAL.

To reproduce, compile the reproducer with

clang -g -o text-hugepage  text-hugepage.c \
	-fuse-ld=lld \
	-Wl,-zcommon-page-size=2097152 -Wl,-zmax-page-size=2097152 \
        -Wl,-z,separate-loadable-segments

and run:

$ strace -e trace=madvise ./text-hugepage
madvise(0x400000, 2097152, MADV_HUGEPAGE) = 0
madvise(0x400000, 2097152, MADV_POPULATE_READ) = 0
madvise(0x400000, 2097152, MADV_COLLAPSE) = -1 EINVAL (Invalid
argument)

(the funky linker options are needed to make sure the .text vma spans a
hugepage).


I say "possible regression" since I haven't tried it with an older
kernel, but I believe it worked at some point or other seeing that
others managed to get it to work.

==== text-hugepage.c ====
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>

#include <sys/mman.h>

static
void
try_remap_text_segment() {
    FILE *fp = fopen("/proc/self/maps", "r");
    if (!fp) {
        return;
    }
    char *buf = NULL;
    size_t n;
    while (getline(&buf, &n, fp) >= 0) {
        char *lstart = buf;
        char *lmid = strchr(lstart, '-');
        if (!lmid) {
            continue;
        }
        *lmid++ = '\0';
        char *lend = strchr(lmid, ' ');
        if (!lend) {
            continue;
        }
        *lend = '\0';
        
        size_t start = strtoul(lstart, NULL, 16);
        size_t end = strtoul(lmid, NULL, 16);
        uintptr_t some_text_addr = (uintptr_t)&try_remap_text_segment;
        if (some_text_addr >= start && some_text_addr < end) {
            end &= ~(uintptr_t)0x1fffff;
            madvise((void*)start, end - start, MADV_HUGEPAGE);
            madvise((void*)start, end - start, MADV_POPULATE_READ);
            madvise((void*)start, end - start, MADV_COLLAPSE);
            break;
        }
    }
    free(buf);
    fclose(fp);
}

void
huge_function() {
    // Make sure .text is has a huge page full of stuff
    asm volatile (".fill 4000000, 1, 0x90");
}

int
main() {
    try_remap_text_segment();
}
==== end text-hugepage.c ====


             reply	other threads:[~2024-10-09 15:54 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-09 15:54 Avi Kivity [this message]
2024-10-11  6:32 ` Gavin Shan
2024-10-11 22:29 ` Yang Shi
2024-10-12 15:38   ` Avi Kivity
2024-10-12 20:05     ` Yang Shi
2024-10-12 20:24       ` Avi Kivity
2024-10-12 23:50         ` Yang Shi
2024-10-13 11:04           ` Avi Kivity
2024-10-13 13:25             ` Avi Kivity
2024-10-14 22:06               ` Yang Shi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=8ac28fb858a2394cc72c3dc5924f1fd031fc6fe0.camel@scylladb.com \
    --to=avi@scylladb.com \
    --cc=linux-mm@kvack.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox