static u32 opt_xdp_bind_flags = XDP_USE_NEED_WAKEUP;
 static u32 opt_umem_flags;
 static int opt_unaligned_chunks;
+static int opt_mmap_flags;
 static u32 opt_xdp_bind_flags;
 static int opt_xsk_frame_size = XSK_UMEM__DEFAULT_FRAME_SIZE;
 static int opt_timeout = 1000;
                case 'u':
                        opt_umem_flags |= XDP_UMEM_UNALIGNED_CHUNK_FLAG;
                        opt_unaligned_chunks = 1;
+                       opt_mmap_flags = MAP_HUGETLB;
                        break;
                case 'F':
                        opt_xdp_flags &= ~XDP_FLAGS_UPDATE_IF_NOEXIST;
                exit(EXIT_FAILURE);
        }
 
-       ret = posix_memalign(&bufs, getpagesize(), /* PAGE_SIZE aligned */
-                            NUM_FRAMES * opt_xsk_frame_size);
-       if (ret)
-               exit_with_error(ret);
-
+       /* Reserve memory for the umem. Use hugepages if unaligned chunk mode */
+       bufs = mmap(NULL, NUM_FRAMES * opt_xsk_frame_size,
+                   PROT_READ | PROT_WRITE,
+                   MAP_PRIVATE | MAP_ANONYMOUS | opt_mmap_flags, -1, 0);
+       if (bufs == MAP_FAILED) {
+               printf("ERROR: mmap failed\n");
+               exit(EXIT_FAILURE);
+       }
        /* Create sockets... */
        umem = xsk_configure_umem(bufs, NUM_FRAMES * opt_xsk_frame_size);
        xsks[num_socks++] = xsk_configure_socket(umem);