[CRIU] [PATCH 1/7] Adding --pre-dump-mode option

abhishek dubey dubeyabhishek777 at gmail.com
Mon Aug 26 06:39:56 MSK 2019


Hi Radostin,

On 25/08/19 3:01 PM, Radostin Stoyanov wrote:
> On 25/08/2019 02:58, Abhishek Dubey wrote:
>> There exists two modes of pre-dump algorithm:
>>      1) splicing memory by parasite
>>          --pre-dump-mode=splice (default)
>>      2) using process_vm_readv syscall
>>          --pre-dump-mode=read
>>
>> Signed-off-by: Abhishek Dubey <dubeyabhishek777 at gmail.com>
>> ---
>>   Documentation/criu.txt    |  6 ++++++
>>   criu/config.c             | 10 ++++++++++
>>   criu/cr-dump.c            |  6 +++++-
>>   criu/crtools.c            |  2 ++
>>   criu/include/cr_options.h |  7 +++++++
>>   criu/mem.c                | 13 ++++++++++++-
>>   test/zdtm.py              |  9 ++++++++-
>>   7 files changed, 50 insertions(+), 3 deletions(-)
> Please add pre_dump_mode in images/rpc.proto and lib/c/criu.c

Please verify changes:

https://github.com/dubeyabhishek/criu/commit/189e2b5f3c2486e8b3bb525ff3d0d3298a99b752

