/*
* Memory helpers
*/
-#include <sys/types.h>
-#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
+#include <sys/stat.h>
#include "fio.h"
#ifndef FIO_NO_HAVE_SHM_H
}
if (td->o.mmapfile) {
+ if (access(td->o.mmapfile, F_OK) == 0)
+ td->flags |= TD_F_MMAP_KEEP;
+
td->mmapfd = open(td->o.mmapfile, O_RDWR|O_CREAT, 0644);
if (td->mmapfd < 0) {
td->orig_buffer = NULL;
if (td->mmapfd != 1 && td->mmapfd != -1) {
close(td->mmapfd);
- if (td->o.mmapfile)
+ if (td->o.mmapfile && !(td->flags & TD_F_MMAP_KEEP))
unlink(td->o.mmapfile);
}
if (td->o.mmapfile) {
if (td->mmapfd != -1)
close(td->mmapfd);
- unlink(td->o.mmapfile);
+ if (!(td->flags & TD_F_MMAP_KEEP))
+ unlink(td->o.mmapfile);
free(td->o.mmapfile);
}
}
free(td->orig_buffer);
}
-#ifdef CONFIG_CUDA
-
static int alloc_mem_cudamalloc(struct thread_data *td, size_t total_mem)
{
+#ifdef CONFIG_CUDA
CUresult ret;
char name[128];
dprint(FD_MEM, "cudaMalloc %llu %p\n", \
(unsigned long long) total_mem, td->orig_buffer);
return 0;
+#else
+ return -EINVAL;
+#endif
}
static void free_mem_cudamalloc(struct thread_data *td)
{
- if ((void *) td->dev_mem_ptr != NULL)
+#ifdef CONFIG_CUDA
+ if (td->dev_mem_ptr)
cuMemFree(td->dev_mem_ptr);
if (cuCtxDestroy(td->cu_ctx) != CUDA_SUCCESS)
log_err("fio: failed to destroy cuda context\n");
-}
#endif
+}
/*
* Set up the buffer area we need for io.
total_mem = td->orig_buffer_size;
- if (td->o.odirect || td->o.mem_align || td->o.oatomic ||
+ if (td->o.odirect || td->o.mem_align ||
td_ioengine_flagged(td, FIO_MEMALIGN)) {
total_mem += page_mask;
if (td->o.mem_align && td->o.mem_align > page_size)
dprint(FD_MEM, "Alloc %llu for buffers\n", (unsigned long long) total_mem);
/*
- * If the IO engine has hooks to allocate/free memory, use those. But
- * error out if the user explicitly asked for something else.
+ * If the IO engine has hooks to allocate/free memory and the user
+ * doesn't explicitly ask for something else, use those. But fail if the
+ * user asks for something else with an engine that doesn't allow that.
*/
- 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)
+ if (td->io_ops->iomem_alloc && fio_option_is_set(&td->o, mem_type) &&
+ !td_ioengine_flagged(td, FIO_SKIPPABLE_IOMEM_ALLOC)) {
+ log_err("fio: option 'mem/iomem' conflicts with specified IO engine\n");
+ ret = 1;
+ } else if (td->io_ops->iomem_alloc &&
+ !fio_option_is_set(&td->o, mem_type))
+ 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 ||
td->o.mem_type == MEM_MMAPSHARED)
ret = alloc_mem_mmap(td, total_mem);
-#ifdef CONFIG_CUDA
else if (td->o.mem_type == MEM_CUDA_MALLOC)
ret = alloc_mem_cudamalloc(td, total_mem);
-#endif
else {
log_err("fio: bad mem type: %d\n", td->o.mem_type);
ret = 1;
unsigned int total_mem;
total_mem = td->orig_buffer_size;
- if (td->o.odirect || td->o.oatomic)
+ if (td->o.odirect)
total_mem += page_mask;
- if (td->io_ops->iomem_alloc) {
+ if (td->io_ops->iomem_alloc && !fio_option_is_set(&td->o, mem_type)) {
if (td->io_ops->iomem_free)
td->io_ops->iomem_free(td);
} else if (td->o.mem_type == MEM_MALLOC)
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);
-#ifdef CONFIG_CUDA
else if (td->o.mem_type == MEM_CUDA_MALLOC)
free_mem_cudamalloc(td);
-#endif
else
log_err("Bad memory type %u\n", td->o.mem_type);