[CRIU] [PATCH 11/19] compel: plugins -- Add shmem plugin

Cyrill Gorcunov gorcunov at openvz.org
Wed Sep 21 13:54:26 PDT 2016


From: Dmitry Safonov <dsafonov at virtuozzo.com>

Signed-off-by: Dmitry Safonov <dsafonov at virtuozzo.com>
---
 compel/include/shmem.h                     | 10 ++++++++
 compel/plugins/Makefile                    |  7 ++++++
 compel/plugins/include/std-priv.h          |  6 +++++
 compel/plugins/include/uapi/plugin-shmem.h | 17 +++++++++++++
 compel/plugins/shmem/shmem.c               | 38 ++++++++++++++++++++++++++++++
 5 files changed, 78 insertions(+)
 create mode 100644 compel/include/shmem.h
 create mode 100644 compel/plugins/include/std-priv.h
 create mode 100644 compel/plugins/include/uapi/plugin-shmem.h
 create mode 100644 compel/plugins/shmem/shmem.c

diff --git a/compel/include/shmem.h b/compel/include/shmem.h
new file mode 100644
index 000000000000..b6f994617e75
--- /dev/null
+++ b/compel/include/shmem.h
@@ -0,0 +1,10 @@
+#ifndef __COMPEL_PLUGIN_SHMEM_PRIV_H__
+#define __COMPEL_PLUGIN_SHMEM_PRIV_H__
+
+struct shmem_plugin_msg {
+	unsigned long start;
+	unsigned long len;
+};
+
+#endif /* __COMPEL_PLUGIN_SHMEM_PRIV_H__ */
+
diff --git a/compel/plugins/Makefile b/compel/plugins/Makefile
index 3743f3a9ca29..9480264bdd57 100644
--- a/compel/plugins/Makefile
+++ b/compel/plugins/Makefile
@@ -2,6 +2,9 @@
 
 ARCH_DIR		:= compel/arch/$(ARCH)/plugins
 
+#
+# CFLAGS, ASFLAGS, LDFLAGS
+
 # General compel includes
 ccflags-y		+= -iquote $(SRC_DIR)/compel/include
 
@@ -20,6 +23,10 @@ asflags-y		+= -iquote $(SRC_DIR)/$(ARCH_DIR)
 asflags-y		+= -Wstrict-prototypes -Wa,--noexecstack
 asflags-y		+= -D__ASSEMBLY__ -nostdlib -fomit-frame-pointer
 
+#
+# Shmem plugin
+target			+= shmem
+shmem-obj-y		+= shmem/shmem.o
 
 #
 # STD plugin
diff --git a/compel/plugins/include/std-priv.h b/compel/plugins/include/std-priv.h
new file mode 100644
index 000000000000..3fc3041c036f
--- /dev/null
+++ b/compel/plugins/include/std-priv.h
@@ -0,0 +1,6 @@
+#ifndef __COMPEL_PLUGIN_STD_PRIV_H__
+#define __COMPEL_PLUGIN_STD_PRIV_H__
+
+extern int std_ctl_sock(void);
+
+#endif /* __COMPEL_PLUGIN_STD_PRIV_H__ */
diff --git a/compel/plugins/include/uapi/plugin-shmem.h b/compel/plugins/include/uapi/plugin-shmem.h
new file mode 100644
index 000000000000..7e5850953a6b
--- /dev/null
+++ b/compel/plugins/include/uapi/plugin-shmem.h
@@ -0,0 +1,17 @@
+#ifndef __COMPEL_PLUGIN_SHMEM_H__
+#define __COMPEL_PLUGIN_SHMEM_H__
+
+/*
+ * Creates local shmem mapping and announces it
+ * to the peer. Peer can later "receive" one. The
+ * local area should be munmap()-ed at the end.
+ */
+extern void *shmem_create(unsigned long size);
+/*
+ * "Receives" shmem from peer and maps it. The
+ * locally mapped area should be munmap()-ed at
+ * the end
+ */
+extern void *shmem_receive(unsigned long *size);
+
+#endif /* __COMPEL_PLUGIN_SHMEM_H__ */
diff --git a/compel/plugins/shmem/shmem.c b/compel/plugins/shmem/shmem.c
new file mode 100644
index 000000000000..9ded93fb3e3d
--- /dev/null
+++ b/compel/plugins/shmem/shmem.c
@@ -0,0 +1,38 @@
+#include <sys/mman.h>
+
+#include "uapi/plugins.h"
+#include "uapi/plugin-shmem.h"
+#include "uapi/std/syscall.h"
+#include "shmem.h"
+#include "std-priv.h"
+
+void *shmem_create(unsigned long size)
+{
+	int ret;
+	void *mem;
+	struct shmem_plugin_msg spi;
+
+	mem = (void *)sys_mmap(NULL, size, PROT_READ | PROT_WRITE,
+			MAP_SHARED | MAP_ANON, 0, 0);
+	if (mem == MAP_FAILED)
+		return NULL;
+
+	spi.start = (unsigned long)mem;
+	spi.len = size;
+
+	ret = sys_write(std_ctl_sock(), &spi, sizeof(spi));
+	if (ret != sizeof(spi)) {
+		sys_munmap(mem, size);
+		return NULL;
+	}
+
+	return mem;
+}
+
+void *shmem_receive(unsigned long *size)
+{
+	/* master -> parasite not implemented yet */
+	return NULL;
+}
+
+PLUGIN_REGISTER_DUMMY(shmem)
-- 
2.7.4



More information about the CRIU mailing list