>
>
> This will enable the option to be used with RPC and libcriu.
>> diff --git a/Documentation/criu.txt b/Documentation/criu.txt
>> index 94fc542..674967f 100644
>> --- a/Documentation/criu.txt
>> +++ b/Documentation/criu.txt
>> @@ -156,6 +156,12 @@ In addition, *page-server* options may be 
>> specified.
>>       Turn on memory changes tracker in the kernel. If the option is
>>       not passed the memory tracker get turned on implicitly.
>>   +*--pre-dump-mode*='mode'::
>> +    There are two 'mode' to operate pre-dump algorithm. The 'splice' 
>> mode
>> +    is parasite based, whereas 'read' mode is based on process_vm_readv
>> +    syscall. The 'read' mode incurs reduced frozen time and reduced
>> +    memory pressure as compared to 'splice' mode. Default is 
>> 'splice' mode.
>> +
>>   *dump*
>>   ~~~~~~
>>   Performs a checkpoint procedure.
>> diff --git a/criu/config.c b/criu/config.c
>> index 3a54afd..3c65dc0 100644
>> --- a/criu/config.c
>> +++ b/criu/config.c
>> @@ -276,6 +276,7 @@ void init_opts(void)
>>       opts.empty_ns = 0;
>>       opts.status_fd = -1;
>>       opts.log_level = DEFAULT_LOGLEVEL;
>> +    opts.pre_dump_mode = PRE_DUMP_SPLICE;
>>   }
>>     bool deprecated_ok(char *what)
>> @@ -517,6 +518,7 @@ int parse_options(int argc, char **argv, bool 
>> *usage_error,
>>           { "tls-key",            required_argument,    0, 1095},
>>           BOOL_OPT("tls", &opts.tls),
>>           {"tls-no-cn-verify",        no_argument, 
>> &opts.tls_no_cn_verify, true},
>> +        { "pre-dump-mode",        required_argument,    0, 1097},
>>           { },
>>       };
>>   @@ -815,6 +817,14 @@ int parse_options(int argc, char **argv, bool 
>> *usage_error,
>>           case 1095:
>>               SET_CHAR_OPTS(tls_key, optarg);
>>               break;
>> +        case 1097:
>> +            if (!strcmp("read", optarg)) {
>> +                opts.pre_dump_mode = PRE_DUMP_READ;
>> +            } else if (strcmp("splice", optarg)) {
>> +                pr_err("Unable to parse value of --pre-dump-mode\n");
>> +                return 1;
>> +            }
>> +            break;
>>           case 'V':
>>               pr_msg("Version: %s\n", CRIU_VERSION);
>>               if (strcmp(CRIU_GITID, "0"))
>> diff --git a/criu/cr-dump.c b/criu/cr-dump.c
>> index e070b8b..a7ce1ce 100644
>> --- a/criu/cr-dump.c
>> +++ b/criu/cr-dump.c
>> @@ -1513,7 +1513,11 @@ static int cr_pre_dump_finish(int status)
>>               goto err;
>>             mem_pp = dmpi(item)->mem_pp;
>> -        ret = page_xfer_dump_pages(&xfer, mem_pp);
>> +
>> +        if (opts.pre_dump_mode == PRE_DUMP_READ)
>> +            ret = 0;  /* Call optimized pre-dump here */
>> +        else
>> +            ret = page_xfer_dump_pages(&xfer, mem_pp);
>>             xfer.close(&xfer);
>>   diff --git a/criu/crtools.c b/criu/crtools.c
>> index 97a6d6d..fc17d83 100644
>> --- a/criu/crtools.c
>> +++ b/criu/crtools.c
>> @@ -442,6 +442,8 @@ usage:
>>   "                        pages images of previous dump\n"
>>   "                        when used on restore, as soon as page is 
>> restored, it\n"
>>   "                        will be punched from the image\n"
>> +"  --pre-dump-mode       splice - parasite based pre-dumping 
>> (default)\n"
>> +"                        read   - process_vm_readv syscall based 
>> pre-dumping\n"
>>   "\n"
>>   "Page/Service server options:\n"
>>   "  --address ADDR        address of server or service\n"
>> diff --git a/criu/include/cr_options.h b/criu/include/cr_options.h
>> index c519c74..e50989f 100644
>> --- a/criu/include/cr_options.h
>> +++ b/criu/include/cr_options.h
>> @@ -39,6 +39,12 @@ struct cg_root_opt {
>>   };
>>     /*
>> + * Pre-dump variants
>> + */
>> +#define PRE_DUMP_SPLICE        1        /* Pre-dump using parasite */
>> +#define PRE_DUMP_READ            2        /* Pre-dump using 
>> process_vm_readv syscall */
>> +
>> +/*
>>    * Cgroup management options.
>>    */
>>   #define CG_MODE_IGNORE        (0u << 0)    /* Zero is important 
>> here */
>> @@ -81,6 +87,7 @@ struct cr_options {
>>       int            evasive_devices;
>>       int            link_remap_ok;
>>       int            log_file_per_pid;
>> +    int            pre_dump_mode;
>>       bool            swrk_restore;
>>       char            *output;
>>       char            *root;
>> diff --git a/criu/mem.c b/criu/mem.c
>> index de66a62..911b9d2 100644
>> --- a/criu/mem.c
>> +++ b/criu/mem.c
>> @@ -482,7 +482,18 @@ static int __parasite_dump_pages_seized(struct 
>> pstree_item *item,
>>       if (mdc->lazy)
>>           memcpy(pargs_iovs(args), pp->iovs,
>>                  sizeof(struct iovec) * pp->nr_iovs);
>> -    ret = drain_pages(pp, ctl, args);
>> +
>> +    /*
>> +     * Faking drain_pages for pre-dump here. Actual drain_pages for 
>> pre-dump
>> +     * will happen after task unfreezing in cr_pre_dump_finish(). 
>> This is
>> +     * actual optimization which reduces time for which process was 
>> frozen
>> +     * during pre-dump.
>> +     */
>> +    if (mdc->pre_dump && opts.pre_dump_mode == PRE_DUMP_READ)
>> +        ret = 0;
>> +    else
>> +        ret = drain_pages(pp, ctl, args);
>> +
>>       if (!ret && !mdc->pre_dump)
>>           ret = xfer_pages(pp, &xfer);
>>       if (ret)
>> diff --git a/test/zdtm.py b/test/zdtm.py
>> index 9b93a51..ca8b165 100755
>> --- a/test/zdtm.py
>> +++ b/test/zdtm.py
>> @@ -1020,6 +1020,7 @@ class criu:
>>           self.__tls = self.__tls_options() if opts['tls'] else []
>>           self.__criu_bin = opts['criu_bin']
>>           self.__crit_bin = opts['crit_bin']
>> +        self.__pre_dump_mode = opts['pre_dump_mode']
>>         def fini(self):
>>           if self.__lazy_migrate:
>> @@ -1276,6 +1277,8 @@ class criu:
>>               a_opts += ['--leave-stopped']
>>           if self.__empty_ns:
>>               a_opts += ['--empty-ns', 'net']
>> +        if self.__pre_dump_mode:
>> +            a_opts += ["--pre-dump-mode", "%s" % self.__pre_dump_mode]
>>             nowait = False
>>           if self.__lazy_migrate and action == "dump":
>> @@ -1865,7 +1868,7 @@ class Launcher:
>>                 'sat', 'script', 'rpc', 'lazy_pages', 'join_ns', 
>> 'dedup', 'sbs',
>>                 'freezecg', 'user', 'dry_run', 'noauto_dedup',
>>                 'remote_lazy_pages', 'show_stats', 'lazy_migrate', 
>> 'remote',
>> -              'tls', 'criu_bin', 'crit_bin')
>> +              'tls', 'criu_bin', 'crit_bin', 'pre_dump_mode')
>>           arg = repr((name, desc, flavor, {d: self.__opts[d] for d in 
>> nd}))
>>             if self.__use_log:
>> @@ -2512,6 +2515,10 @@ rp.add_argument("--criu-bin",
>>   rp.add_argument("--crit-bin",
>>                   help="Path to crit binary",
>>                   default='../crit/crit')
>> +rp.add_argument("--pre-dump-mode",
>> +                help="Use splice or read mode of pre-dumping",
>> +                choices=['splice', 'read'],
>> +                default='splice')
>>     lp = sp.add_parser("list", help="List tests")
>>   lp.set_defaults(action=list_tests)
>
-Abhishek


More information about the CRIU mailing list