From patchwork Thu Jun 15 22:10:18 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: 105691 Delivered-To: patch@linaro.org Received: by 10.140.91.77 with SMTP id y71csp1017052qgd; Thu, 15 Jun 2017 15:10:41 -0700 (PDT) X-Received: by 10.84.232.142 with SMTP id i14mr4456252plk.102.1497564641075; Thu, 15 Jun 2017 15:10:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1497564641; cv=none; d=google.com; s=arc-20160816; b=JZX81UyuwWK9kVCcK8210iKKVqCO669HxTv8uW+7rf+nRphP1ZTn5g2Pl1hkDOJB4M LSVcXJtFIKKdaKejmdLWtRyQccTh9Ton19AzxGfgitLyc4RbjiZEErhmLRzwL/xGAtM2 XC8MPNamOTFcQG7g6u5eBp13C6z1unVfGZaVWqBqzZ6auWdaheZ7XxroSyfOasjY6nRS UHBnO5b320p4nMNlJgyhm+BZ9NTQ3NKuyn19jz8fqLZizWrF7Yh0qT5eLAdc0bYzFCe0 kW40eDtr9twMMbmjU/P77XGueB+Bw6Uz5FbCVB/0mX2O66+2cCR/JWudnyuU2Tai4y6q UvjQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:user-agent:date:message-id :subject:from:cc:to:delivered-to:sender:list-help:list-post :list-archive:list-subscribe:list-unsubscribe:list-id:precedence :mailing-list:dkim-signature:domainkey-signature :arc-authentication-results; bh=K+i3t1X3wIuIfmnDfsQwdd8wU9As3AMwNpP9xsFsaxM=; b=IsaYDdh+kYkaK09s2SHjHgYsSXQas8xPqU3DazIEomkNvRYqCQ9VWNEuIcl0ywa0Pp asIzwLpNckoOBIag6U5uVKwXlU/TZQCGmKwIiQeHpOgDeJIqQRZ/ZsSu2fn9TGqcWOZD 5SuUlZpsdnCRfrufdGUX4U4JhmiFltxXn2SpfK0wsYLyTbmtG+PiXYqpLuCzCh5fLr8k dpFXU4/47k+CHGigduyKUX+BnZCkFQhMlV9aML8Vj7fKnxTly+McBuNyuJWONepS8ZN/ GVCNmMd1qlupfF37q+SrB2zvQbehAKtDptY8dn0oXoJGdCvecPO4alBnS220SRWsztri KE4Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.b=s2JPISSg; spf=pass (google.com: domain of libc-alpha-return-80581-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-80581-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id l13si331035pgc.255.2017.06.15.15.10.40 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 15 Jun 2017 15:10:41 -0700 (PDT) Received-SPF: pass (google.com: domain of libc-alpha-return-80581-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.b=s2JPISSg; spf=pass (google.com: domain of libc-alpha-return-80581-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-80581-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.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:to:cc:from:subject:message-id:date :mime-version:content-type:content-transfer-encoding; q=dns; s= default; b=gcavz8zRwr8wYOEJ9mettwN9F2tHyjE7UuPQgUd53Z6b5mgd5jZu7 AD7eUacrTNru19iQJs9exn7hYcrl/aB/d2FNYT4533WkhvDB3xuFsHL3/x/gWc6F WCPsg/FGfeU8x+8P+EKc0XWBrQ7s56t2huVSKTt1vb6Ud+vwKX6miU= 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:to:cc:from:subject:message-id:date :mime-version:content-type:content-transfer-encoding; s=default; bh=u4bAzwgdXsckVhQQx/KqlXsC6VI=; b=s2JPISSgELhxVIiWnAK+KqUQIb43 LNG3116CGUnazmwnF8dapmzRSuqikgQLfSWE+xBVth/xdZ0lMQ9QoJEFCMmS1J2P Gei7ktq+erUePesTbzEnL74ri5nSE/+6zNKLymLqIwo0vPPEgOs40iKX9qrhSwNE 2y/tZCPucSl/9BU= Received: (qmail 8746 invoked by alias); 15 Jun 2017 22:10:25 -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 8728 invoked by uid 89); 15 Jun 2017 22:10:24 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-27.6 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 spammy=HTo:U*hch, H*r:1006 X-HELO: mail-qt0-f181.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:to:cc:from:subject:message-id:date:user-agent :mime-version:content-language:content-transfer-encoding; bh=K+i3t1X3wIuIfmnDfsQwdd8wU9As3AMwNpP9xsFsaxM=; b=f/0zHkcEJQUa8QYmr3AnIYuZmATndS92flTgPNIH/4rJBOl59ILZ/09ZCkSx7+ccPD YkpWW6COqKXVQb2ZAYXBz+stRoHPTAacdoGfWw4VoXAlxLqzgq1wyk48dCpKB22tcgNi vHCmHQszV1esbGAqvoxlJz9KjaRJXJO6x71cFuoxVGKtXbzTVPBx8C2tOaV9+c2l1nUn MfCkr/TZZrDKRnucWbSLYh6UwXMnXhfHI3LQgQR04dreclNTa4pOJVeGHbOev9M5ynod GO3LUzMQPwPAc6+84THyMVVjqVU1vdF6QT0dZI8sbr2TpqkM4aDoHo87WDL8NvI2cKi9 IZ6Q== X-Gm-Message-State: AKS2vOykdVUuCOJGGe/sG3G+5rntmLpfUXHiwdMIYovmKNYySgpjX9JX UjQwm+2MJXWO4+63 X-Received: by 10.55.152.198 with SMTP id a189mr8803749qke.63.1497564624806; Thu, 15 Jun 2017 15:10:24 -0700 (PDT) To: GNU C Library , Christoph Hellwig Cc: Stephen Bates , "linux-block@vger.kernel.org" , Christoph Hellwig , "jonathan.derrick@intel.com" , Jens Axboe From: Adhemerval Zanella Subject: RFC: pwritev2 regression test for invalid flags Message-ID: Date: Thu, 15 Jun 2017 19:10:18 -0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.1.1 MIME-Version: 1.0 After the issue with LO_HI_LONG definition on x86_64-linux-gnu, I planed 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 [...] For both on 64 bits syscalls works as intended. For instance on x86-64 aforementioned kernel: [...] [pid 24276] preadv2(3, 0x7ffd084c1ee0, 1, 0, 0x8 /* RWF_??? */) = -1 EOPNOTSUPP (Operation not supported) [pid 24276] pwritev2(3, [{"\0\0\0\0\0\0\0\0!`\331\311\304\177\0\0\220\37L\10\375\177\0\0\0\0\0\0\0\0\0\0", 32}], 1, 0, 0x8 /* RWF_??? */) = -1 EOPNOTSUPP (Operation not supported) [...] I haven't tested on newer kernels or on different architectures (these are the ones I have readily available). Any idea why kernel ignores invalid flags for pwritev2 on compatibility mode? Does it invalidate the testcase? PS: I am copying the ones on the original pwritev2/preadv2 email about the status of the syscall on glibc [1]. [1] https://sourceware.org/ml/libc-alpha/2017-04/msg00452.html diff --git a/misc/tst-preadvwritev2-common.c b/misc/tst-preadvwritev2-common.c new file mode 100644 index 0000000000..a8073e6894 --- /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 cf36272dd3..682c7579da 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 8d0c48ea78..9ddc7625f0 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); }