[CRIU] [PATCH] shm: Do not dump sysvshm twice

Pavel Emelyanov xemul at virtuozzo.com
Fri Mar 31 08:49:59 PDT 2017


The contents of sysvshm areas is sometimes dumped twice.

First time it goes via cr_dump_shmem(), since each attachment
of the segment is noted by the add_shmem_area() and thus
gets into the list scanned by the former call().

Second time it is dumped by dump_ipc_shm_pages().

Another thing is that in the 1st dump memory gets into the
standard pagemap/pages image pair, while in the 2nd time
it's all written as plain byte array into ipcns-shm.img.

At restore contents is read from the ipcns-shm.img (2nd).

While the first way is preferred, let's (temporarily)
eliminate it. Historically these segments were dumped and
restored the 2nd way.

Signed-off-by: Pavel Emelyanov <xemul at virtuozzo.com>

---
 criu/shmem.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/criu/shmem.c b/criu/shmem.c
index 21a9d8b..862af40 100644
--- a/criu/shmem.c
+++ b/criu/shmem.c
@@ -589,6 +589,9 @@ int add_shmem_area(pid_t pid, VmaEntry *vma, u64 *map)
 	struct shmem_info *si;
 	unsigned long size = vma->pgoff + (vma->end - vma->start);
 
+	if (vma_entry_is(vma, VMA_AREA_SYSVIPC))
+		pid = SYSVIPC_SHMEM_PID;
+
 	si = shmem_find(vma->shmid);
 	if (si) {
 		if (si->size < size) {
@@ -749,6 +752,8 @@ int cr_dump_shmem(void)
 	struct shmem_info *si;
 
 	for_each_shmem(i, si) {
+		if (si->pid == SYSVIPC_SHMEM_PID)
+			continue;
 		ret = dump_one_shmem(si);
 		if (ret)
 			goto out;
-- 
2.5.5


More information about the CRIU mailing list