dprint(FD_MEM, "pinning %llu bytes\n", td->o.lockmem);
/*
- * Don't allow mlock of more than real_mem-128MB
+ * Don't allow mlock of more than real_mem-128MiB
*/
phys_mem = os_phys_mem();
if (phys_mem) {
if ((td->o.lockmem + 128 * 1024 * 1024) > phys_mem) {
td->o.lockmem = phys_mem - 128 * 1024 * 1024;
- log_info("fio: limiting mlocked memory to %lluMB\n",
+ log_info("fio: limiting mlocked memory to %lluMiB\n",
td->o.lockmem >> 20);
}
}
" support huge pages.\n");
} else if (errno == ENOMEM) {
log_err("fio: no huge pages available, do you"
- " need to alocate some? See HOWTO.\n");
+ " need to allocate some? See HOWTO.\n");
}
}
return 1;
}
if (td->o.mem_type != MEM_MMAPHUGE &&
+ td->o.mem_type != MEM_MMAPSHARED &&
ftruncate(td->mmapfd, total_mem) < 0) {
td_verror(td, errno, "truncate mmap file");
td->orig_buffer = NULL;
return 1;
}
- if (td->o.mem_type == MEM_MMAPHUGE)
+ if (td->o.mem_type == MEM_MMAPHUGE ||
+ td->o.mem_type == MEM_MMAPSHARED)
flags |= MAP_SHARED;
else
flags |= MAP_PRIVATE;
size_t total_mem;
int ret = 0;
- if (td->io_ops->flags & FIO_NOIO)
+ if (td_ioengine_flagged(td, FIO_NOIO))
return 0;
total_mem = td->orig_buffer_size;
if (td->o.odirect || td->o.mem_align || td->o.oatomic ||
- (td->io_ops->flags & FIO_MEMALIGN)) {
+ td_ioengine_flagged(td, FIO_MEMALIGN)) {
total_mem += page_mask;
if (td->o.mem_align && td->o.mem_align > page_size)
total_mem += td->o.mem_align - page_size;
dprint(FD_MEM, "Alloc %llu for buffers\n", (unsigned long long) total_mem);
- if (td->o.mem_type == MEM_MALLOC)
+ /*
+ * If the IO engine has hooks to allocate/free memory, use those. But
+ * error out if the user explicitly asked for something else.
+ */
+ if (td->io_ops->iomem_alloc) {
+ if (fio_option_is_set(&td->o, mem_type)) {
+ log_err("fio: option 'mem/iomem' conflicts with specified IO engine\n");
+ ret = 1;
+ } else
+ ret = td->io_ops->iomem_alloc(td, total_mem);
+ } else if (td->o.mem_type == MEM_MALLOC)
ret = alloc_mem_malloc(td, total_mem);
else if (td->o.mem_type == MEM_SHM || td->o.mem_type == MEM_SHMHUGE)
ret = alloc_mem_shm(td, total_mem);
- else if (td->o.mem_type == MEM_MMAP || td->o.mem_type == MEM_MMAPHUGE)
+ else if (td->o.mem_type == MEM_MMAP || td->o.mem_type == MEM_MMAPHUGE ||
+ td->o.mem_type == MEM_MMAPSHARED)
ret = alloc_mem_mmap(td, total_mem);
else {
log_err("fio: bad mem type: %d\n", td->o.mem_type);
if (td->o.odirect || td->o.oatomic)
total_mem += page_mask;
- if (td->o.mem_type == MEM_MALLOC)
+ if (td->io_ops->iomem_alloc) {
+ if (td->io_ops->iomem_free)
+ td->io_ops->iomem_free(td);
+ } else 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)
+ else if (td->o.mem_type == MEM_MMAP || td->o.mem_type == MEM_MMAPHUGE ||
+ td->o.mem_type == MEM_MMAPSHARED)
free_mem_mmap(td, total_mem);
else
log_err("Bad memory type %u\n", td->o.mem_type);