Fio 3.37
[fio.git] / engines / librpma_fio.c
index dfd8218006c0f0e8d33741b085daf6291c73517e..42d6163ea19e1e14ae9c275bde19773a24b3fa03 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * librpma_fio: librpma_apm and librpma_gpspm engines' common part.
  *
- * Copyright 2021, Intel Corporation
+ * Copyright 2021-2022, Intel Corporation
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License,
  * GNU General Public License for more details.
  */
 
-#include "librpma_fio.h"
-
-#include <libpmem.h>
+#ifdef CONFIG_LIBPMEM2_INSTALLED
+#include "librpma_fio_pmem2.h"
+#else
+#include "librpma_fio_pmem.h"
+#endif /* CONFIG_LIBPMEM2_INSTALLED */
 
 struct fio_option librpma_fio_options[] = {
        {
@@ -111,10 +113,8 @@ char *librpma_fio_allocate_dram(struct thread_data *td, size_t size,
 char *librpma_fio_allocate_pmem(struct thread_data *td, struct fio_file *f,
                size_t size, struct librpma_fio_mem *mem)
 {
-       size_t size_mmap = 0;
-       char *mem_ptr = NULL;
-       int is_pmem = 0;
        size_t ws_offset;
+       mem->mem_ptr = NULL;
 
        if (size % page_size) {
                log_err("fio: size (%zu) is not aligned to page size (%zu)\n",
@@ -135,48 +135,24 @@ char *librpma_fio_allocate_pmem(struct thread_data *td, struct fio_file *f,
                return NULL;
        }
 
-       /* map the file */
-       mem_ptr = pmem_map_file(f->file_name, 0 /* len */, 0 /* flags */,
-                       0 /* mode */, &size_mmap, &is_pmem);
-       if (mem_ptr == NULL) {
-               log_err("fio: pmem_map_file(%s) failed\n", f->file_name);
-               /* pmem_map_file() sets errno on failure */
-               td_verror(td, errno, "pmem_map_file");
-               return NULL;
-       }
-
-       /* pmem is expected */
-       if (!is_pmem) {
-               log_err("fio: %s is not located in persistent memory\n",
+       if (librpma_fio_pmem_map_file(f, size, mem, ws_offset)) {
+               log_err("fio: librpma_fio_pmem_map_file(%s) failed\n",
                        f->file_name);
-               goto err_unmap;
-       }
-
-       /* check size of allocated persistent memory */
-       if (size_mmap < ws_offset + size) {
-               log_err(
-                       "fio: %s is too small to handle so many threads (%zu < %zu)\n",
-                       f->file_name, size_mmap, ws_offset + size);
-               goto err_unmap;
+               return NULL;
        }
 
        log_info("fio: size of memory mapped from the file %s: %zu\n",
-               f->file_name, size_mmap);
-
-       mem->mem_ptr = mem_ptr;
-       mem->size_mmap = size_mmap;
+               f->file_name, mem->size_mmap);
 
-       return mem_ptr + ws_offset;
+       log_info("fio: library used to map PMem from file: %s\n", RPMA_PMEM_USED);
 
-err_unmap:
-       (void) pmem_unmap(mem_ptr, size_mmap);
-       return NULL;
+       return mem->mem_ptr ? mem->mem_ptr + ws_offset : NULL;
 }
 
 void librpma_fio_free(struct librpma_fio_mem *mem)
 {
        if (mem->size_mmap)
-               (void) pmem_unmap(mem->mem_ptr, mem->size_mmap);
+               librpma_fio_unmap(mem);
        else
                free(mem->mem_ptr);
 }
@@ -426,7 +402,7 @@ int librpma_fio_client_post_init(struct thread_data *td)
 
        /*
         * td->orig_buffer is not aligned. The engine requires aligned io_us
-        * so FIO alignes up the address using the formula below.
+        * so FIO aligns up the address using the formula below.
         */
        ccd->orig_buffer_aligned = PTR_ALIGN(td->orig_buffer, page_mask) +
                        td->o.mem_align;
@@ -621,9 +597,16 @@ int librpma_fio_client_commit(struct thread_data *td)
                }
        }
 
-       if ((fill_time = fio_fill_issue_time(td)))
+       if ((fill_time = fio_fill_issue_time(td))) {
                fio_gettime(&now, NULL);
 
+               /*
+                * only used for iolog
+                */
+               if (td->o.read_iolog_file)
+                       memcpy(&td->last_issue, &now, sizeof(now));
+
+       }
        /* move executed io_us from queued[] to flight[] */
        for (i = 0; i < ccd->io_u_queued_nr; i++) {
                struct io_u *io_u = ccd->io_us_queued[i];