The pmem2_get_persist_fn() function returns a pointer to a function responsible for efficiently persist‐
ing data in the range owned by the map.
Persisting data using pmem2_persist_fn guarantees that the data is stored durably by the time it returns.
There are no alignment restrictions on the range described by ptr and size, but pmem2_persist_fn may ex‐
pand the range as necessary to meet platform alignment requirements.
There is nothing atomic or transactional about pmem2_persist_fn. Any unwritten stores in the given range
will be written, but some stores may have already been written by virtue of normal cache eviction/re‐
placement policies. Correctly written code must not depend on stores waiting until pmem2_persist_fn is
called to become persistent – they can become persistent at any time before pmem2_persist_fn is called.
If two (or more) mappings share the same pmem2_persist_fn and they are adjacent to each other, it is safe
to call this function for a range spanning those mappings.
Internally pmem2_persist_fn performs two operations:
• memory flush (pmem2_get_flush_fn(3)), which can be reordered by the CPU with other flushes
• drain (pmem2_get_drain_fn(3)), which makes sure that the flushes before this operation won’t be re‐
ordered after it
So this code:
pmem2_persist_fn persist_fn = pmem2_get_persist_fn(map);
persist_fn(addr, len);
is equivalent of:
pmem2_flush_fn flush_fn = pmem2_get_flush_fn(map);
pmem2_drain_fn drain_fn = pmem2_get_drain_fn(map);
flush_fn(addr, len);
drain_fn();
Advanced applications may want to flush multiple discontiguous regions and perform the drain operation
only once.