[CRIU] [PATCH 08/22] parasite: Prepare structures for daemon mode
Andrew Vagin
avagin at gmail.com
Wed May 15 10:11:39 EDT 2013
On Wed, May 08, 2013 at 05:28:35PM +0400, Andrey Vagin wrote:
> From: Cyrill Gorcunov <gorcunov at openvz.org>
>
> Parasite daemon mode might be considered as a series
> of network messages sent from main crtools module to
> parasite daemon which spins on a socket waiting for
> command to handle.
>
> Simple command handling session might look as
>
> crtools daemon
> | | |
> | ---> command message ---> | |
> | | ---> receive command ---> |
> | | .... |
> | | handle command |
> | | .... |
> | | <--- send ack <--- |
> | <--- receive ack <--- | |
> | | |
> v v v
> time
>
> where, in case of multithread application [handle command] stage
> includes waking up of children threads via futexes, wait until
> handling complete and only then send ack back to ctrools module.
>
> This patch brings in description of command message as
>
> struct ctl_msg {
> unsigned int id; /* command recipient */
> unsigned int cmd; /* command itself */
> unsigned int ack; /* ack on command */
> int err; /* error code on reply */
> };
>
> For example, in case of dumpee being with pid 2 and acquiring
> to handle PARASITE_CMD_DUMP_MISC, the command/ack series will look
> as
>
> cmd-msg
> -------
> .id = 2,
> .cmd = PARASITE_CMD_DUMP_MISC,
> .ack = 0,
> .err = 0,
>
> ack-msg
> -------
> .id = 2,
> .cmd = PARASITE_CMD_DUMP_MISC,
> .ack = PARASITE_CMD_DUMP_MISC,
> .err = 0
>
> in case if error happened in parasite, the @err field set accordingly.
>
> For convenience ctl_msg_cmd()/ctl_msg_ack() macros are provided
> for control message generations.
>
> Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
> Signed-off-by: Andrey Vagin <avagin at openvz.org>
> ---
> include/parasite.h | 23 +++++++++++++++++++++++
> pie/parasite.c | 6 ++++++
> 2 files changed, 29 insertions(+)
>
> diff --git a/include/parasite.h b/include/parasite.h
> index 72a4b40..421dad3 100644
> --- a/include/parasite.h
> +++ b/include/parasite.h
> @@ -18,8 +18,18 @@
> #define __head __used __section(.head.text)
>
> enum {
> + PARASITE_CMD_IDLE = 0,
> + PARASITE_CMD_ACK,
> +
> PARASITE_CMD_INIT,
> PARASITE_CMD_INIT_THREAD,
> +
> + /*
> + * These two must be greater than INITs.
> + */
> + PARASITE_CMD_DAEMONIZE,
> + PARASITE_CMD_DAEMONIZED,
Looks like PARASITE_CMD_DAEMONIZED is not required.
> +
> PARASITE_CMD_CFG_LOG,
> PARASITE_CMD_FINI,
> PARASITE_CMD_FINI_THREAD,
> @@ -39,6 +49,19 @@ enum {
> PARASITE_CMD_MAX,
> };
>
> +struct ctl_msg {
> + unsigned int id; /* command recipient */
> + unsigned int cmd; /* command itself */
> + unsigned int ack; /* ack on command */
> + int err; /* error code on reply */
> +};
> +
> +#define ctl_msg_cmd(_id, _cmd) \
> + (struct ctl_msg){ .id = _id, .cmd = _cmd, }
> +
> +#define ctl_msg_ack(_id, _cmd, _err) \
> + (struct ctl_msg){ .id = _id, .cmd = _cmd, .ack = _cmd, .err = _err, }
> +
> struct parasite_init_args {
> int h_addr_len;
> struct sockaddr_un h_addr;
> diff --git a/pie/parasite.c b/pie/parasite.c
> index 82a4c3d..972d9a5 100644
> --- a/pie/parasite.c
> +++ b/pie/parasite.c
> @@ -8,6 +8,7 @@
>
> #include "syscall.h"
> #include "parasite.h"
> +#include "lock.h"
> #include "log.h"
>
> #include <string.h>
> @@ -19,6 +20,11 @@ static int tsock = -1;
> static struct tid_state_s {
> pid_t real;
> pid_t tid;
> +
> + futex_t cmd;
> + futex_t ack;
> + int ret;
> +
> bool use_sig_blocked;
> k_rtsigset_t sig_blocked;
> void *next;
> --
> 1.8.2
>
More information about the CRIU
mailing list