Skip to content

Commit

Permalink
masm: Don't crash on failed MADV_DONTNEED on Linux
Browse files Browse the repository at this point in the history
The application could call mlockall(MCL_CURRENT|MCL_FUTURE) to lock all
its memory for performance reasons, causing the madvise call to fail.
There's no need to crash. Instead, manually zero-out the memory when
decommitting.

Fixes: QTBUG-120450
Pick-to: 5.15 6.2 6.5 6.6 6.7
Change-Id: I6f1a8968853cc5e61561371bd2a435a686eaf0e4
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
  • Loading branch information
napaalm committed Jan 30, 2024
1 parent 5d79b20 commit 524d260
Showing 1 changed file with 5 additions and 6 deletions.
11 changes: 5 additions & 6 deletions src/3rdparty/masm/wtf/OSAllocatorPosix.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -114,10 +114,7 @@ void* OSAllocator::reserveUncommitted(size_t bytes, Usage usage, bool writable,
if (result == MAP_FAILED)
CRASH();

while (madvise(result, bytes, MADV_DONTNEED)) {
if (errno != EAGAIN)
CRASH();
}
while (madvise(result, bytes, MADV_DONTNEED) == -1 && errno == EAGAIN) { }

if (fd != -1)
close(fd);
Expand Down Expand Up @@ -250,8 +247,10 @@ void OSAllocator::decommit(void* address, size_t bytes)
mmap(address, bytes, PROT_NONE, MAP_FIXED | MAP_LAZY | MAP_PRIVATE | MAP_ANON, -1, 0);
#elif OS(LINUX)
while (madvise(address, bytes, MADV_DONTNEED)) {
if (errno != EAGAIN)
CRASH();
if (errno != EAGAIN) {
memset(address, 0, bytes); // We rely on madvise to zero-out the memory
break;
}
}
if (mprotect(address, bytes, PROT_NONE))
CRASH();
Expand Down

0 comments on commit 524d260

Please sign in to comment.