[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