Add engine flag FIO_SKIPPABLE_IOMEM_ALLOC
authorAlberto Faria <afaria@redhat.com>
Thu, 1 Dec 2022 22:07:55 +0000 (22:07 +0000)
committerVincent Fu <vincent.fu@samsung.com>
Fri, 2 Dec 2022 21:24:03 +0000 (16:24 -0500)
It makes it valid to set option mem/iomem even when the engine specifies
iomem_alloc and iomem_free callbacks, allowing users to optionally use
fio's customizable memory allocation logic instead of the engine's.

This is in preparation for giving libblkio engine users the choice
between controlling memory allocation or delegating it to the libblkio
library.

Signed-off-by: Alberto Faria <afaria@redhat.com>
Signed-off-by: Vincent Fu <vincent.fu@samsung.com>
ioengines.h
memory.c

index 11d2115ce700ac1fe702ab57c29dccc9523505df..d43540d0f6032c480008a86d1d07f69b807f9341 100644 (file)
@@ -87,6 +87,8 @@ enum fio_ioengine_flags {
        FIO_NO_OFFLOAD  = 1 << 15,      /* no async offload */
        FIO_ASYNCIO_SETS_ISSUE_TIME
                        = 1 << 16,      /* async ioengine with commit function that sets issue_time */
+       FIO_SKIPPABLE_IOMEM_ALLOC
+                       = 1 << 17,      /* skip iomem_alloc & iomem_free if job sets mem/iomem */
 };
 
 /*
index 6cf7333375d035dd6eb36526eb338f355f310e78..577d3dd5afd80d2a3dd1cdd4183b797b276f0f04 100644 (file)
--- a/memory.c
+++ b/memory.c
@@ -305,16 +305,18 @@ int allocate_io_mem(struct thread_data *td)
        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);
@@ -342,7 +344,7 @@ void free_io_mem(struct thread_data *td)
        if (td->o.odirect || td->o.oatomic)
                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)