Line 1:
Line 1:
+
This articles describes some intricacies of handling shared memory mappings, i.e. mappings that are shared between a few processes.
+
+
== Checkpoint ==
+
+
Every process has one or more mmaped files. Some mappings (for example, ones of shared libraries)
+
are shared between a few processes. During the checkpointing, CRIU need to figure out
+
all the mappings that are shared in order to dump them as such.
+
+
It does so by performing <code>fstatat()</code> for each entry in <code>/proc/$PID/map_files/</code>,
+
noting the ''device'' and ''inode'' fields of the structure returned by fstatat(). This information
+
is collected and sorted. Now, if any few processes have a mapping with same ''device'' and ''inode'',
+
this mapping is a shared one and should be dumped as such.
+
+
== Restore ==
+
+
Upon restore, CRIU already knows which mappings are shared, and the trick is to restore them as such.
+
For that, two different approaches are used, depending on the availability.
+
+
The common part is, between the processes sharing a mapping, the one with the lowest PID
+
among the group performs the actual <code>mmap()</code>, while all the others wait
+
for the mapping to appear and, once it's available, use it.
+
+
=== memfd ===
+
+
Linux kernel v3.17 adds a [http://man7.org/linux/man-pages/man2/memfd_create.2.html memfd_create()]
+
syscall. CRIU restore checks if it is available from the running kernel; it yes, it is used.
+
+
FIXME how
+
+
=== /proc/$PID/map_files/ ===
+
+
This method is used if memfd is not available. The limitation is, /proc/$PID/map_files/ is not available
+
for users inside user namespaces (due to security concerns), so it's not possible to use it if there
+
are any user namespaces in the dump.
+
+
FIXME how
+
+
===
+
[[Category:Memory]]
[[Category:Memory]]
[[Category:Under the hood]]
[[Category:Under the hood]]
[[Category:Empty articles]]
[[Category:Empty articles]]