Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
test-MADV_DONTNEED.c
// Gist to check possible issues with MADV_DONTNEED
// For example it does not supported by qemu user
// There is a patch for this [1], but it hasn't been applied.
// [1]: https://lists.gnu.org/archive/html/qemu-devel/2018-08/msg05422.html
#include <sys/mman.h>
#include <stdio.h>
#include <stddef.h>
#include <assert.h>
#include <string.h>
int main(int argc, char **argv)
{
void *addr = mmap(NULL, 1<<16, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
if (addr == MAP_FAILED) {
perror("mmap");
return 1;
}
memset(addr, 'A', 1<<16);
if (!madvise(addr, 1<<16, MADV_DONTNEED)) {
puts("MADV_DONTNEED does not return error. Check memory.");
for (int i = 0; i < 1<<16; ++i) {
assert(((unsigned char *)addr)[i] == 0);
}
} else {
perror("madvise");
}
if (munmap(addr, 1<<16)) {
perror("munmap");
return 1;
}
return 0;
}
@azat

This comment has been minimized.

Copy link
Owner Author

@azat azat commented Oct 3, 2020

unpatched qemu

$ qemu-x86_64-static /tmp/test-MADV_DONTNEED
MADV_DONTNEED does not return error. Check memory.
test-MADV_DONTNEED: /tmp/test-MADV_DONTNEED.c:19: main: Assertion `((unsigned char *)addr)[i] == 0' failed.
qemu: uncaught target signal 6 (Aborted) - core dumped
Aborted (core dumped)
@azat

This comment has been minimized.

Copy link
Owner Author

@azat azat commented Oct 3, 2020

patched qemu (by returning ENOSYS error)

qemu-x86_64 /tmp/test-MADV_DONTNEED
madvise: Success

patch for qemu to return ENOSYS

diff --git a/linux-user/syscall.c b/linux-user/syscall.c                                                                                 
index 897d20c076..5540792e0e 100644                                                                                                      
--- a/linux-user/syscall.c                                                                                                               
+++ b/linux-user/syscall.c                                                                                                               
@@ -11775,7 +11775,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,                                               
            turns private file-backed mappings into anonymous mappings.                                                                  
            This will break MADV_DONTNEED.                                                                                               
            This is a hint, so ignoring and returning success is ok.  */                                                                 
-        return 0;                                                                                                                       
+        return ENOSYS;                                                                                                                  
 #endif                                                                                                                                  
 #ifdef TARGET_NR_fcntl64                                                                                                                
     case TARGET_NR_fcntl64:                       
@azat

This comment has been minimized.

Copy link
Owner Author

@azat azat commented Oct 3, 2020

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment