[CRIU] [PATCH] check/zdtm: Introduce fine-grained feature testing
Andrew Vagin
avagin at parallels.com
Thu Jan 15 01:46:16 PST 2015
On Tue, Jan 13, 2015 at 09:17:54PM +0300, Pavel Emelyanov wrote:
> Right now we state that CRIU works on 3.11 and above kernels and, at the
> same time, have support for a couple of new features like aio, tun, timerfd
> etc. available in later kernels. Since these new features do not break
> generic operations we do not require them in the kernel strictly.
>
> However, in the zdtm tests it's very important to know exactly what can
> and what cannot be tested. Right now this is done in a tough manner -- if
> the kernel is not 3.11 or criu check fails for _any_ reason we treat the
> kernel as being "bad" and throw out a set of tests.
>
> I propose to test some individual features and form the list of tests
> in a more fine-grained manner.
>
> This patch only fixes the AIO, mnt_id, tun and posix-timers tests. Next
> I will add checks and fixes for user-namespaces tests.
Acked-by: Andrew Vagin <avagin at parallels.com>
Thanks.
>
> Signed-off-by: Pavel Emelyanov <xemul at parallels.com>
> ---
> cr-check.c | 39 ++++++++++++++++++++++++++++++++++++++-
> crtools.c | 5 +++++
> include/crtools.h | 1 +
> include/tun.h | 2 +-
> test/zdtm.sh | 43 ++++++++++++++++++++++++++++++++++---------
> tun.c | 4 ++--
> 6 files changed, 81 insertions(+), 13 deletions(-)
>
> diff --git a/cr-check.c b/cr-check.c
> index 0c4dcf4..51d25ae 100644
> --- a/cr-check.c
> +++ b/cr-check.c
> @@ -675,6 +675,8 @@ static int check_aio_remap(void)
> return 0;
> }
>
> +static int (*chk_feature)(void);
> +
> int cr_check(void)
> {
> struct ns_id ns = { .pid = getpid(), .nd = &mnt_ns_desc };
> @@ -700,6 +702,11 @@ int cr_check(void)
> if (mntinfo == NULL)
> return -1;
>
> + if (chk_feature) {
> + ret = chk_feature();
> + goto out;
> + }
> +
> ret |= check_map_files();
> ret |= check_sock_diag();
> ret |= check_ns_last_pid();
> @@ -718,13 +725,43 @@ int cr_check(void)
> ret |= check_ptrace_peeksiginfo();
> ret |= check_mem_dirty_track();
> ret |= check_posix_timers();
> - ret |= check_tun();
> + ret |= check_tun_cr(0);
> ret |= check_timerfd();
> ret |= check_mnt_id();
> ret |= check_aio_remap();
>
> +out:
> if (!ret)
> pr_msg("Looks good.\n");
>
> return ret;
> }
> +
> +static int check_tun(void)
> +{
> + /*
> + * In case there's no TUN support at all we
> + * should report error. Unlike this plain criu
> + * check would report "Looks good" in this case
> + * since C/R effectively works, just not for TUN.
> + */
> + return check_tun_cr(-1);
> +}
> +
> +int check_add_feature(char *feat)
> +{
> + if (!strcmp(feat, "mnt_id"))
> + chk_feature = check_mnt_id;
> + else if (!strcmp(feat, "aio_remap"))
> + chk_feature = check_aio_remap;
> + else if (!strcmp(feat, "timerfd"))
> + chk_feature = check_timerfd;
> + else if (!strcmp(feat, "tun"))
> + chk_feature = check_tun;
> + else {
> + pr_err("Unknown feature %s\n", feat);
> + return -1;
> + }
> +
> + return 0;
> +}
> diff --git a/crtools.c b/crtools.c
> index 3cc4954..e235faa 100644
> --- a/crtools.c
> +++ b/crtools.c
> @@ -191,6 +191,7 @@ int main(int argc, char *argv[], char *envp[])
> { "manage-cgroups", no_argument, 0, 1060},
> { "cgroup-root", required_argument, 0, 1061},
> { "inherit-fd", required_argument, 0, 1062},
> + { "feature", required_argument, 0, 1063},
> { },
> };
>
> @@ -400,6 +401,10 @@ int main(int argc, char *argv[], char *envp[])
> if (inherit_fd_add(optarg) < 0)
> return 1;
> break;
> + case 1063:
> + if (check_add_feature(optarg) < 0)
> + return 1;
> + break;
> case 'M':
> {
> char *aux;
> diff --git a/include/crtools.h b/include/crtools.h
> index f4b09a3..176e8b3 100644
> --- a/include/crtools.h
> +++ b/include/crtools.h
> @@ -30,5 +30,6 @@ extern bool may_dump(struct proc_status_creds *);
> struct _CredsEntry;
> extern bool may_restore(struct _CredsEntry *);
> extern bool cr_user_is_root(void);
> +extern int check_add_feature(char *arg);
>
> #endif /* __CR_CRTOOLS_H__ */
> diff --git a/include/tun.h b/include/tun.h
> index 5dbabec..d70f8f2 100644
> --- a/include/tun.h
> +++ b/include/tun.h
> @@ -11,6 +11,6 @@ extern const struct fdtype_ops tunfile_dump_ops;
> extern int dump_tun_link(NetDeviceEntry *nde, struct cr_imgset *fds);
> extern int restore_one_tun(NetDeviceEntry *nde, int nlsk);
> extern struct collect_image_info tunfile_cinfo;
> -extern int check_tun(void);
> +extern int check_tun_cr(int no_tun_err);
>
> #endif /* __CR_TUN_H__ */
> diff --git a/test/zdtm.sh b/test/zdtm.sh
> index e212ee6..d8933b6 100755
> --- a/test/zdtm.sh
> +++ b/test/zdtm.sh
> @@ -11,6 +11,8 @@ ARCH=`uname -m | sed \
>
> ZP="zdtm/live"
>
> +source $(readlink -f `dirname $0`/env.sh) || exit 1
> +
> TEST_LIST="
> static/pipe00
> static/pipe01
> @@ -178,7 +180,6 @@ static/shm
> static/msgque
> static/sem
> transition/ipc
> -ns/static/tun
> static/netns-nf
> static/netns
> static/cgroup00
> @@ -189,14 +190,9 @@ static/remap_dead_pid
> "
>
> TEST_CR_KERNEL="
> -ns/static/tun
> -static/timerfd
> -static/aio00
> "
>
> -cat /proc/self/fdinfo/1 | grep -q mnt_id
> -if [ $? -eq 0 ]; then
> - TEST_LIST="$TEST_LIST
> +TEST_MNTNS="
> ns/static/mntns_open
> ns/static/mntns_link_remap
> ns/static/mntns_link_ghost
> @@ -204,10 +200,41 @@ ns/static/mntns_shared_bind
> ns/static/mntns_shared_bind02
> ns/static/mntns_root_bind
> "
> +
> +TEST_AIO="
> +static/aio00
> +"
> +
> +TEST_TIMERFD="
> +static/timerfd
> +"
> +
> +TEST_TUN="
> +ns/static/tun
> +"
> +
> +$CRIU check --feature "mnt_id"
> +if [ $? -eq 0 ]; then
> + TEST_LIST="$TEST_LIST$TEST_MNTNS"
> else
> export ZDTM_NOSUBNS=1
> fi
>
> +$CRIU check --feature "aio_remap"
> +if [ $? -eq 0 ]; then
> + TEST_LIST="$TEST_LIST$TEST_AIO"
> +fi
> +
> +$CRIU check --feature "timerfd"
> +if [ $? -eq 0 ]; then
> + TEST_LIST="$TEST_LIST$TEST_TIMERFD"
> +fi
> +
> +$CRIU check --feature "tun"
> +if [ $? -eq 0 ]; then
> + TEST_LIST="$TEST_LIST$TEST_TUN"
> +fi
> +
> BLACKLIST_FOR_USERNS="
> ns/static/maps01
> ns/static/mlock_setuid
> @@ -257,8 +284,6 @@ ns/static/mntns_shared_bind02
> ns/static/mntns_root_bind
> "
>
> -source $(readlink -f `dirname $0`/env.sh) || exit 1
> -
> can_cr_userns() {
> [ ! -f /proc/self/ns/user ] && return 1
> $CRIU check | fgrep -q 'PR_SET_MM_MAP is not supported' && return 1
> diff --git a/tun.c b/tun.c
> index 389a66c..0f860a9 100644
> --- a/tun.c
> +++ b/tun.c
> @@ -50,7 +50,7 @@
>
> #define TUN_DEV_GEN_PATH "/dev/net/tun"
>
> -int check_tun(void)
> +int check_tun_cr(int no_tun_err)
> {
> int fd, idx = 13, ret;
>
> @@ -62,7 +62,7 @@ int check_tun(void)
> fd = open(TUN_DEV_GEN_PATH, O_RDWR);
> if (fd < 0) {
> pr_perror("Can't check tun support");
> - return 0;
> + return no_tun_err;
> }
>
> ret = ioctl(fd, TUNSETIFINDEX, &idx);
> --
> 1.8.4.2
>
More information about the CRIU
mailing list