Provided by: libpmem-dev_1.13.1-1.1ubuntu2_amd64 bug

NAME

       pmem_memmove(),        pmem_memcpy(),        pmem_memset(),        pmem_memmove_persist(),
       pmem_memcpy_persist(),           pmem_memset_persist(),            pmem_memmove_nodrain(),
       pmem_memcpy_nodrain(), pmem_memset_nodrain() - functions that provide optimized copying to
       persistent memory

SYNOPSIS

              #include <libpmem.h>

              void *pmem_memmove(void *pmemdest, const void *src, size_t len, unsigned flags);
              void *pmem_memcpy(void *pmemdest, const void *src, size_t len, unsigned flags);
              void *pmem_memset(void *pmemdest, int c, size_t len, unsigned flags);
              void *pmem_memmove_persist(void *pmemdest, const void *src, size_t len);
              void *pmem_memcpy_persist(void *pmemdest, const void *src, size_t len);
              void *pmem_memset_persist(void *pmemdest, int c, size_t len);
              void *pmem_memmove_nodrain(void *pmemdest, const void *src, size_t len);
              void *pmem_memcpy_nodrain(void *pmemdest, const void *src, size_t len);
              void *pmem_memset_nodrain(void *pmemdest, int c, size_t len);

DESCRIPTION

       pmem_memmove(), pmem_memcpy() and pmem_memset() functions provide the same memory  copying
       as  their  namesakes  memmove(3),  memcpy(3) and memset(3), and ensure that the result has
       been flushed to persistence before returning (unless PMEM_F_MEM_NOFLUSH flag was used).

       For example, the following code is functionally equivalent to pmem_memmove()  (with  flags
       equal to 0):

                  memmove(dest, src, len);
                  pmem_persist(dest, len);

       Calling  pmem_memmove()  may out-perform the above code, because libpmem(7) implementation
       may take advantage of the fact that pmemdest is persistent  memory  and  use  instructions
       such as non-temporal stores to avoid the need to flush processor caches.

              WARNING:  Using  these  functions  where  pmem_is_pmem(3)  returns false may not do
              anything useful.  Use libc functions in that case.

       Unlike libc implementation, libpmem functions guarantee that if destination buffer address
       and  length  are  8  byte  aligned then all stores will be performed using at least 8 byte
       store instructions.  This means that a series of 8 byte stores followed by pmem_persist(3)
       can be safely replaced by a single call to one of the above functions.

       The  flags  argument of all of the above functions has the same meaning.  It can be 0 or a
       bitwise OR of one or more of the following flags:

       • PMEM_F_MEM_NODRAIN - modifies the behavior to skip the final  pmem_drain()  step.   This
         allows  applications  to  optimize  cases  where  several  ranges  are  being  copied to
         persistent memory, followed by a single call to  pmem_drain().   The  following  example
         illustrates  how  this  flag  might be used to avoid multiple calls to pmem_drain() when
         copying several ranges of memory to pmem:

         /* ... write several ranges to pmem ... */
         pmem_memcpy(pmemdest1, src1, len1, PMEM_F_MEM_NODRAIN);
         pmem_memcpy(pmemdest2, src2, len2, PMEM_F_MEM_NODRAIN);

         /* ... */

         /* wait for any pmem stores to drain from HW buffers */
         pmem_drain();

       • PMEM_F_MEM_NOFLUSH - Don’t flush anything.  This implies PMEM_F_MEM_NODRAIN.  Using this
         flag only makes sense when it’s followed by any function that flushes data.

       The remaining flags say how the operation should be done, and are merely hints.

       • PMEM_F_MEM_NONTEMPORAL - Use non-temporal instructions.  This flag is mutually exclusive
         with  PMEM_F_MEM_TEMPORAL.   On  x86_64   this   flag   is   mutually   exclusive   with
         PMEM_F_MEM_NOFLUSH.

       • PMEM_F_MEM_TEMPORAL  -  Use temporal instructions.  This flag is mutually exclusive with
         PMEM_F_MEM_NONTEMPORAL.

       • PMEM_F_MEM_WC - Use  write  combining  mode.   This  flag  is  mutually  exclusive  with
         PMEM_F_MEM_WB.  On x86_64 this flag is mutually exclusive with PMEM_F_MEM_NOFLUSH.

       • PMEM_F_MEM_WB   -   Use   write  back  mode.   This  flag  is  mutually  exclusive  with
         PMEM_F_MEM_WC.  On x86_64 this is an alias for PMEM_F_MEM_TEMPORAL.

       Using an invalid combination of flags has undefined behavior.

       Without any of the above flags libpmem will try to guess the best strategy based on  size.
       See PMEM_MOVNT_THRESHOLD description in libpmem(7) for details.

       pmem_memmove_persist() is an alias for pmem_memmove() with flags equal to 0.

       pmem_memcpy_persist() is an alias for pmem_memcpy() with flags equal to 0.

       pmem_memset_persist() is an alias for pmem_memset() with flags equal to 0.

       pmem_memmove_nodrain()   is   an   alias   for   pmem_memmove()   with   flags   equal  to
       PMEM_F_MEM_NODRAIN.

       pmem_memcpy_nodrain()   is   an   alias   for   pmem_memcpy()   with   flags   equal    to
       PMEM_F_MEM_NODRAIN.

       pmem_memset_nodrain()    is   an   alias   for   pmem_memset()   with   flags   equal   to
       PMEM_F_MEM_NODRAIN.

RETURN VALUE

       All of the above functions return address of the destination buffer.

CAVEATS

       After calling any of the functions with PMEM_F_MEM_NODRAIN  flag  you  should  not  expect
       memory  to be visible to other threads before calling pmem_drain(3) or any of the _persist
       functions.  This  is  because  on  x86_64  those  functions  may  use  non-temporal  store
       instructions,  which  are  weakly ordered.  See “Intel 64 and IA-32 Architectures Software
       Developer’s Manual”, Volume 1, “Caching of Temporal  vs. Non-Temporal  Data”  section  for
       details.

SEE ALSO

       memcpy(3), memmove(3), memset(3), libpmem(7) and <https://pmem.io>