On Sat, Jun 19, 2021 at 02:20:02AM -0700, Peter Collingbourne wrote: > #include <stdio.h> > #include <stdlib.h> > #include <string.h> > #include <sys/mman.h> > #include <unistd.h> > > constexpr unsigned char pattern_byte = 0xaa; > > #define PAGE_SIZE 4096 > > _Alignas(PAGE_SIZE) static unsigned char pattern[PAGE_SIZE]; > > int main(int argc, char **argv) { > if (argc < 3) > return 1; > bool use_refpage = argc > 3; > size_t mmap_size = atoi(argv[1]); > size_t touch_size = atoi(argv[2]); > > int refpage_fd; > if (use_refpage) { > memset(pattern, pattern_byte, PAGE_SIZE); > refpage_fd = syscall(448, pattern, 0); > } > for (unsigned i = 0; i != 1000; ++i) { > char *p; > if (use_refpage) { > p = (char *)mmap(0, mmap_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, > refpage_fd, 0); > } else { > p = (char *)mmap(0, mmap_size, PROT_READ | PROT_WRITE, > MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); > memset(p, pattern_byte, mmap_size); > } > for (unsigned j = 0; j < touch_size; j += PAGE_SIZE) > p[j] = 0; > munmap(p, mmap_size); > } > } I don't like the inteface. It is tied to PAGE_SIZE and this doesn't seem to be very future looking. How would it work with THPs? Maybe we should cosider passing down a filling pattern to kernel and let kernel allocate appropriate page size on read page fault? The pattern has to be power of 2 and limited in lenght. -- Kirill A. Shutemov