Provided by: librpmem-dev_1.11.1-3build1_amd64 bug

NAME

       rpmem_persist(),   rpmem_deep_persist(),   rpmem_flush(),  rpmem_drain(),  rpmem_read()  -
       functions to copy and read remote pools

SYNOPSIS

              #include <librpmem.h>

              int rpmem_persist(RPMEMpool *rpp, size_t offset,
                  size_t length, unsigned lane, unsigned flags);
              int rpmem_deep_persist(RPMEMpool *rpp, size_t offset,
                  size_t length, unsigned lane);

              int rpmem_flush(RPMEMpool *rpp, size_t offset,
                  size_t length, unsigned lane, unsigned flags);
              int rpmem_drain(RPMEMpool *rpp, unsigned lane, unsigned flags);

              int rpmem_read(RPMEMpool *rpp, void *buff, size_t offset,
                  size_t length, unsigned lane);

DESCRIPTION

       The rpmem_persist() function copies  data  of  given  length  at  given  offset  from  the
       associated  local  memory  pool  and  makes sure the data is persistent on the remote node
       before the function returns.  The remote node is identified by the rpp handle  which  must
       be  returned  from either rpmem_open(3) or rpmem_create(3).  The offset is relative to the
       pool_addr specified in the rpmem_open(3) or rpmem_create(3) call.  If the remote pool  was
       created  using rpmem_create() with non-NULL create_attr argument, offset has to be greater
       or equal to 4096.  In that case the first 4096 bytes of the pool is used for  storing  the
       pool  metadata  and  cannot be overwritten.  If the pool was created with NULL create_attr
       argument, the pool metadata is not stored with the pool and offset can be any  nonnegative
       number.   The  offset  and  length  combined  must  not  exceed  the  pool_size  passed to
       rpmem_open(3) or rpmem_create(3).  The rpmem_persist() operation is  performed  using  the
       given  lane  number.   The  lane  must be less than the value returned by rpmem_open(3) or
       rpmem_create(3) through the nlanes argument (so it can take a value from 0 to nlanes - 1).
       The  flags  argument  can  be 0 or RPMEM_PERSIST_RELAXED which means the persist operation
       will be done without any guarantees regarding atomicity of memory transfer.

       The rpmem_deep_persist() function works in the same way as rpmem_persist(3) function,  but
       additionally  it flushes the data to the lowest possible persistency domain available from
       software.  Please see pmem_deep_persist(3) for details.

       The  rpmem_flush()  and  rpmem_drain()  functions   are   two   halves   of   the   single
       rpmem_persist().  The rpmem_persist() copies data and makes it persistent in the one shot,
       where  rpmem_flush()  and  rpmem_drain()  split  this  operation  into  two  stages.   The
       rpmem_flush()  copies  data  of  given  length at a given offset from the associated local
       memory pool to the remote node.  The rpmem_drain() makes  sure  the  data  copied  in  all
       preceding  rpmem_flush()  calls  is  persistent  on  the  remote  node before the function
       returns.  Data copied using rpmem_flush() can not be considered persistent on  the  remote
       node   before   return   from  following  rpmem_drain().   Single  rpmem_drain()  confirms
       persistence on the remote node of data copied by all rpmem_flush() functions called before
       it  and  using the same lane.  The last rpmem_flush() + rpmem_drain() can be replaced with
       rpmem_persist() at no cost.

       The flags argument for rpmem_flush() can be 0 or RPMEM_FLUSH_RELAXED which means the flush
       operation will be done without any guarantees regarding atomicity of memory transfer.  The
       flags argument for rpmem_drain() must be 0.

       The rpmem_flush() function performance is affected  by  RPMEM_WORK_QUEUE_SIZE  environment
       variable (see librpmem(7) for more details).

       The  rpmem_read()  function  reads  length  bytes of data from a remote pool at offset and
       copies it to the buffer buff.  The operation is performed on the specified lane.  The lane
       must  be  less  than  the  value  returned by rpmem_open(3) or rpmem_create(3) through the
       nlanes argument (so it can take a value from 0 to nlanes - 1).  The rpp must  point  to  a
       remote pool opened or created previously by rpmem_open(3) or rpmem_create(3).

RETURN VALUE

       The  rpmem_persist()  function  returns 0 if the entire memory area was made persistent on
       the remote node.  Otherwise it returns a non-zero value and sets errno appropriately.

       The rpmem_flush() function returns 0 if duplication of the memory area to the remote  node
       was  initialized  successfully.   Otherwise,  it  returns  a non-zero value and sets errno
       appropriately.

       The rpmem_drain() function returns 0 if the memory areas duplicated by  all  rpmem_flush()
       calls  preceding  the rpmem_drain() are made persistent on the remote node.  Otherwise, it
       returns a non-zero value and sets errno appropriately.

       The rpmem_read() function returns 0 if the data was read entirely.  Otherwise it returns a
       non-zero value and sets errno appropriately.

CAVEATS

       Ordering  of  rpmem_flush()  and rpmem_persist() operations which are using different lane
       values is not guaranteed.

SEE ALSO

       rpmem_create(3),    rpmem_open(3),    rpmem_persist(3),    sysconf(3),     limits.conf(5),
       libpmemobj(7) and <https://pmem.io>