Provided by: libpmem-dev_1.4.1-0ubuntu1~18.04.1_amd64 bug

NAME

       pmem_is_pmem(),  pmem_map_file(),  pmem_unmap()  -  check  persistency,  create and delete
       mappings

SYNOPSIS

              #include <libpmem.h>

              int pmem_is_pmem(const void *addr, size_t len);
              void *pmem_map_file(const char *path, size_t len, int flags,
                  mode_t mode, size_t *mapped_lenp, int *is_pmemp);
              int pmem_unmap(void *addr, size_t len);

DESCRIPTION

       Most pmem-aware applications will take advantage of higher level libraries that  alleviate
       the  need  for the application to call into libpmem directly.  Application developers that
       wish to access raw memory mapped persistence directly (via mmap(2)) and that wish to  take
       on the responsibility for flushing stores to persistence will find the functions described
       in this section to be the most commonly used.

       The pmem_is_pmem() function detects if the  entire  range  [addr,  addr+len)  consists  of
       persistent  memory.  The implementation of pmem_is_pmem() requires a non-trivial amount of
       work to determine if the given range is entirely persistent memory.  For this  reason,  it
       is  better  to  call pmem_is_pmem() once when a range of memory is first encountered, save
       the result, and use the saved result to determine whether pmem_persist(3) or  msync(2)  is
       appropriate for flushing changes to persistence.  Calling pmem_is_pmem() each time changes
       are flushed to persistence will not perform well.

       The  pmem_map_file()  function  creates  a  new  read/write  mapping  for  a   file.    If
       PMEM_FILE_CREATE  is  not specified in flags, the entire existing file path is mapped, len
       must be zero, and mode is ignored.  Otherwise, path is opened or created as  specified  by
       flags  and  mode,  and len must be non-zero.  pmem_map_file() maps the file using mmap(2),
       but it also takes extra steps to make large page mappings more likely.

       On success, pmem_map_file() returns a pointer to the mapped area.  If mapped_lenp  is  not
       NULL,  the  length of the mapping is stored into *mapped_lenp.  If is_pmemp is not NULL, a
       flag indicating whether the mapped file is actual pmem, or if  msync()  must  be  used  to
       flush writes for the mapped range, is stored into *is_pmemp.

       The  flags  argument  is 0 or the bitwise OR of one or more of the following file creation
       flags:

       • PMEM_FILE_CREATE - Create the file named path  if  it  does  not  exist.   len  must  be
         non-zero  and specifies the size of the file to be created.  If the file already exists,
         it will be extended or truncated to  len.  The  new  or  existing  file  is  then  fully
         allocated  to size len using posix_fallocate(3).  mode specifies the mode to use in case
         a new file is created (see creat(2)).

       The remaining flags modify  the  behavior  of  pmem_map_file()  when  PMEM_FILE_CREATE  is
       specified.

       • PMEM_FILE_EXCL  -  If  specified  in conjunction with PMEM_FILE_CREATE, and path already
         exists, then pmem_map_file() will fail with EEXIST.  Otherwise, has the same meaning  as
         O_EXCL on open(2), which is generally undefined.

       • PMEM_FILE_SPARSE  - When specified in conjunction with PMEM_FILE_CREATE, create a sparse
         (holey) file using ftruncate(2) rather  than  allocating  it  using  posix_fallocate(3).
         Otherwise ignored.

       • PMEM_FILE_TMPFILE  -  Create a mapping for an unnamed temporary file.  Must be specified
         with PMEM_FILE_CREATE.  len must be non-zero, mode is ignored  (the  temporary  file  is
         always  created  with  mode 0600), and path must specify an existing directory name.  If
         the underlying file system supports O_TMPFILE, the unnamed temporary file is created  in
         the  filesystem  containing the directory path; if PMEM_FILE_EXCL is also specified, the
         temporary file may not  subsequently  be  linked  into  the  filesystem  (see  open(2)).
         Otherwise, the file is created in path and immediately unlinked.

       The  path  can  point  to  a  Device  DAX.   In  this  case  only the PMEM_FILE_CREATE and
       PMEM_FILE_SPARSE flags are valid, but they are both ignored.  For Device DAX mappings, len
       must be equal to either 0 or the exact size of the device.

       To delete mappings created with pmem_map_file(), use pmem_unmap().

       The  pmem_unmap()  function  deletes all the mappings for the specified address range, and
       causes further references to  addresses  within  the  range  to  generate  invalid  memory
       references.  It will use the address specified by the parameter addr, where addr must be a
       previously mapped region.  pmem_unmap() will delete the mappings using munmap(2).

RETURN VALUE

       The pmem_is_pmem() function returns  true  only  if  the  entire  range  [addr,  addr+len)
       consists  of persistent memory.  A true return from pmem_is_pmem() means it is safe to use
       pmem_persist(3) and the related functions to make changes durable for that  memory  range.
       See also CAVEATS.

       On  success,  pmem_map_file()  returns  a  pointer  to  the  memory-mapped region and sets
       *mapped_lenp and *is_pmemp if they are not NULL.  On error, it returns  NULL,  sets  errno
       appropriately, and does not modify *mapped_lenp or *is_pmemp.

       On success, pmem_unmap() returns 0.  On error, it returns -1 and sets errno appropriately.

NOTES

       On  Linux,  pmem_is_pmem()  returns  true only if the entire range is mapped directly from
       Device DAX (/dev/daxX.Y) without an intervening file  system.   In  the  future,  as  file
       systems  become  available that support flushing with pmem_persist(3), pmem_is_pmem() will
       return true as appropriate.

CAVEATS

       The result  of  pmem_is_pmem()  query  is  only  valid  for  the  mappings  created  using
       pmem_map_file().   For  other memory regions, in particular those created by a direct call
       to mmap(2), pmem_is_pmem() always returns false, even if the  queried  range  is  entirely
       persistent memory.

       Not   all   file   systems  support  posix_fallocate(3).   pmem_map_file()  will  fail  if
       PMEM_FILE_CREATE is specified without PMEM_FILE_SPARSE and the underlying file system does
       not support posix_fallocate(3).

SEE ALSO

       creat(2),   ftruncate(2),   mmap(2),   msync(2),   munmap(2),   open(2),  pmem_persist(3),
       posix_fallocate(3), libpmem(7) and <http://pmem.io>