Revert "[scudo] Check if MADV_DONTNEED zeroes memory"

This reverts commit d423509b80.

We are going to use patched QEMU.
This commit is contained in:
Vitaly Buka 2021-05-28 01:53:42 -07:00
parent f59cd8a4a6
commit 4458e8c4b4
1 changed files with 1 additions and 33 deletions

View File

@ -10,7 +10,6 @@
#if SCUDO_LINUX
#include "atomic_helpers.h"
#include "common.h"
#include "linux.h"
#include "mutex.h"
@ -90,41 +89,10 @@ void setMemoryPermission(uptr Addr, uptr Size, uptr Flags,
dieOnMapUnmapError();
}
static bool madviseNotNeedFails() {
const uptr Size = getPageSizeCached();
char *P = reinterpret_cast<char *>(mmap(0, Size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));
if (!P)
dieOnMapUnmapError(errno == ENOMEM ? Size : 0);
*P = 1;
while (madvise(P, Size, MADV_DONTNEED) == -1 && errno == EAGAIN) {
}
const bool R = (*P != 0);
if (munmap(P, Size) != 0)
dieOnMapUnmapError();
return R;
}
static bool madviseNotNeedFailsCached() {
static atomic_u8 Cache;
enum State : u8 { Unknown = 0, Yes = 1, No = 2 };
State NeedsMemset = static_cast<State>(atomic_load_relaxed(&Cache));
if (NeedsMemset == Unknown) {
NeedsMemset = madviseNotNeedFails() ? Yes : No;
atomic_store_relaxed(&Cache, NeedsMemset);
}
return NeedsMemset == Yes;
}
void releasePagesToOS(uptr BaseAddress, uptr Offset, uptr Size,
UNUSED MapPlatformData *Data) {
void *Addr = reinterpret_cast<void *>(BaseAddress + Offset);
if (madviseNotNeedFailsCached()) {
// 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
memset(Addr, 0, Size);
}
while (madvise(Addr, Size, MADV_DONTNEED) == -1 && errno == EAGAIN) {
}
}