- if (td->o.mem_type == MEM_MALLOC) {
- dprint(FD_MEM, "free mem %p\n", td->orig_buffer);
- free(td->orig_buffer);
- } else if (td->o.mem_type == MEM_SHM || td->o.mem_type == MEM_SHMHUGE) {
- struct shmid_ds sbuf;
-
- dprint(FD_MEM, "shmdt/ctl %d %p\n", td->shm_id,td->orig_buffer);
- shmdt(td->orig_buffer);
- shmctl(td->shm_id, IPC_RMID, &sbuf);
- } else if (td->o.mem_type == MEM_MMAP ||
- td->o.mem_type == MEM_MMAPHUGE) {
- dprint(FD_MEM, "munmap %zu %p\n", td->orig_buffer_size,
- td->orig_buffer);
- munmap(td->orig_buffer, td->orig_buffer_size);
- if (td->mmapfile) {
- close(td->mmapfd);
- unlink(td->mmapfile);
- free(td->mmapfile);
- }
- } else
+ unsigned int total_mem;
+
+ total_mem = td->orig_buffer_size;
+ if (td->o.odirect)
+ total_mem += page_mask;
+
+ if (td->o.mem_type == MEM_MALLOC)
+ free_mem_malloc(td);
+ else if (td->o.mem_type == MEM_SHM || td->o.mem_type == MEM_SHMHUGE)
+ free_mem_shm(td);
+ else if (td->o.mem_type == MEM_MMAP || td->o.mem_type == MEM_MMAPHUGE)
+ free_mem_mmap(td, total_mem);
+ else