From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Adhemerval Zanella Newsgroups: gmane.comp.lib.glibc.alpha Subject: Re: [PATCH] nptl: Fix tst-cancel4 sendto tests Date: Fri, 2 Mar 2018 15:27:51 -0300 Message-ID: References: <1519328339-25282-1-git-send-email-adhemerval.zanella@linaro.org> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Trace: blaine.gmane.org 1520015165 27143 195.159.176.226 (2 Mar 2018 18:26:05 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Fri, 2 Mar 2018 18:26:05 +0000 (UTC) User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 To: libc-alpha@sourceware.org Original-X-From: libc-alpha-return-90735-glibc-alpha=m.gmane.org@sourceware.org Fri Mar 02 19:26:00 2018 Return-path: Envelope-to: glibc-alpha@blaine.gmane.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:subject:from:to:references:message-id:date :mime-version:in-reply-to:content-type :content-transfer-encoding; q=dns; s=default; b=rIjHQsUsCqw+dSzA CI9NmyHiBM02GA9jRfvx2f3CILDzmqabxAERpxuEg2oM/C9tGn0wl/p5/U7f8kHQ uzXFhSlZ6ZMmhRmfjyoX5n5NYc/kgogLdvDlcqXjYIF4xF3WkXoZy00qxzFBwWOT PlN4qAx5VV7zslP1BTCr1HY9nwU= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:subject:from:to:references:message-id:date :mime-version:in-reply-to:content-type :content-transfer-encoding; s=default; bh=lQjyzfZlDtUTH7+osJJsCQ ciYqQ=; b=YCbEdfnrrqFrzkWSpiISPQCO25Khv3GlCHQMOKCLBUGBG3kFlFzgHY nb43qQifsMDK8GaDJ+9389Op0KD03MQ0CEh/NQ+f9rUwj3NBxm+q0Eo8mM/Hso8a g3sK2WXRJyz3lBoJCO2roOz2pontoAS+/4GL7iIeKw5AkVQXxKNNA= Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Original-Sender: libc-alpha-owner@sourceware.org Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.1 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 spammy=700000 X-HELO: mail-qt0-f195.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:from:to:references:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=k8ySEB564SjoiPsTsGsLp1LOKgbg2/PBpt7WZdTTKjs=; b=RsUFSHXpueHxYoONiQZ4tAxPulrcfTidfd/TNsLoBZkX2yexNkXz/Zp1AEelf1zYUo oKVASJCvoUDGLdKFOENe65ldqGO68MV+gdeBQ4bhpg4gDt7US3NfqR5WCcFbMBdn5vOs oIaxiQlR5uzKgKKlnjhnqyIVYgp+nk57mtXkH91RS845tsXDk8ZqthZQjHEhn8vBX5vr qYW+Hg4Fv+RmjVo7usj0wglP3F5yh60AyxQC2Ud2sHlad0k9Qyvc4qKj1Iwby39cru2/ mvGC9fuynY4JkhWit1QUv/EWPb7Vfh4kGJqyzN0Mx7hGeHFNlk7tjqfU0SdvWBlNkxls BKCA== X-Gm-Message-State: AElRT7GOP0tmC7I6Kmyz6QKbvXd04IqEzquMdM0t/XC/UtPavwmJhAfa CXCvJhu//Vvt1ZEGseZ4J4Q09wxVDlw= X-Google-Smtp-Source: AG47ELt4Ymq0hpbN17VgdD2l3TF6p59stSXfVYOkqA6G39pr9RS4PR9xz/RVKiuV51/B46q3igrwtA== X-Received: by 10.200.19.7 with SMTP id e7mr9663043qtj.204.1520015276364; Fri, 02 Mar 2018 10:27:56 -0800 (PST) In-Reply-To: <1519328339-25282-1-git-send-email-adhemerval.zanella@linaro.org> Xref: news.gmane.org gmane.comp.lib.glibc.alpha:83066 Archived-At: Received: from server1.sourceware.org ([209.132.180.131] helo=sourceware.org) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1erpNW-00068a-N5 for glibc-alpha@blaine.gmane.org; Fri, 02 Mar 2018 19:25:59 +0100 Received: (qmail 80694 invoked by alias); 2 Mar 2018 18:28:01 -0000 Received: (qmail 80675 invoked by uid 89); 2 Mar 2018 18:28:00 -0000 If no one opposes it, I will commit this shortly. On 22/02/2018 16:38, Adhemerval Zanella wrote: > Now that send might be implemented calling sendto syscall on Linux, > I am seeing some issue in some kernel configurations where tst-cancel4 > sendto do not block as expected. > > The socket used to force the syscall blocking is used with default > system configuration for buffer sending size, which might not be > correct to force blocking. This patch fixes it by explicit setting > buffer socket lower than the buffer size used. It also enabled sendto > cancellation tests to work in both ways (since internally send is > implemented routing to sendto on Linux kernel). > > The patch also removes unrequired make rules on some archictures > for send/recv. The generic nptl Makefile already set the compiler flags > required on some architectures for correct unwinding and libc object > are not strictly required to support unwind (since pthread_cancel > requires linking against libpthread). > > Checked on aarch64-linux-gnu and x86_64-linux-gnu. I also did a > sniff test with tst-cancel{4,5} on a simulated mips64-linux-gnu. > > * nptl/tst-cancel4-common.h (set_socket_buffer): New function. > * nptl/tst-cancel4-common.c (do_test): Call set_socket_buffer > for socketpair endpoint. > * nptl/tst-cancel4.c (tf_send): Call set_socket_buffer and use > WRITE_BUFFER_SIZE as buffer size for sending socket. > (tf_sendto): Use SOCK_STREAM instead of SOCK_DGRAM and fix an > issue on system where send is implemented with sendto syscall. > * sysdeps/unix/sysv/linux/mips/mips64/Makefile [$(subdir) = socket] > (CFLAGS-recv.c, CFLAGS-send.c): Remove rules. > [$(subdir) = nptl] (CFLAGS-recv.c, CFLAGS-send.c): Likewise. > * sysdeps/unix/sysv/linux/riscv/rv64/Makefile: Remove file. > --- > ChangeLog | 14 +++++++++++ > nptl/tst-cancel4-common.c | 18 +------------- > nptl/tst-cancel4-common.h | 14 +++++++++++ > nptl/tst-cancel4.c | 37 +++++++++++++++------------- > sysdeps/unix/sysv/linux/mips/mips64/Makefile | 10 -------- > sysdeps/unix/sysv/linux/riscv/rv64/Makefile | 4 --- > 6 files changed, 49 insertions(+), 48 deletions(-) > delete mode 100644 sysdeps/unix/sysv/linux/riscv/rv64/Makefile > > diff --git a/nptl/tst-cancel4-common.c b/nptl/tst-cancel4-common.c > index 5bc7e44..c6eee73 100644 > --- a/nptl/tst-cancel4-common.c > +++ b/nptl/tst-cancel4-common.c > @@ -20,29 +20,13 @@ > static int > do_test (void) > { > - int val; > - socklen_t len; > - > if (socketpair (AF_UNIX, SOCK_STREAM, PF_UNIX, fds) != 0) > { > perror ("socketpair"); > exit (1); > } > > - val = 1; > - len = sizeof(val); > - setsockopt (fds[1], SOL_SOCKET, SO_SNDBUF, &val, sizeof(val)); > - if (getsockopt (fds[1], SOL_SOCKET, SO_SNDBUF, &val, &len) < 0) > - { > - perror ("getsockopt"); > - exit (1); > - } > - if (val >= WRITE_BUFFER_SIZE) > - { > - puts ("minimum write buffer size too large"); > - exit (1); > - } > - setsockopt (fds[1], SOL_SOCKET, SO_SNDBUF, &val, sizeof(val)); > + set_socket_buffer (fds[1]); > > if (mktemp (fifoname) == NULL) > { > diff --git a/nptl/tst-cancel4-common.h b/nptl/tst-cancel4-common.h > index a526c0c..10cc4f3 100644 > --- a/nptl/tst-cancel4-common.h > +++ b/nptl/tst-cancel4-common.h > @@ -62,6 +62,20 @@ static pthread_barrier_t b2; > > #define WRITE_BUFFER_SIZE 16384 > > +/* Set the send buffer of socket S to 1 byte so any send operation > + done with WRITE_BUFFER_SIZE bytes will force syscall blocking. */ > +static void > +set_socket_buffer (int s) > +{ > + int val = 1; > + socklen_t len = sizeof(val); > + > + TEST_VERIFY_EXIT (setsockopt (s, SOL_SOCKET, SO_SNDBUF, &val, > + sizeof(val)) == 0); > + TEST_VERIFY_EXIT (getsockopt (s, SOL_SOCKET, SO_SNDBUF, &val, &len) == 0); > + TEST_VERIFY_EXIT (val < WRITE_BUFFER_SIZE); > +} > + > /* Cleanup handling test. */ > static int cl_called; > > diff --git a/nptl/tst-cancel4.c b/nptl/tst-cancel4.c > index 92a3d80..0532538 100644 > --- a/nptl/tst-cancel4.c > +++ b/nptl/tst-cancel4.c > @@ -726,6 +726,8 @@ tf_send (void *arg) > if (tempfd2 == -1) > FAIL_EXIT1 ("socket (AF_UNIX, SOCK_STREAM, 0): %m"); > > + set_socket_buffer (tempfd2); > + > if (connect (tempfd2, (struct sockaddr *) &sun, sizeof (sun)) != 0) > FAIL_EXIT1 ("connect: %m"); > > @@ -738,8 +740,7 @@ tf_send (void *arg) > > pthread_cleanup_push (cl, NULL); > > - /* Very large block, so that the send call blocks. */ > - char mem[700000]; > + char mem[WRITE_BUFFER_SIZE]; > > send (tempfd2, mem, arg == NULL ? sizeof (mem) : 1, 0); > > @@ -1230,16 +1231,11 @@ tf_msync (void *arg) > static void * > tf_sendto (void *arg) > { > - if (arg == NULL) > - // XXX If somebody can provide a portable test case in which sendto() > - // blocks we can enable this test to run in both rounds. > - abort (); > - > struct sockaddr_un sun; > > - tempfd = socket (AF_UNIX, SOCK_DGRAM, 0); > + tempfd = socket (AF_UNIX, SOCK_STREAM, 0); > if (tempfd == -1) > - FAIL_EXIT1 ("socket (AF_UNIX, SOCK_DGRAM, 0): %m"); > + FAIL_EXIT1 ("socket (AF_UNIX, SOCK_STREAM, 0): %m"); > > int tries = 0; > do > @@ -1254,23 +1250,30 @@ tf_sendto (void *arg) > while (bind (tempfd, (struct sockaddr *) &sun, > offsetof (struct sockaddr_un, sun_path) > + strlen (sun.sun_path) + 1) != 0); > - tempfname = strdup (sun.sun_path); > > - tempfd2 = socket (AF_UNIX, SOCK_DGRAM, 0); > + listen (tempfd, 5); > + > + tempfd2 = socket (AF_UNIX, SOCK_STREAM, 0); > if (tempfd2 == -1) > - FAIL_EXIT1 ("socket (AF_UNIX, SOCK_DGRAM, 0): %m"); > + FAIL_EXIT1 ("socket (AF_UNIX, SOCK_STREAM, 0): %m"); > > - xpthread_barrier_wait (&b2); > + set_socket_buffer (tempfd2); > + > + if (connect (tempfd2, (struct sockaddr *) &sun, sizeof (sun)) != 0) > + FAIL_EXIT1 ("connect: %m"); > + > + unlink (sun.sun_path); > > xpthread_barrier_wait (&b2); > > + if (arg != NULL) > + xpthread_barrier_wait (&b2); > + > pthread_cleanup_push (cl, NULL); > > - char mem[1]; > + char mem[WRITE_BUFFER_SIZE]; > > - sendto (tempfd2, mem, arg == NULL ? sizeof (mem) : 1, 0, > - (struct sockaddr *) &sun, > - offsetof (struct sockaddr_un, sun_path) + strlen (sun.sun_path) + 1); > + sendto (tempfd2, mem, arg == NULL ? sizeof (mem) : 1, 0, NULL, 0); > > pthread_cleanup_pop (0); > > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/Makefile b/sysdeps/unix/sysv/linux/mips/mips64/Makefile > index b4fb190..fcb48c0 100644 > --- a/sysdeps/unix/sysv/linux/mips/mips64/Makefile > +++ b/sysdeps/unix/sysv/linux/mips/mips64/Makefile > @@ -1,13 +1,3 @@ > -ifeq ($(subdir),socket) > -CFLAGS-recv.c += -fexceptions > -CFLAGS-send.c += -fexceptions > -endif > - > -ifeq ($(subdir),nptl) > -CFLAGS-recv.c += -fexceptions > -CFLAGS-send.c += -fexceptions > -endif > - > ifeq ($(subdir),signal) > # sigaction.c defines static functions in asms and refers to them from > # C code, resulting in "'restore_rt' used but never defined" (which > diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/Makefile b/sysdeps/unix/sysv/linux/riscv/rv64/Makefile > deleted file mode 100644 > index cb60d74..0000000 > --- a/sysdeps/unix/sysv/linux/riscv/rv64/Makefile > +++ /dev/null > @@ -1,4 +0,0 @@ > -ifeq ($(subdir),socket) > -CFLAGS-recv.c += -fexceptions > -CFLAGS-send.c += -fexceptions > -endif >