rpma: add support for libpmem2 to librpma engine in GPSPM mode
authorKacper Stefanski <kacper.stefanski@intel.com>
Thu, 24 Feb 2022 14:59:03 +0000 (15:59 +0100)
committerLukasz Dorau <lukasz.dorau@intel.com>
Tue, 6 Sep 2022 11:47:30 +0000 (13:47 +0200)
Add support for libpmem2 to librpma fio engine in the GPSPM mode.

Signed-off-by: Kacper Stefanski <kacper.stefanski@intel.com>
engines/librpma_gpspm.c

index 64962dda4c7088f994180e8193017e324731f535..70116d0d6ece5d3d2adf6b5bb93081bc787662ca 100644 (file)
@@ -2,7 +2,7 @@
  * librpma_gpspm: IO engine that uses PMDK librpma to write data,
  *             based on General Purpose Server Persistency Method
  *
- * Copyright 2020-2021, Intel Corporation
+ * Copyright 2020-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,
 
 #include "librpma_fio.h"
 
+#ifdef CONFIG_LIBPMEM2_INSTALLED
+#include <libpmem2.h>
+#else
 #include <libpmem.h>
+#endif
 
 /* Generated by the protocol buffer compiler from: librpma_gpspm_flush.proto */
 #include "librpma_gpspm_flush.pb-c.h"
@@ -361,6 +365,8 @@ FIO_STATIC struct ioengine_ops ioengine_client = {
 
 #define IO_U_BUFF_OFF_SERVER(i) (i * IO_U_BUF_LEN)
 
+typedef void (*librpma_fio_persist_fn)(const void *ptr, size_t size);
+
 struct server_data {
        /* aligned td->orig_buffer */
        char *orig_buffer_aligned;
@@ -373,6 +379,8 @@ struct server_data {
        /* in-memory queues */
        struct ibv_wc *msgs_queued;
        uint32_t msg_queued_nr;
+
+       librpma_fio_persist_fn persist;
 };
 
 static int server_init(struct thread_data *td)
@@ -400,6 +408,13 @@ static int server_init(struct thread_data *td)
                goto err_free_sd;
        }
 
+#ifdef CONFIG_LIBPMEM2_INSTALLED
+       /* get libpmem2 persist function from pmem2_map */
+       sd->persist = pmem2_get_persist_fn(csd->mem.map);
+#else
+       sd->persist = pmem_persist;
+#endif
+
        /*
         * Assure a single io_u buffer can store both SEND and RECV messages and
         * an io_us buffer allocation is page-size-aligned which is required
@@ -594,7 +609,7 @@ static int server_qe_process(struct thread_data *td, struct ibv_wc *wc)
 
        if (IS_NOT_THE_LAST_MESSAGE(flush_req)) {
                op_ptr = csd->ws_ptr + flush_req->offset;
-               pmem_persist(op_ptr, flush_req->length);
+               sd->persist(op_ptr, flush_req->length);
        } else {
                /*
                 * This is the last message - the client is done.