[CRIU] [PATCHv4 2/2] zdtm: sysctl net.unix.max_dgram_qlen value preservation test

Pavel Tikhomirov ptikhomirov at virtuozzo.com
Fri Nov 1 18:07:55 MSK 2019



On 11/1/19 5:33 PM, Alexander Mikhalitsyn wrote:
> Test checks that if the /proc/sys/net/unix/max_dgram_qlen value has
> been changed in process net namespace, then it is saved after c/r.
> 
> Based-on-patch-by: Cyrill Gorcunov <gorcunov at gmail.com>
> Signed-off-by: Alexander Mikhalitsyn <alexander at mihalicyn.com>
> Signed-off-by: Alexander Mikhalitsyn <alexander.mikhalitsyn at virtuozzo.com>
> ---
>   test/zdtm/lib/Makefile                 |  2 +-
>   test/zdtm/lib/sysctl.c                 | 56 ++++++++++++++++++++++++++
>   test/zdtm/lib/sysctl.h                 |  7 ++++
>   test/zdtm/static/Makefile              |  1 +
>   test/zdtm/static/netns_sub_sysctl.c    | 52 ++++++++++++++++++++++++
>   test/zdtm/static/netns_sub_sysctl.desc |  4 ++
>   6 files changed, 121 insertions(+), 1 deletion(-)
>   create mode 100644 test/zdtm/lib/sysctl.c
>   create mode 100644 test/zdtm/lib/sysctl.h
>   create mode 100644 test/zdtm/static/netns_sub_sysctl.c
>   create mode 100644 test/zdtm/static/netns_sub_sysctl.desc
> 
> diff --git a/test/zdtm/lib/Makefile b/test/zdtm/lib/Makefile
> index d2d9f1cc..b87f36e8 100644
> --- a/test/zdtm/lib/Makefile
> +++ b/test/zdtm/lib/Makefile
> @@ -4,7 +4,7 @@ CFLAGS	+= $(USERCFLAGS)
>   
>   LIB	:= libzdtmtst.a
>   
> -LIBSRC	:= datagen.c msg.c parseargs.c test.c streamutil.c lock.c ns.c tcp.c fs.c
> +LIBSRC	:= datagen.c msg.c parseargs.c test.c streamutil.c lock.c ns.c tcp.c fs.c sysctl.c
>   LIBOBJ	:= $(LIBSRC:%.c=%.o)
>   
>   BIN	:= groups
> diff --git a/test/zdtm/lib/sysctl.c b/test/zdtm/lib/sysctl.c
> new file mode 100644
> index 00000000..47dcccb4
> --- /dev/null
> +++ b/test/zdtm/lib/sysctl.c
> @@ -0,0 +1,56 @@
> +#include <fcntl.h>
> +
> +#include "zdtmtst.h"
> +#include "sysctl.h"
> +
> +int sysctl_read_int(const char *name, int *data)
> +{
> +	int fd;
> +	int ret;
> +	char buf[32];
> +
> +	fd = open(name, O_RDONLY);
> +	if (fd < 0) {
> +		pr_perror("Can't open %s", name);
> +		return fd;
> +	}
> +
> +	ret = read(fd, buf, sizeof(buf) - 1);
> +	if (ret < 0) {
> +		pr_perror("Can't read %s", name);
> +		ret = -errno;
> +		goto err;
> +	}
> +
> +	buf[ret] = '\0';
> +
> +	*data = (int)strtoul(buf, NULL, 10);
> +	ret = 0;
> +err:
> +	close(fd);
> +	return ret;
> +}
> +
> +int sysctl_write_int(const char *name, int val)
> +{
> +	int fd;
> +	int ret;
> +	char buf[32];
> +
> +	fd = open(name, O_WRONLY);
> +	if (fd < 0) {
> +		pr_perror("Can't open %s", name);
> +		return fd;
> +	}
> +
> +	sprintf(buf, "%d\n", val);
> +
> +	ret = write(fd, buf, strlen(buf));
> +	if (ret < 0) {
> +		pr_perror("Can't write %d into %s", val, name);
> +		return -errno;

Need to close the fd here on error path, except for these:

Reviewed-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>

> +	}
> +
> +	close(fd);
> +	return 0;
> +}
> diff --git a/test/zdtm/lib/sysctl.h b/test/zdtm/lib/sysctl.h
> new file mode 100644
> index 00000000..67129102
> --- /dev/null
> +++ b/test/zdtm/lib/sysctl.h
> @@ -0,0 +1,7 @@
> +#ifndef __ZDTM_SYSCTL__
> +#define __ZDTM_SYSCTL__
> +
> +extern int sysctl_read_int(const char *name, int *data);
> +extern int sysctl_write_int(const char *name, int val);
> +
> +#endif
> diff --git a/test/zdtm/static/Makefile b/test/zdtm/static/Makefile
> index a38482f4..887bf4ac 100644
> --- a/test/zdtm/static/Makefile
> +++ b/test/zdtm/static/Makefile
> @@ -207,6 +207,7 @@ TST_NOFILE	:=				\
>   		pipe03				\
>   		netns_sub			\
>   		netns_sub_veth			\
> +		netns_sub_sysctl	\
>   		unlink_multiple_largefiles	\
>   		config_inotify_irmap		\
>   		thp_disable			\
> diff --git a/test/zdtm/static/netns_sub_sysctl.c b/test/zdtm/static/netns_sub_sysctl.c
> new file mode 100644
> index 00000000..bc6a1914
> --- /dev/null
> +++ b/test/zdtm/static/netns_sub_sysctl.c
> @@ -0,0 +1,52 @@
> +#include <sched.h>
> +
> +#include "zdtmtst.h"
> +#include "sysctl.h"
> +
> +const char *test_doc	= "Check dump and restore a net.unix.max_dgram_qlen sysctl parameter in subns";
> +
> +typedef struct {
> +	const char *path;
> +	int old;
> +	int new;
> +} sysctl_opt_t;
> +
> +#define CONF_UNIX_BASE	"/proc/sys/net/unix"
> +
> +static sysctl_opt_t net_unix_params[] = {
> +	{CONF_UNIX_BASE"/max_dgram_qlen", 0, 0},
> +	{NULL, 0, 0}
> +};
> +
> +int main(int argc, char **argv)
> +{
> +	sysctl_opt_t *p;
> +	test_init(argc, argv);
> +
> +	if (unshare(CLONE_NEWNET)) {
> +		perror("unshare");
> +		return 1;
> +	}
> +
> +	for (p = net_unix_params; p->path != NULL; p++) {
> +		p->old = (((unsigned)lrand48()) % 1023) + 1;
> +		if (sysctl_write_int(p->path, p->old)) {
> +			pr_perror("Can't change %s", p->path);
> +			return -1;
> +		}
> +	}
> +
> +	test_daemon();
> +	test_waitsig();
> +
> +	for (p = net_unix_params; p->path != NULL; p++) {
> +		sysctl_read_int(p->path, &p->new);
> +		if (p->old != p->new) {
> +			fail();
> +			return 1;
> +		}
> +	}
> +
> +	pass();
> +	return 0;
> +}
> diff --git a/test/zdtm/static/netns_sub_sysctl.desc b/test/zdtm/static/netns_sub_sysctl.desc
> new file mode 100644
> index 00000000..53584266
> --- /dev/null
> +++ b/test/zdtm/static/netns_sub_sysctl.desc
> @@ -0,0 +1,4 @@
> +{
> +    'flavor': 'ns',
> +    'flags': 'suid'
> +}
> 

-- 
Best regards, Tikhomirov Pavel
Software Developer, Virtuozzo.



More information about the CRIU mailing list