svn commit: r333634 - user/pho/stress2/misc

Rodney W. Grimes freebsd at pdx.rh.CN85.dnsmgr.net
Tue May 15 16:45:38 UTC 2018


> Author: pho
> Date: Tue May 15 15:56:52 2018
> New Revision: 333634
> URL: https://svnweb.freebsd.org/changeset/base/333634
> 
> Log:
>   Added a new socketpair() test scenario.
>   
>   PR:		227285
>   Obtained from:	jan.kokemueller at gmail.com
> 
> Added:
>   user/pho/stress2/misc/socketpair3.sh   (contents, props changed)
> 
> Added: user/pho/stress2/misc/socketpair3.sh
> ==============================================================================
> --- /dev/null	00:00:00 1970	(empty, because file is newly added)
> +++ user/pho/stress2/misc/socketpair3.sh	Tue May 15 15:56:52 2018	(r333634)
> @@ -0,0 +1,144 @@
> +#!/bin/sh
> +

No copyright or license text at all?   

> +# Bug 227285 - File descriptor passing does not work reliably on SMP system
> +# (cache coherency issue?)
> +
> +# Original test scenario by: jan.kokemueller at gmail.com
> +
> +# $FreeBSD$
> +
> +# Page fault seen in WiP socket code.
> +
> +. ../default.cfg
> +dir=/tmp
> +odir=`pwd`
> +cd $dir
> +sed '1,/^EOF/d' < $odir/$0 > $dir/socketpair3.c
> +mycc -o socketpair3 -Wall -Wextra -O0 -g socketpair3.c -lnv || exit 1
> +rm -f socketpair3.c
> +cd $odir
> +
> +for i in `jot 3`; do
> +	$dir/socketpair3 &
> +	pids="$pids $!"
> +done
> +s=0
> +for i in $pids; do
> +	wait $i
> +	[ $? -ne 0 ] && s=1
> +done
> +[ -f socketpair3.core -a $s -eq 0 ] &&
> +    { ls -l socketpair3.core; mv socketpair3.core /tmp; s=1; }
> +
> +rm -rf $dir/socketpair3
> +exit $s
> +
> +EOF
> +#include <sys/types.h>
> +
> +#include <sys/procdesc.h>
> +#include <sys/socket.h>
> +#include <sys/wait.h>
> +
> +#include <err.h>
> +#include <poll.h>
> +#include <signal.h>
> +#include <stdio.h>
> +#include <string.h>
> +#include <time.h>
> +#include <unistd.h>
> +
> +// From libnv.
> +extern int fd_send(int sock, const int *fds, size_t nfds);
> +extern int fd_recv(int sock, int *fds, size_t nfds);
> +
> +int main(void)
> +{
> +	pid_t pid;
> +	time_t start;
> +	int child_fd;
> +	int sock[2];
> +
> +	start = time(NULL);
> +	while (time(NULL) - start < 60) {
> +		if (socketpair(PF_UNIX, SOCK_STREAM, 0, sock) < 0)
> +			err(1, "socketpair");
> +
> +		pid = pdfork(&child_fd, PD_CLOEXEC);
> +		if (pid < 0)
> +			err(1, "pdfork");
> +
> +		if (pid == 0) {
> +			ssize_t ret;
> +			int sock_child[2];
> +			int dummy = 0;
> +
> +			close(sock[0]);
> +			if (socketpair(PF_UNIX, SOCK_STREAM, /**/
> +			    0, sock_child) < 0)
> +				err(1, "socketpair");
> +
> +			if (fd_send(sock[1], &sock_child[0], 1) != 0)
> +				errx(1, "fd_send failed");
> +#ifdef WORKAROUND
> +			if (read(sock[1], &dummy, 1) != 1)
> +				err(1, "write");
> +#endif
> +
> +			close(sock_child[0]);
> +
> +			if (write(sock_child[1], &dummy, 1) != 1)
> +				err(1, "write");
> +
> +			if ((ret = read(sock_child[1], &dummy, 1)) != 1)
> +				errx(1, "read failed in child: %d",
> +				    (int)ret);
> +
> +			close(sock_child[1]);
> +
> +			_exit(0);
> +		}
> +
> +		close(sock[1]);
> +
> +		int sock_child;
> +		uint8_t dummy;
> +
> +		if (fd_recv(sock[0], &sock_child, 1) != 0)
> +			errx(1, "fd_recv failed");
> +#ifdef WORKAROUND
> +		if (write(sock[0], &dummy, 1) != 1)
> +			err(1, "write");
> +#endif
> +
> +		ssize_t ret;
> +		if ((ret = read(sock_child, &dummy, 1)) != 1) {
> +			int error;
> +			socklen_t err_len = sizeof(error);
> +
> +			if (getsockopt(sock_child, SOL_SOCKET, SO_ERROR,
> +			    &error, &err_len) < 0)
> +				err(1, "getsockopt");
> +
> +			ssize_t ret2 = read(sock_child, &dummy, 1);
> +
> +			errx(1,
> +			    "read failed in parent: %d, so_error: %s (%d), "
> +			    "ret2: %d", (int)ret, strerror(error), error,
> +			    (int)ret2);
> +		}
> +
> +		if (write(sock_child, &dummy, 1) != 1)
> +			err(1, "write");
> +
> +		close(sock_child);
> +
> +		struct pollfd pfd = { .fd = child_fd };
> +		poll(&pfd, 1, -1);
> +
> +		close(child_fd);
> +		close(sock[0]);
> +	}
> +
> +	return (0);
> +}
> 
> 

-- 
Rod Grimes                                                 rgrimes at freebsd.org


More information about the svn-src-user mailing list