From patchwork Mon Jun 5 13:37:22 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 20795 Received: (qmail 83888 invoked by alias); 5 Jun 2017 13:37:32 -0000 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: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 82326 invoked by uid 89); 5 Jun 2017 13:37:31 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=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=2512 X-HELO: mail-yw0-f170.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:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=n0Ngqui+3NtCytVEz6XjLRX8ilJRVZ9m1ArxwkbIYCs=; b=gw8e7qGYY3I2LiGHlPu1TZ+hDpMma9IXHUMALrUenCtMvfhu7m2UC3Bv79n8aGR7vg pU2CRu6gAnU3s2DVpjKxlTzymcXX10Es7kbE9NssfFOyHQ0rN+UlRdnzVngiOM3WGaEE BqtDyQSlsw+RDDDMJOjsO00jCOnMMr79tErwBlp7ej2C1kh05CgR+poLOrLAPTEyO7wQ LA0MnG7gKpq4k98pDqwFnswtRQ25de0RSbPdr8ZdgAYS31CvuNBOkVMEB9xyNzqeoONs W3K+bDeA7X4GE1uT5QGmrz+TiK2sLNF/1Eys8YKLer0ZVIG1rBC5JvSk2ppCkdqbpPWP ZvIw== X-Gm-Message-State: AKS2vOxI37TNyp1z3CL6F1/2wT4lIA35GQb/QRpkBPnaJlDwmvBjN3YG TjueQcm+I3gocr9DUDh6PQ== X-Received: by 10.55.147.135 with SMTP id v129mr24724420qkd.146.1496669851062; Mon, 05 Jun 2017 06:37:31 -0700 (PDT) Subject: Re: [PATCH v3 2/2] posix: Implement preadv2 and pwritev2 To: "H.J. Lu" , Andreas Schwab Cc: Zack Weinberg , Florian Weimer , Siddhesh Poyarekar , GNU C Library References: <1493901791-13438-1-git-send-email-adhemerval.zanella@linaro.org> <77f9ac84-620a-a408-c448-14a6978f5d2e@linaro.org> <14aca656-8e0f-01b2-ead6-94a9f200f33e@panix.com> <87tw3xccqn.fsf@linux-m68k.org> From: Adhemerval Zanella Message-ID: Date: Mon, 5 Jun 2017 10:37:22 -0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.1.1 MIME-Version: 1.0 In-Reply-To: On 04/06/2017 10:42, H.J. Lu wrote: > On Sat, Jun 3, 2017 at 8:28 AM, Andreas Schwab wrote: >> On Jun 03 2017, "H.J. Lu" wrote: >> >>> X32 inherits LO_HI_LONG from x86-64. If we change x86-64 >>> LO_HI_LONG, x32 needs to redefine LO_HI_LONG. >> >> Your LO_HI_LONG_FLAGS doesn't work for x32 either. >> > > My patch redefined LO_HI_LONG_FLAGS for x32. Here is an alternate > patch which defines different LO_HI_LONGs for x86-64 and x32. > > Tested on x86-64 and x32. Thanks for checking out this, I was being fooled by the compiler. Patch looks ok and I am plan to add this patch to check the above patch for correct check for invalid flags (which would also have show this issue with LO_HI_LONG being used on p{read,write}v2). However it seems to trigger what I think it is a kernel bug on version that provides p{read,write}v, where preadv2 does fails with EOPNOTSUPP but pwritev2 does not. For instance, on x86_64-linux-gnu-x32 and i686-linux-gnu (4.10.0-21-generic/x86_64): [...] [pid 1027] preadv2(3, 0xff96d3d0, 1, 0, 0x8 /* RWF_??? */) = -1 EOPNOTSUPP (Operation not supported) [pid 1027] pwritev2(3, [{"\0\360bVl\206\4\10\0\0\0\0Z=l\367t\372\226\377\214\362`\367\f\0\0\0\0\320\4\10", 32}], 1, 0, 0x8 /* RWF_??? */) = 32 [...] And on sparcv9-linux-gnu (4.12.0-rc1-sparc64-smp): [...] [pid 139846] preadv2(3, [{iov_base=0xffefcd88, iov_len=32}], 1, 0, 0x8 /* RWF_??? */) = -1 EOPNOTSUPP (Operation not supported) [pid 139846] pwritev2(3, [{iov_base="\377\357\315\300p\1f\314\0\0\0\0\0\0\0\2p\3@\10\0\2B\260p\3+\330\0\1\21\220", iov_len=32}], 1, 0, 0x8 /* RWF_??? */) = 32 [...] Any idea why kernel ignores invalid flags for pwritev2? Does it invalidate the testcase? --- * misc/tst-preadvwritev2-common.c: New file. * misc/tst-preadvwritev2.c (do_test): Add test for invalid flag. * misc/tst-preadvwritev64v2.c (do_test): Likewise. --- diff --git a/misc/tst-preadvwritev2-common.c b/misc/tst-preadvwritev2-common.c new file mode 100644 index 0000000..a8073e6 --- /dev/null +++ b/misc/tst-preadvwritev2-common.c @@ -0,0 +1,46 @@ +/* Common function for preadv2 and pwritev2 tests. + Copyright (C) 2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include + +static void +do_test_with_invalid_flags (void) +{ + int invalid_flag = 0x1; +#ifdef RWF_HIPRI + invalid_flag <<= 1; +#endif +#ifdef RWF_DSYNC + invalid_flag <<= 1; +#endif +#ifdef RWF_SYNC + invalid_flag <<= 1; +#endif + + char buf[32]; + const struct iovec vec = { .iov_base = buf, .iov_len = sizeof (buf) }; + if (preadv2 (temp_fd, &vec, 1, 0, invalid_flag) != -1) + FAIL_EXIT1 ("preadv2 did not fail with an invalid flag"); + if (errno != ENOTSUP) + FAIL_EXIT1 ("preadv2 failure did not set errno to ENOTSUP (%d)", errno); + + if (pwritev2 (temp_fd, &vec, 1, 0, invalid_flag) != -1) + FAIL_EXIT1 ("pwritev2 did not fail with an invalid flag"); + if (errno != ENOTSUP) + FAIL_EXIT1 ("pwritev2 failure did not set errno to ENOTSUP (%d)", errno); +} diff --git a/misc/tst-preadvwritev2.c b/misc/tst-preadvwritev2.c index cf36272..682c757 100644 --- a/misc/tst-preadvwritev2.c +++ b/misc/tst-preadvwritev2.c @@ -23,9 +23,12 @@ pwritev2 (__fd, __iov, __iovcnt, __offset, 0) #include "tst-preadvwritev-common.c" +#include "tst-preadvwritev2-common.c" static int do_test (void) { + do_test_with_invalid_flags (); + return do_test_with_offset (0); } diff --git a/misc/tst-preadvwritev64v2.c b/misc/tst-preadvwritev64v2.c index 8d0c48e..9ddc762 100644 --- a/misc/tst-preadvwritev64v2.c +++ b/misc/tst-preadvwritev64v2.c @@ -25,9 +25,12 @@ pwritev2 (__fd, __iov, __iovcnt, __offset, 0) #include "tst-preadvwritev-common.c" +#include "tst-preadvwritev2-common.c" static int do_test (void) { + do_test_with_invalid_flags (); + return do_test_with_offset (0); }