Skip to content
Snippets Groups Projects
Unverified Commit d06b9832 authored by Piotr Balcer's avatar Piotr Balcer Committed by GitHub
Browse files

Merge pull request #4973 from pbalcer/doc-pmem2-fixes

doc: tiny man page fixes
parents 3d541460 42eab3ad
No related branches found
No related tags found
No related merge requests found
...@@ -65,19 +65,19 @@ robust use of Persistent Memory. It relies on three core concepts: ...@@ -65,19 +65,19 @@ robust use of Persistent Memory. It relies on three core concepts:
* *source* - an object describing the data source for mapping. * *source* - an object describing the data source for mapping.
The data source can be a file descriptor, a file handle, or an anonymous mapping. The data source can be a file descriptor, a file handle, or an anonymous mapping.
API dedicated to create a *source* is: **pmem2_source_from_fd**(3), APIs dedicated for creating *source* are: **pmem2_source_from_fd**(3),
**pmem2_source_from_handle**(3), **pmem2_source_from_anon**(3). **pmem2_source_from_handle**(3), **pmem2_source_from_anon**(3).
* *config* - an object containing parameters that are used to create a mapping from a *source*. * *config* - an object containing parameters that are used to create a mapping from a *source*.
The configuration structure must always be provided to create a mapping, The configuration structure must always be provided to create a mapping,
but the only required parameter to set in the *config* is a *granularity*. but the only required parameter to set in the *config* is *granularity*.
The granularity should by set using dedicated **libpmem2** function The granularity should by set using dedicated **libpmem2** function
**pmem2_config_set_required_store_granularity**(3) which defines a maximum permitted **pmem2_config_set_required_store_granularity**(3) which defines a maximum permitted
granularity requested by the user. For more information about the granularity concept granularity requested by the user. For more information about the granularity concept
read **GRANULARITY** section below. read **GRANULARITY** section below.
In addition to the granularity setting, libpmem2 provides multiple optional In addition to the granularity setting, libpmem2 provides multiple optional
functions to configure target mapping, eg. **pmem2_config_set_length**(3) functions to configure target mapping, e.g., **pmem2_config_set_length**(3)
to set length which will be used for mapping, or **pmem2_config_set_offset**(3) to set length which will be used for mapping, or **pmem2_config_set_offset**(3)
which will be used to map the contents from the specified location of the source, which will be used to map the contents from the specified location of the source,
**pmem2_config_set_sharing**(3) which defines the behavior and visibility of writes **pmem2_config_set_sharing**(3) which defines the behavior and visibility of writes
...@@ -91,7 +91,7 @@ set of functions: **pmem2_map_get_address**(3), **pmem2_map_get_size**(3), ...@@ -91,7 +91,7 @@ set of functions: **pmem2_map_get_address**(3), **pmem2_map_get_size**(3),
size and effective mapping granularity. size and effective mapping granularity.
In addition to the basic functionality of managing the virtual address mapping, In addition to the basic functionality of managing the virtual address mapping,
**libpmem2** also provides optimized functions for modifying the mapping data. **libpmem2** also provides optimized functions for modifying the mapped data.
This includes data flushing as well as memory copying. This includes data flushing as well as memory copying.
To get proper function for data flushing use: **pmem2_get_flush_fn**(3), To get proper function for data flushing use: **pmem2_get_flush_fn**(3),
...@@ -114,9 +114,10 @@ and can be found in the **libpmem2_unsafe_shutdown**(7) man page. ...@@ -114,9 +114,10 @@ and can be found in the **libpmem2_unsafe_shutdown**(7) man page.
# GRANULARITY # # GRANULARITY #
The **libpmem2** library introduces the concept of granularity through which you The **libpmem2** library introduces the concept of granularity through which you
may easily distinguish between different types of may easily distinguish between different levels of storage performance
reaching *power-fail protected domain* by data. Data can reach this domain in capabilities available to the application as related to *power-fail protected domain*.
different ways depending on the platform capabilities. The way data reaches this protected domain differs based on the platform
and storage device capabilities.
Traditional block storage devices (SSD, HDD) must use system API calls such Traditional block storage devices (SSD, HDD) must use system API calls such
as `msync()`, `fsync()` on Linux, or `FlushFileBuffers()`,`FlushViewOfFile()` as `msync()`, `fsync()` on Linux, or `FlushFileBuffers()`,`FlushViewOfFile()`
...@@ -126,13 +127,14 @@ of flushing behavior is called **PMEM2_GRANULARITY_PAGE**. ...@@ -126,13 +127,14 @@ of flushing behavior is called **PMEM2_GRANULARITY_PAGE**.
In systems with persistent memory support, a *power-fail protected domain* may In systems with persistent memory support, a *power-fail protected domain* may
cover different sets of resources: either the memory controller or the memory cover different sets of resources: either the memory controller or the memory
controller and CPU caches. In this regard, **libpmem2** distinguishes two types controller and CPU caches. For this reason, **libpmem2** distinguishes two types
of granularity for persistent memory: of granularity for persistent memory:
**PMEM2_GRANULARITY_CACHE_LINE** and **PMEM2_GRANULARITY_BYTE**. **PMEM2_GRANULARITY_CACHE_LINE** and **PMEM2_GRANULARITY_BYTE**.
If the *power-fail protected domain* covers only the memory controller, it is If the *power-fail protected domain* covers only the memory controller, the
required to flush CPU caches, so the granularity type, in this case, is called CPU appropriate cache lines must be flushed for the data to be considered
**PMEM2_GRANULARITY_CACHE_LINE**. Depending on the architecture, there are persistent. This granularity type is called **PMEM2_GRANULARITY_CACHE_LINE**.
Depending on the architecture, there are
different types of machine instructions for flushing *cache lines* different types of machine instructions for flushing *cache lines*
(e.g., *CLWB*, *CLFLUSHOPT*, *CLFLUSH* for Intel x86_64 architecture). Usually, (e.g., *CLWB*, *CLFLUSHOPT*, *CLFLUSH* for Intel x86_64 architecture). Usually,
to ensure the ordering of stores, such instructions must be followed to ensure the ordering of stores, such instructions must be followed
...@@ -151,6 +153,10 @@ that most accurately represents the target hardware characteristics and ...@@ -151,6 +153,10 @@ that most accurately represents the target hardware characteristics and
the storage patterns of the application. For example, a database storage engine the storage patterns of the application. For example, a database storage engine
that operates on large logical pages that reside either on SSDs or PMEM should that operates on large logical pages that reside either on SSDs or PMEM should
set this value to **PMEM2_GRANULARITY_PAGE**. set this value to **PMEM2_GRANULARITY_PAGE**.
The library will create mappings where the new map granularity is lower or
equal to the requested one. For example, a mapping with **PMEM2_GRANULARITY_CACHE_LINE**
can created for the requried granularity **PMEM2_GRANULARITY_PAGE**, but not
vice versa.
# CAVEATS # # CAVEATS #
......
...@@ -37,7 +37,9 @@ int pmem2_config_delete(struct pmem2_config **cfg); ...@@ -37,7 +37,9 @@ int pmem2_config_delete(struct pmem2_config **cfg);
The **pmem2_config_new**() function instantiates a new (opaque) configuration structure, *pmem2_config*, which is used to define mapping parameters for a **pmem2_map_new**() function, and returns it through the pointer in *\*cfg*. The **pmem2_config_new**() function instantiates a new (opaque) configuration structure, *pmem2_config*, which is used to define mapping parameters for a **pmem2_map_new**() function, and returns it through the pointer in *\*cfg*.
New configuration is always initialized with default values for all possible parameters, which are specified alongside the corresponding setter function. New configuration is always initialized with default values for most parameters,
which are specified alongside the corresponding setter function.
The application must explicitly set the granularity value for the mapping.
The **pmem2_config_delete**() function frees *\*cfg* returned by **pmem2_config_new**() and sets *\*cfg* to NULL. The **pmem2_config_delete**() function frees *\*cfg* returned by **pmem2_config_new**() and sets *\*cfg* to NULL.
If *\*cfg* is NULL, no operation is performed. If *\*cfg* is NULL, no operation is performed.
......
...@@ -39,6 +39,7 @@ for details. The *\length* must be a multiple of the alignment required for the ...@@ -39,6 +39,7 @@ for details. The *\length* must be a multiple of the alignment required for the
source which will be used for mapping alongside the config. source which will be used for mapping alongside the config.
To retrieve the alignment required for specific instance of *pmem2_source** use To retrieve the alignment required for specific instance of *pmem2_source** use
**pmem2_source_alignment**(3). **pmem2_source_alignment**(3).
By default, the length is equal to the size of the file that is being mapped.
# RETURN VALUE # # RETURN VALUE #
......
...@@ -40,6 +40,7 @@ already initialized, please see **pmem2_config_new**(3) for details. The *\offse ...@@ -40,6 +40,7 @@ already initialized, please see **pmem2_config_new**(3) for details. The *\offse
must be a multiple of the alignment required for the config. The alignment must be a multiple of the alignment required for the config. The alignment
requirements are specific to a data source. To retrieve the alignment requirements are specific to a data source. To retrieve the alignment
required for specific instance of *pmem2_source** use **pmem2_source_alignment**(3). required for specific instance of *pmem2_source** use **pmem2_source_alignment**(3).
By default, the offset is 0.
# RETURN VALUE # # RETURN VALUE #
......
...@@ -43,9 +43,6 @@ should be used sparingly. Typically, the application should only ever use this ...@@ -43,9 +43,6 @@ should be used sparingly. Typically, the application should only ever use this
function as a precaution against hardware failures, e.g., in code that detects function as a precaution against hardware failures, e.g., in code that detects
silent data corruption caused by unsafe shutdown (see more in **libpmem2_unsafe_shutdown**(7)). silent data corruption caused by unsafe shutdown (see more in **libpmem2_unsafe_shutdown**(7)).
Applications should generally not assume the support for this functionality
in the platform, and not treat **PMEM2_E_NOSUPP** as a fatal error.
# RETURN VALUE # # RETURN VALUE #
The **pmem2_deep_flush**() function returns 0 on success The **pmem2_deep_flush**() function returns 0 on success
......
...@@ -41,29 +41,31 @@ The **pmem2_vm_reservation_new**() function creates a new blank mapping in the ...@@ -41,29 +41,31 @@ The **pmem2_vm_reservation_new**() function creates a new blank mapping in the
virtual address space of the calling process. Reservation serves as a placeholder virtual address space of the calling process. Reservation serves as a placeholder
of a given size on which sources can be mapped. of a given size on which sources can be mapped.
For the function to succeed, the *addr* must be either aligned to an appropriate allocation granularity, For the function to succeed, the *addr* must be either aligned to an appropriate
or be a NULL, the size has to be aligned to an appropraite allocation granularity. allocation granularity,
or **NULL**, the size has to be aligned to an appropraite allocation granularity.
If the **pmem2_vm_reservation_new**() succeeds in creating a reservation, it instantiates a new If the **pmem2_vm_reservation_new**() succeeds in creating a reservation, it instantiates a new
*struct pmem2_vm_reservation** object describing the reservation. The pointer to this object **struct pmem2_vm_reservation** object describing the reservation. The pointer to this object
is stored in the user-provided variable via the *rsv_ptr* pointer. If the function fails, an appropriate is stored in the user-provided variable via the *rsv_ptr* pointer. If the function
error value will be returned. For a list of possible return values please see [RETURN VALUE](#return-value) fails, an appropriate error value will be returned. For a list of possible return
values please see [RETURN VALUE](#return-value)
After instantiating an object via the **pmem2_vm_reservation_new**() function, it is necessary to After instantiating an object via the **pmem2_vm_reservation_new**() function, it
finalize it using the **pmem2_vm_reservation_delete**() function. may be disposed of using the **pmem2_vm_reservation_delete**() function.
The **pmem2_vm_reservation_delete**() function destroys the object describing the reservation and unmaps The **pmem2_vm_reservation_delete**() function destroys the object describing
virtual memory region the *struct pmem2_vm_reservation** had assigned during the initialization. the reservation and unmaps virtual memory region
the *struct pmem2_vm_reservation** had assigned during the initialization.
For the function to succeed, it is required that the reservation passed via the *rsv_ptr* pointer will not For the delete function to succeed, it is required that the reservation passed via
contain any mappings. the *rsv_ptr* pointer does not contain any mappings.
# RETURN VALUE # # RETURN VALUE #
The **pmem2_vm_reservation_new**() and **pmem2_vm_reservation_delete**() functions return 0 The **pmem2_vm_reservation_new**() and **pmem2_vm_reservation_delete**() functions return 0
on success or a negative error code on failure. on success or a negative error code on failure.
The function returns 0 on success or a negative error code on failure. The function returns 0 on success or a negative error code on failure.
# ERRORS # # ERRORS #
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment