id = 1687 title = "Memory leak for x86 guest on macOS ARM host" state = "opened" created_at = "2023-06-05T19:27:51.499Z" closed_at = "n/a" labels = [] url = "https://gitlab.com/qemu-project/qemu/-/issues/1687" host-os = "macOS Darwin" host-arch = "ARM" qemu-version = "n/a" guest-os = "Ubuntu 22.04" guest-arch = "x86" description = """QEMU is used by docker to run `x86` binaries on Apple silicon. Then using `mmap` followed by `munmap` results in a memory leak manifested by continuously growing RSS memory usage when running `mmap` and `munmap` in a loop, e.g., when running the following binary: ``` #include #include #include const int page = 4096; int work(int N) { int *ptr = mmap(NULL, N * sizeof(int), PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); if (ptr == MAP_FAILED) { printf("Mapping Failed\\n"); return 1; } for(int i = 0; i < N; i++) { ptr[i] = i * 10; } int err = munmap(ptr, N * sizeof(int)); if (err != 0) { printf("UnMapping Failed\\n"); return 1; } return 0; } int main() { int N = page * 1024; while (1) { int res = work(N); if (res) { return res; } printf(".\\n"); } return 0; } ```""" reproduce = """``` $ LEAK=$(docker run --platform linux/amd64 -d -it martin2718/mmap-leak ./a.out) $ docker exec -it $LEAK top # you should observe that RES for a.out keeps growing $ docker exec -it $LEAK pmap -x 1 # you should see a single memory mapping whose RSS memory usage keeps growing $ docker kill $LEAK # abort the experiment ```""" additional = "n/a"