Hi! I have a question about the part of the test: /* check some more advanced mmap() manipulations */ /* map all but last page: pages 1-3 mapped */ tmp1 = mmap(NULL, 3 * page_size, PROT_READ, MAP_SHARED, data_map_fd, 0); if (CHECK(tmp1 == MAP_FAILED, "adv_mmap1", "errno %d\n", errno)) goto cleanup; /* unmap second page: pages 1, 3 mapped */ err = munmap(tmp1 + page_size, page_size); if (CHECK(err, "adv_mmap2", "errno %d\n", errno)) { munmap(tmp1, map_sz); goto cleanup; } /* map page 2 back */ tmp2 = mmap(tmp1 + page_size, page_size, PROT_READ, MAP_SHARED | MAP_FIXED, data_map_fd, 0); if (CHECK(tmp2 == MAP_FAILED, "adv_mmap3", "errno %d\n", errno)) { munmap(tmp1, page_size); munmap(tmp1 + 2*page_size, page_size); goto cleanup; } CHECK(tmp1 + page_size != tmp2, "adv_mmap4", "tmp1: %p, tmp2: %p\n", tmp1, tmp2); /* re-map all 4 pages */ tmp2 = mmap(tmp1, 4 * page_size, PROT_READ, MAP_SHARED | MAP_FIXED, data_map_fd, 0); if (CHECK(tmp2 == MAP_FAILED, "adv_mmap5", "errno %d\n", errno)) { munmap(tmp1, 3 * page_size); /* unmap page 1 */ goto cleanup; } CHECK(tmp1 != tmp2, "adv_mmap6", "tmp1: %p, tmp2: %p\n", tmp1, tmp2); In my configuration the first mapping /* map all but last page: pages 1-3 mapped */ tmp1 = mmap(NULL, 3 * page_size, PROT_READ, MAP_SHARED, data_map_fd, 0); maps the area to the 3 pages right before the TLS page. I find it's pretty ok. But then the 4 page mapping /* re-map all 4 pages */ tmp2 = mmap(tmp1, 4 * page_size, PROT_READ, MAP_SHARED | MAP_FIXED, data_map_fd, 0); since it has MAP_FIXED flag, unmaps TLS and maps the former TLS address BPF map. Which is again exactly the behaviour of MAP_FIXED, but it breaks the test. Using MAP_FIXED_NOREPLACE fails the check: CHECK(tmp1 != tmp2, "adv_mmap6", "tmp1: %p, tmp2: %p\n", tmp1, tmp2); as expected. Should the test be modified to be a bit more relaxed? Since the kernel behaviour looks correct or I'm missing something? PS: BTW, the previous data_map mapping left unmmaped. Is it expected? -- WBR, Yauheni Kaliuta