[CRIU] [PATCHv0 1/3] cgroups: save freezer state during dump

Andrew Vagin avagin at virtuozzo.com
Thu Nov 26 04:54:52 PST 2015


On Tue, Nov 24, 2015 at 04:34:12PM +0300, Eugene Batalov wrote:
> From: Evgeniy Akimov <geka666 at gmail.com>
> 
> CRIU sets freezer.state to "THAWED" during process tree dumping. That's why
> we can't simply save freezer.state file contents to cgroups image. New
> special function get_real_freezer_state() returns freezer cgroup state
> observed before CRIU dumping start. Patch puts its return value to dump file.
> 
> Signed-off-by: Evgeniy Akimov <geka666 at gmail.com>
> Signed-off-by: Eugene Batalov <eabatalov89 at gmail.com>
> ---
>  cgroup.c              | 10 ++++++++++
>  include/seize.h       |  1 +
>  protobuf/cgroup.proto |  1 +
>  seize.c               |  5 +++++
>  4 files changed, 17 insertions(+)
> 
> diff --git a/cgroup.c b/cgroup.c
> index 7d8f1be..c6718f9 100644
> --- a/cgroup.c
> +++ b/cgroup.c
> @@ -17,6 +17,7 @@
>  #include "imgset.h"
>  #include "util-pie.h"
>  #include "namespaces.h"
> +#include "seize.h"
>  #include "protobuf.h"
>  #include "protobuf/core.pb-c.h"
>  #include "protobuf/cgroup.pb-c.h"
> @@ -788,6 +789,14 @@ static int dump_sets(CgroupEntry *cg)
>  	return 0;
>  }
>  
> +static void dump_real_freezer_state(CgroupEntry *cg)
> +{
> +	if (opts.freeze_cgroup) {
> +		cg->freezer_state = xstrdup(get_real_freezer_state());
> +	}
> +}
> +
> +
>  int dump_cgroups(void)
>  {
>  	CgroupEntry cg = CGROUP_ENTRY__INIT;
> @@ -816,6 +825,7 @@ int dump_cgroups(void)
>  		return -1;
>  	if (dump_controllers(&cg))
>  		return -1;
> +	dump_real_freezer_state(&cg);
>  
>  	pr_info("Writing CG image\n");
>  	return pb_write_one(img_from_set(glob_imgset, CR_FD_CGROUP), &cg, PB_CGROUP);
> diff --git a/include/seize.h b/include/seize.h
> index 3c23e24..315fab2 100644
> --- a/include/seize.h
> +++ b/include/seize.h
> @@ -3,5 +3,6 @@
>  
>  extern int collect_pstree(pid_t pid);
>  extern void pstree_switch_state(struct pstree_item *root_item, int st);
> +extern const char *get_real_freezer_state(void);
>  
>  #endif
> diff --git a/protobuf/cgroup.proto b/protobuf/cgroup.proto
> index 2084388..97b70a1 100644
> --- a/protobuf/cgroup.proto
> +++ b/protobuf/cgroup.proto
> @@ -27,4 +27,5 @@ message cg_set_entry {
>  message cgroup_entry {
>  	repeated cg_set_entry		sets		= 1;
>  	repeated cg_controller_entry	controllers	= 2;
> +	optional string			freezer_state	= 3;

It it posiable to save freezer_state as cgroup_prop_entry like we do for
other cgroup properties.

>  }
> diff --git a/seize.c b/seize.c
> index 11b5ad8..744e0ea 100644
> --- a/seize.c
> +++ b/seize.c
> @@ -55,6 +55,11 @@ err:
>  
>  static bool freezer_thawed;
>  
> +const char *get_real_freezer_state(void)
> +{
> +	return freezer_thawed ? thawed : frozen;
> +}
> +
>  static int freezer_restore_state(void)
>  {
>  	int fd;
> -- 
> 1.9.1
> 
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu


More information about the CRIU mailing list