From: mvs Date: Mon, 29 Nov 2021 13:05:04 +0000 (+0000) Subject: Add and enable 'unconacc' test which provides multithreaded connect(2) X-Git-Url: http://artulab.com/gitweb/?a=commitdiff_plain;h=bbd06b5dbd4e7b676f897cf6ce9ab34b6aa382ab;p=openbsd Add and enable 'unconacc' test which provides multithreaded connect(2) and accept(2) calls on single unix(4) socket. ok bluhm@ --- diff --git a/regress/sys/kern/Makefile b/regress/sys/kern/Makefile index b3c3c0da71a..00daa065c97 100644 --- a/regress/sys/kern/Makefile +++ b/regress/sys/kern/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.94 2021/11/21 06:21:01 visa Exp $ +# $OpenBSD: Makefile,v 1.95 2021/11/29 13:05:04 mvs Exp $ SUBDIR+= __syscall SUBDIR+= accept access @@ -23,8 +23,8 @@ SUBDIR+= setuid .endif SUBDIR+= signal sosplice stackjmp stackpivot syscall syscall_segment SUBDIR+= sysvmsg sysvsem sysvshm -SUBDIR+= unalign undgram_conclose unfdpass unfdpassfail ungc unsendrecvthr -SUBDIR+= unixsock unveil unveil-unmount +SUBDIR+= unalign unconacc undgram_conclose unfdpass unfdpassfail ungc +SUBDIR+= unsendrecvthr unixsock unveil unveil-unmount SUBDIR+= wait install: diff --git a/regress/sys/kern/unconacc/Makefile b/regress/sys/kern/unconacc/Makefile new file mode 100644 index 00000000000..3ece45dbcbd --- /dev/null +++ b/regress/sys/kern/unconacc/Makefile @@ -0,0 +1,22 @@ +# $OpenBSD: Makefile,v 1.1 2021/11/29 13:05:04 mvs Exp $ + +# Copyright (c) 2021 Makkoveev Vitaliy +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +WARNINGS = yes + +PROG = unconacc +LDADD+= -lpthread + +.include diff --git a/regress/sys/kern/unconacc/unconacc.c b/regress/sys/kern/unconacc/unconacc.c new file mode 100644 index 00000000000..bfe5934c342 --- /dev/null +++ b/regress/sys/kern/unconacc/unconacc.c @@ -0,0 +1,184 @@ +/* $OpenBSD: unconacc.c,v 1.1 2021/11/29 13:05:04 mvs Exp $ */ + +/* + * Copyright (c) 2021 Vitaliy Makkoveev + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * Provide multithreaded connect(2) and accept(2) stress test on + * unix(4) socket. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static pthread_mutex_t therr_mtx = PTHREAD_MUTEX_INITIALIZER; + +static void +therr(int eval, const char *fmt, ...) +{ + va_list ap; + + pthread_mutex_lock(&therr_mtx); + + va_start(ap, fmt); + verr(eval, fmt, ap); + va_end(ap); +} + +static void +therrc(int eval, int code, const char *fmt, ...) +{ + va_list ap; + + pthread_mutex_lock(&therr_mtx); + + va_start(ap, fmt); + verrc(eval, code, fmt, ap); + va_end(ap); +} + +static void * +thr_acc(void *arg) +{ + int s = *(int *)arg; + + while (1) { + int n; + + if ((n = accept(s, NULL, NULL)) < 0) { + switch (errno) { + case EMFILE: + case ENFILE: + continue; + default: + therr(1, "accept"); + } + } + + close(n); + } + + return NULL; +} + +static void * +thr_conn(void *arg) +{ + struct sockaddr_un *sun = arg; + int s; + + while (1) { + if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { + switch (errno) { + case EMFILE: + case ENFILE: + case ENOBUFS: + continue; + default: + therr(1, "socket"); + } + } + + if (connect(s, (struct sockaddr *)sun, sizeof(*sun)) < 0) { + switch (errno) { + case ECONNREFUSED: + continue; + default: + therr(1, "connect"); + } + } + + close(s); + } + + return NULL; +} + +int +main(int argc, char *argv[]) +{ + struct timeval testtime = { + .tv_sec = 60, + .tv_usec = 0, + }; + struct timeval *tv = &testtime; + + struct sockaddr_un sun; + int s; + + int mib[2], ncpu; + size_t len; + + int i; + + if (argc == 2 && !strcmp(argv[1], "--infinite")) + tv = NULL; + + mib[0] = CTL_HW; + mib[1] = HW_NCPUONLINE; + len = sizeof(ncpu); + + if (sysctl(mib, 2, &ncpu, &len, NULL, 0) < 0) + err(1, "sysctl"); + if (ncpu <= 0) + errx(1, "Wrong number of CPUs online: %d", ncpu); + + memset(&sun, 0, sizeof(sun)); + sun.sun_len = sizeof(sun); + sun.sun_family = AF_UNIX; + snprintf(sun.sun_path, sizeof(sun.sun_path) - 1, + "/tmp/socket%d", getpid()); + + if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) + err(1, "socket"); + + unlink(sun.sun_path); + + if (bind(s, (struct sockaddr *)&sun, sizeof(sun)) < 0) + err(1, "bind"); + if (listen(s, 10) < 0) + err(1, "listen"); + + for (i = 0; i < (ncpu * 2); ++i) { + pthread_t thr; + int error; + + if ((error = pthread_create(&thr, NULL, thr_acc, &s))) + therrc(1, error, "pthread_create"); + } + + for (i = 0; i < (ncpu * 2); ++i) { + pthread_t thr; + int error; + + if ((error = pthread_create(&thr, NULL, thr_conn, &sun))) + therrc(1, error, "pthread_create"); + } + + select(0, NULL, NULL, NULL, tv); + + return 0; +}