From: Jens Axboe Date: Wed, 28 Mar 2012 10:22:40 +0000 (+0200) Subject: backend: ensure that server side releases/frees shm segment on exit X-Git-Tag: gfio-0.1~24 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=2bb3f0a7e00d3d62943b0bcc8119ab81c157c349 backend: ensure that server side releases/frees shm segment on exit We were leaking one for every job run. Signed-off-by: Jens Axboe --- diff --git a/fio.h b/fio.h index 393f381d..6a7bd03c 100644 --- a/fio.h +++ b/fio.h @@ -445,6 +445,7 @@ extern int __must_check fio_pin_memory(void); extern void fio_unpin_memory(void); extern int __must_check allocate_io_mem(struct thread_data *); extern void free_io_mem(struct thread_data *); +extern void free_threads_shm(void); /* * Reset stats after ramp time completes diff --git a/init.c b/init.c index a04198f3..cf105a35 100644 --- a/init.c +++ b/init.c @@ -207,7 +207,7 @@ static struct option l_opts[FIO_NR_OPTIONS] = { }, }; -static void free_shm(void) +void free_threads_shm(void) { struct shmid_ds sbuf; @@ -215,11 +215,19 @@ static void free_shm(void) void *tp = threads; threads = NULL; + shmdt(tp); + shmctl(shm_id, IPC_RMID, &sbuf); + shm_id = -1; + } +} + +void free_shm(void) +{ + if (threads) { file_hash_exit(); flow_exit(); fio_debug_jobp = NULL; - shmdt(tp); - shmctl(shm_id, IPC_RMID, &sbuf); + free_threads_shm(); } scleanup(); diff --git a/server.c b/server.c index 8b91d26f..c859ad72 100644 --- a/server.c +++ b/server.c @@ -550,6 +550,7 @@ static int handle_run_cmd(struct fio_net_cmd *cmd) } ret = fio_backend(); + free_threads_shm(); _exit(ret); }