[CRIU] [PATCH 12/12] cpuinfo: rpc -- Add CPUINFO_DUMP/CPUINFO_CHECK commands
Cyrill Gorcunov
gorcunov at openvz.org
Tue Sep 30 10:18:55 PDT 2014
Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
---
cr-service.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
protobuf/rpc.proto | 3 +++
2 files changed, 62 insertions(+)
diff --git a/cr-service.c b/cr-service.c
index 9b9f51e4a1c9..550a19dc0e81 100644
--- a/cr-service.c
+++ b/cr-service.c
@@ -17,6 +17,7 @@
#include "cr_options.h"
#include "util.h"
#include "log.h"
+#include "cpu.h"
#include "pstree.h"
#include "cr-service.h"
#include "cr-service-const.h"
@@ -600,10 +601,64 @@ static int chk_keepopen_req(CriuReq *msg)
if (msg->type == CRIU_REQ_TYPE__PAGE_SERVER)
/* This just fork()-s so no leaks */
return 0;
+ else if (msg->type == CRIU_REQ_TYPE__CPUINFO_DUMP ||
+ msg->type == CRIU_REQ_TYPE__CPUINFO_CHECK)
+ return 0;
return -1;
}
+static int handle_cpuinfo(int sk, CriuReq *msg)
+{
+ CriuResp resp = CRIU_RESP__INIT;
+ bool success = false;
+ int pid, status, ret;
+
+ pid = fork();
+ if (pid < 0) {
+ pr_perror("Can't fork");
+ goto out;
+ }
+
+ if (pid == 0) {
+ int ret = 1;
+
+ if (setup_opts_from_req(sk, msg->opts))
+ goto cout;
+
+ setproctitle("cpuinfo %s --rpc -D %s",
+ msg->type == CRIU_REQ_TYPE__CPUINFO_DUMP ?
+ "dump" : "check",
+ images_dir);
+
+ if (msg->type == CRIU_REQ_TYPE__CPUINFO_DUMP)
+ ret = cpuinfo_dump();
+ else
+ ret = cpuinfo_check();
+cout:
+ exit(ret);
+ }
+
+ wait(&status);
+ if (!WIFEXITED(status) || WEXITSTATUS(status))
+ goto out;
+
+ success = true;
+out:
+ resp.type = msg->type;
+ resp.success = success;
+
+ ret = send_criu_msg(sk, &resp);
+
+ if (success == false || ret || !msg->keep_open) {
+ criu_req__free_unpacked(msg, NULL);
+ msg->keep_open = false;
+ ret = -1;
+ }
+
+ return ret;
+}
+
int cr_service_work(int sk)
{
int ret = -1;
@@ -634,6 +689,10 @@ more:
case CRIU_REQ_TYPE__PAGE_SERVER:
ret = start_page_server_req(sk, msg->opts);
break;
+ case CRIU_REQ_TYPE__CPUINFO_DUMP:
+ case CRIU_REQ_TYPE__CPUINFO_CHECK:
+ ret = handle_cpuinfo(sk, msg);
+ break;
default:
send_criu_err(sk, "Invalid req");
diff --git a/protobuf/rpc.proto b/protobuf/rpc.proto
index 4617e7bc3ab1..d511512c5696 100644
--- a/protobuf/rpc.proto
+++ b/protobuf/rpc.proto
@@ -79,6 +79,9 @@ enum criu_req_type {
PAGE_SERVER = 5;
NOTIFY = 6;
+
+ CPUINFO_DUMP = 7;
+ CPUINFO_CHECK = 8;
}
/*
--
1.9.3
More information about the CRIU
mailing list