You don't need userfaultfd for that. Just mmap the same file twice, at different addresses:
int mem_fd = memfd_create("", 0);
ftruncate(fd, 4096);
void* mem = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, mem_fd, 0);
void* alias = mmap((void*) 0x4000, 4096, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_SHARED, mem_fd, 0);
close(mem_fd);
// alias now points to the same physical memory as mem
This is commonly used to create ring buffers that wrap around transparently.