diff --git a/compiler-rt/lib/scudo/standalone/linux.cpp b/compiler-rt/lib/scudo/standalone/linux.cpp --- a/compiler-rt/lib/scudo/standalone/linux.cpp +++ b/compiler-rt/lib/scudo/standalone/linux.cpp @@ -93,53 +93,19 @@ dieOnMapUnmapError(); } -static bool madviseNeedsMemset() { - uptr Size = getPageSizeCached(); - char *P = (char *)mmap(0, Size, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - if (!P) - dieOnMapUnmapError(errno == ENOMEM); - *P = 1; - while (madvise(P, Size, MADV_DONTNEED) == -1 && errno == EAGAIN) { - } - bool R = (*P != 0); - if (munmap(P, Size) != 0) - dieOnMapUnmapError(); - return R; -} - -static bool madviseNeedsMemsetCached() { - static atomic_u8 Cache; - enum State : u8 { Unknown = 0, Yes = 1, No = 2 }; - State NeedsMemset = static_cast(atomic_load_relaxed(&Cache)); - if (NeedsMemset == Unknown) { - NeedsMemset = madviseNeedsMemset() ? Yes : No; - atomic_store_relaxed(&Cache, NeedsMemset); - } - return NeedsMemset == Yes; -} - void releasePagesToOS(uptr BaseAddress, uptr Offset, uptr Size, uptr Flags, UNUSED MapPlatformData *Data) { void *Addr = reinterpret_cast(BaseAddress + Offset); - if (madviseNeedsMemsetCached()) { - // Workaround for QEMU-user ignoring MADV_DONTNEED. - // https://github.com/qemu/qemu/blob/b1cffefa1b163bce9aebc3416f562c1d3886eeaa/linux-user/syscall.c#L11941 - // https://bugs.launchpad.net/qemu/+bug/1926521 - int Prot = (Flags & MAP_NOACCESS) ? PROT_NONE : (PROT_READ | PROT_WRITE); + int Prot = (Flags & MAP_NOACCESS) ? PROT_NONE : (PROT_READ | PROT_WRITE); #if defined(__aarch64__) - if (Flags & MAP_MEMTAG) - Prot |= PROT_MTE; + if (Flags & MAP_MEMTAG) + Prot |= PROT_MTE; #endif - void *P = - mmap(Addr, Size, Prot, - MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0); - if (P != Addr) - dieOnMapUnmapError(); - return; - } - while (madvise(Addr, Size, MADV_DONTNEED) == -1 && errno == EAGAIN) { - } + void *P = + mmap(Addr, Size, Prot, + MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0); + if (P != Addr) + dieOnMapUnmapError(); } // Calling getenv should be fine (c)(tm) at any time.