Message ID | 1472041476-14664-1-git-send-email-ynorov@caviumnetworks.com |
---|---|
State | New, archived |
Headers |
Received: (qmail 77404 invoked by alias); 24 Aug 2016 12:25:02 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: <libc-alpha.sourceware.org> List-Unsubscribe: <mailto:libc-alpha-unsubscribe-##L=##H@sourceware.org> List-Subscribe: <mailto:libc-alpha-subscribe@sourceware.org> List-Archive: <http://sourceware.org/ml/libc-alpha/> List-Post: <mailto:libc-alpha@sourceware.org> List-Help: <mailto:libc-alpha-help@sourceware.org>, <http://sourceware.org/ml/#faqs> Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 77391 invoked by uid 89); 24 Aug 2016 12:25:01 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=whence, libc_hidden_ver, (unknown), ltp X-HELO: NAM02-SN1-obe.outbound.protection.outlook.com Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Yuri.Norov@caviumnetworks.com; From: Yury Norov <ynorov@caviumnetworks.com> To: Adhemerval Zanella <adhemerval.zanella@linaro.org> CC: Yury Norov <ynorov@caviumnetworks.com>, <libc-alpha@sourceware.org> Subject: [RFC PATCH] Consolidate __lseek(), __llseek implementation Date: Wed, 24 Aug 2016 15:24:36 +0300 Message-ID: <1472041476-14664-1-git-send-email-ynorov@caviumnetworks.com> MIME-Version: 1.0 Content-Type: text/plain X-ClientProxiedBy: VI1PR07CA0067.eurprd07.prod.outlook.com (10.164.94.163) To SN1PR07MB2255.namprd07.prod.outlook.com (10.164.47.149) X-MS-Office365-Filtering-Correlation-Id: 04059f07-d620-4835-f7ed-08d3cc19a348 X-Microsoft-Exchange-Diagnostics: 1; SN1PR07MB2255; 2:teYtpKBq9URz0GK7/1uRtaGPlfV6siJY79/ycefBcerybulbH/zmTnrEDurhtQ2SeCNW8sH03PmuqOusH9O9g0eS8Nif5Z0nPf+EmFsPFbt3C9DyLtocQvKkeIO2iqseHWGbPPpFjj9Gx/95Fs/fNgdqwkn+drRCaNwoxwyMzNTVtLlJ7D8wBsnhUpSWbuCm; 3:oDsSivEy2bd3uFwSIFFNC4RUqafXq28cDUUdOSH+9wFvhMn0vn+B3coX39l9472ZW2DYLQLcbPrabN7JgtoJKjek1u8kikhozQkY7//YzsK4X+SQoNd4+KwBjj5/Ssf7 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:SN1PR07MB2255; X-Microsoft-Exchange-Diagnostics: 1; SN1PR07MB2255; 25:HaHMBDFNcyhYe+vxOVjC7BxFvvclviWJt171KGaZhyLLTO8HkRibX1k/06lms+uXwgTFK0jiyQwCPpZZbFAbA12PB8saor4k5KHUKtxs64XZBx84eBVLXjsw6wiavgdDq44DqPJGoNnUS1agg8OY3CrdLu352QkSNL3+MQPP5OM1PIe68zR7Sd0EnhG9Jqqo7K6vA+ElBiYAltNWh7K9MRVxeqgpPAIfVh0z3nySco1Dg6q2NC4YiIaiIZLslGGzrYf89IN8eWcm6y3Ycdw9OE0c2AuQHEdywg6y4reWQDoqb75z38+RiD6o8/3U2SNfN82j8PLMHo5mlYrkEp7jvp7BuRBBrftkc8wfQ8C5OI4WJn0I5yBtNIreAyPymrezCfW256u/b1i5uk4I+YVMxGTFTjG3ZqCUWBQ9nzjXgbho3otst45sazhxfG8LI346fzfFN0SaJmWsjXdGzjRcdMxGgJUhRTdaJpj40XGC+Eig3J4hkJvQlqbCv6lxoKpkrFhzADKZvedCpMR+O3pkECZpO2JmOE3vu/VjugqBto+zmJT5qQ/t2IOBI+qRikBLTwcEpzCWFnvdAAAmsJlWodg/MRDmK2mcHIrKB+1hxpi4FPcVurLEpsoL6UvxagzPvefcT2xNdLhPbgMVdr256d2mWEk4U4eQb5PgTgHjXYCLYAlFbVSaCTT71g83lZcrhXOXwPr0SPy6bot5hoqyn7Akh4k8q2N0bSeIgP1w/U78sBN0BLYFzZA8NpXqupXguL7gf7UQ48VY0kHM7Z2gdA== X-Microsoft-Exchange-Diagnostics: 1; SN1PR07MB2255; 31:B6OxGoJiFanOn1I9DyldeuK138MgzSTabTC9FHOHxp7tf1DvVEb2JBcg3ltoKnC9IZsvpnkfP3SFZgpluEjLd6xkmbZssHouN0emZBBZl4Wb9pDAFmdbfVBrQjIZG71ZR2xYtLdWwoIUNrjnLyzzWxXhM/e04wtBbuo3tHV+fcxwNrZUBMn/PWM+ipt7j2yRCO2hksCXSJpBSRsJRcbQFewqrePZUe7cCjp+3XgyO6w=; 20:Wlg6IvK/PsALHAjDJ4q7Vu6zcpIhTdzzIhLaSpltC/d16hFpjKfOGPE7imndSs96nkhxv5ILVprSeP1qEHoxos01xsdqjT2Aa4T7l8+w2hoEDvqS1gETJVJWPpYxX9hb4Qa9vfte4x/f23MdlNM1GbK3C9Y7XbYV0KSmtdrGWneFLRqdEtgWTXZP5WRudYh0wGCM/NllMKs5neWCCgLGwc6qyETdU0pFxKh2vkpqpdJXjmMItTOevg15/HFe3nqeUmjH1oombfwq9GEdXygX3IO5ziu3kIkUYQtJgNMxWMg2IFwXBNCtCJv9q8hGoEkw9ySDb/L0VdtMnE1aAcVa1xwF7uRfV5hmfKiUDgJlrj7vQXOiTRXV5DYoylyucS8JJtYXrVb2LIJS5ViDr1Yjai+71pB0Q2eGNR7cLo8NYKk1b6ON7VojwJSpLaqRxT3UeuR/6MSn2zVZwN3l6vQ1G/AQQ2+oeqANWrGOo7Zjq0Ll+WMlsFoPL6R3t/i/GJmXDBZMMLKMWb5lKUyXLkYVPH9jTCdtbUllvaO2ufNBYUmhbnxzaB979/z9H3uUr3Tdiu/EMdKLPT2DtWaQo3/sgmtBafEyeaKdi4kq69cgO4U= X-Microsoft-Antispam-PRVS: <SN1PR07MB2255CA44E499775006BC9EC0EEEA0@SN1PR07MB2255.namprd07.prod.outlook.com> X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040176)(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046); SRVR:SN1PR07MB2255; BCL:0; PCL:0; RULEID:; SRVR:SN1PR07MB2255; X-Microsoft-Exchange-Diagnostics: 1; SN1PR07MB2255; 4:R1Yb1cKz1Id0TFgsPnCkpdGTR/Rge7vEbiIcN369jlN7gE9AxnmaO8O0qml8T6Sy5U58YjjPHkapRJZ37+YzzM+IngHbsZsupjkp6Vx2f3tgUxgcwAVoLoG4KLMCsAua8HGRzXIIwdkoY5Dj/vpc7U9xUS40dMxlY/jWK8fIFljyUlQG6qipT4TzeThovoUJ77ubGfacsqFrlKFzK/oN7y5QHv1cIPVm1FHaMXyy0UZmqiXMNJb7CnluiZpdfj1H/wXI+GTQLpxO2AeTZ6klcLNe6Oh1um+IxTh+RWwwtUEUgCNyEpYoNLWexIpGiOaeCV+yNhRqZ17rzG3sf4u83JBpgZ8fEg3j4xnxqZM96TOFx5onl8xHKy811/WROGRAEvl6CZcXawD2yNwnMOmE7w== X-Forefront-PRVS: 0044C17179 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6069001)(6009001)(7916002)(199003)(189002)(47776003)(110136002)(81166006)(305945005)(7846002)(7736002)(68736007)(48376002)(50226002)(6116002)(19580395003)(97736004)(66066001)(81156014)(586003)(19580405001)(4326007)(8676002)(575784001)(3846002)(2906002)(5660300001)(33646002)(106356001)(36756003)(5003940100001)(189998001)(229853001)(101416001)(77096005)(50466002)(105586002)(50986999)(76506005)(92566002)(42186005); DIR:OUT; SFP:1101; SCL:1; SRVR:SN1PR07MB2255; H:localhost; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: caviumnetworks.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; SN1PR07MB2255; 23:I5lO0zaLlcmPrpNHd7RoixadEXuTTCdM3XKLwpKJb?= =?us-ascii?Q?sFmh9feBYUzpO5dGsJB4b51VW2fhROw+1Bls3uYVCG2zupCGe1XPTNX1jegk?= =?us-ascii?Q?oTaBpddzSLH1RwAJTlJGViKqO9k9moiHLaVJixQgg5zlJljCZdcBlWsK/E2b?= =?us-ascii?Q?EaUyEkkenKT6GM+YYheCIatCSXbr2+BwtijObOhDMjab46laKgx0oPrMBaQZ?= =?us-ascii?Q?/riRBz9MJJEvhgfv3Uix8KPNgoaCnkz27fAIKWHTY7fT+FwRGDVu5ZzLK0Od?= =?us-ascii?Q?alL40t+gT2QyTZc4v5a+Qn9G1igk7xLXoPubaqtWVbcKTdvIHBX74oh1I/+q?= =?us-ascii?Q?FQhuU0krmW8CMwp6GyuBsGN2Ks2o1uLkVBU7udtt7+opjB71MSQ65i9V9aIX?= =?us-ascii?Q?hCPrXQG0Tgy0vsqs8PhXlsNfk0W4yVSQGnHW16Wos52e5vE7PK9FgLDM37/e?= =?us-ascii?Q?4jfpsy9yZEmno7WnekRwCclICdU+Wa+0bf96aPY8YaavefNM+73VkY/16pUR?= =?us-ascii?Q?N5s7+yEX4PP6xh8icqXbNlpI7ZzHazT5CjTfPhdbkLUv+zqD+hXSnTj9Q1c3?= =?us-ascii?Q?Eh+iLZaXlO8m0DylBKA/nfQPqHtEJDiaXWme0gNa8pOVJ9Gx8PFgDKGMte9V?= =?us-ascii?Q?cC+OFSz3uC2J9oTypUzJqIc96OOLvWugb+ka8hZDYhLFhhjZucMrEfaYvaWE?= =?us-ascii?Q?BU270NqpQjYS/k8z+3XViWQFc9KxKiq1q4ThGrFpS57+vQajDxvSw9D+6r6O?= =?us-ascii?Q?JQurcKTuX05GirVCK+vuPn32LUrEmsomimT2IEhu258DTjkKsz9oZzjRJkX5?= =?us-ascii?Q?enuGrYvqjMgranTycRRHs+yIfwnW31rkZoq+go7gWCSjFLOGCcl24eBHJVq1?= =?us-ascii?Q?do5kE+vt1ltPFT0aT7S8vDMALD1cjY3zXxcUp7JW5M7XJPmlhwYPewIHczcd?= =?us-ascii?Q?FF73wb4eO85Gax2PEuxJjh9DVzs7LtDLXbiTMFUknunrCHHdFkEWgizomV5A?= =?us-ascii?Q?wM1FYLhx7y4xSv98lfOb4QROAebWjsQoAdYBN9J9NTMEN/gg5ZIuub3hCtLy?= =?us-ascii?Q?gGwdTWIdVvxu2zExNRHEraEhxT7?= X-Microsoft-Exchange-Diagnostics: 1; SN1PR07MB2255; 6:dltz6kXZVyz+gQP9w7mxkU6SAfWHWugYJ3ijAFehH1M/gdq/g0FocDpSgjYnx28OCiS5gA2hWP1PNldrykxmweWkRV4bgqX0pMQgmVe+hGZoxZATVsMRq+q5Y5w8m0mUd27jMeMWI8l1kVj0yVvZ6NEkD0xH3lMr4PdQZKTtDU720PhRozLBTHOt7ZwXHNcHZ9kemaICZRKeT1H9/9XjB/IU92AouCxMg59sHTfjWr2b5JFJZndf7Jf2Te452DcR0CTDiGZnZsn5dcKo6ADph3+OzJi1x4do/yhxwGSmNSI=; 5:dQ9Mb5hN36U2sgvyKthyeOsuo5VKEjpSV/wWNT7cUJfd+BCXb4iRP6a78ofrUYBEUmSezxB7VPzqGZ0AT0O1jsfNZBXGFIndVk8LmKp/cWkHxEnQg288pApQ6QwHjWW24/rpFw2cM8x800q0XpB2Fw==; 24:XwEaD/dV38HsIfCJtNQOjbo3BhpaJ5nofKghr/82K1hDxwIJ9jcNSv6LBXdOzHh2cas2WZNckBqtz6cMbYg+R8tl3WsdLmBshQCbhpt70G8=; 7:YhPsr6fNZGqTGM65MVbNub85XohZG80pqID8bTsr0EVTqbV8jcJ06Vg93I8cengfV897PHV5kQseBJk87y03OJeUXh17yi2zU9TxHMC0OZrZA1JN7PNjWsbA9vZ1hUtYX5ETMhqkK+jyCeJXHf2vIYtZ5UYJ3D2sg8cm4UsfffmM4hIe6ImJ0QtUmPYqlvFON6hZE3yly4GRDP/3BmPEkC7biFdlivKrVtq5KblMY+h2pJCoPmZsvMQoogVxQAZj SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Aug 2016 12:24:47.0715 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR07MB2255 |
Commit Message
Yury Norov
Aug. 24, 2016, 12:24 p.m. UTC
Hi Adhemerval,
Current __lseek() implementation under
sysdeps/unix/sysv/linux/generic/wordsize-32/lseek.c
is broken if off_t is 64-bit type. In this patch it is redirected to 64-bit
__llseek() version. It helps to avoid introducing platform implementation for
__lseek() under aarch64/ilp32.
Notice that using SYSCALL_LL64() makes LTP hang for me (ltp-pan itself),
so I don't use it. I am also not sure this patch does not affect other
ports, and that there's no alternative implementations in glibc that we'd
cleenup. So I marked it as RFC. Please take a look. If you find it helpful,
I'll handle SYSCALL_LL64() issue and resend it.
Yury.
Signed-off-by: Yury Norov <ynorov@caviumnetworks.com>
---
sysdeps/unix/sysv/linux/generic/wordsize-32/llseek.c | 7 +++++++
sysdeps/unix/sysv/linux/generic/wordsize-32/lseek.c | 2 ++
2 files changed, 9 insertions(+)
Comments
On 24/08/2016 09:24, Yury Norov wrote: > Hi Adhemerval, > > Current __lseek() implementation under > sysdeps/unix/sysv/linux/generic/wordsize-32/lseek.c > is broken if off_t is 64-bit type. In this patch it is redirected to 64-bit > __llseek() version. It helps to avoid introducing platform implementation for > __lseek() under aarch64/ilp32. > > Notice that using SYSCALL_LL64() makes LTP hang for me (ltp-pan itself), > so I don't use it. I am also not sure this patch does not affect other > ports, and that there's no alternative implementations in glibc that we'd > cleenup. So I marked it as RFC. Please take a look. If you find it helpful, > I'll handle SYSCALL_LL64() issue and resend it. > I think the patch is incomplete in the sense that my idea is to consolidate all the implementation at 'sysdeps/unix/sysv/linux' instead of generic one. Also, based on kernel lseek/llseek syscall definition: arch/mips/kernel/linux32.c:99:SYSCALL_DEFINE5(32_llseek, unsigned int, fd, unsigned int, offset_high, arch/tile/kernel/compat.c:90:COMPAT_SYSCALL_DEFINE5(llseek, unsigned int, fd, unsigned int, offset_high, arch/s390/kernel/compat_wrapper.c:97:COMPAT_SYSCALL_WRAP5(llseek, unsigned int, fd, unsigned long, high, unsigned long, low, loff_t __user *, result, unsigned int, whence); fs/read_write.c:305:SYSCALL_DEFINE3(lseek, unsigned int, fd, off_t, offset, unsigned int, whence) fs/read_write.c:324:COMPAT_SYSCALL_DEFINE3(lseek, unsigned int, fd, compat_off_t, offset, unsigned int, whence) fs/read_write.c:331:SYSCALL_DEFINE5(llseek, unsigned int, fd, unsigned long, offset_high, I follows the preadv/pwritev of explicit splitting the off_t argument instead of relying on ABI. So SYSCALL_LL{64} won't work on this, we should use LO_HI_LONG instead. My initial prototype on how to consolidate lseek/lseek64/llseek would be something like the below. I haven't tested it yet and it will prop require some work: - lseek: ABIs with __OFF_T_MATCHES_OFF64_T != 1 will preferable use __NR__llseek if kernel supports it, otherwise it will use __NR_lseek. - lseek64: ABIs with __OFF_T_MATCHES_OFF64_T == 1 will use __NR_lseek. - _llseek: files will be removed and alias to lseek64. In this way ABI with __OFF_T_MATCHES_OFF64_T == 1 will have a empty lseek.c and use __NR_lseek for lseek64.c (with correct alias for _llseek). One possible optimization that I did not added in snippet below, but occurred to me now is for __OFF_T_MATCHES_OFF64_T != 1 where _NR__llseek is defined we can just skip lseek.c compilation and alias the lseek64 to all required lseek symbols. If it is the case where _NR__llseek is defined on all supported arches for minimum current kernel I think we can simplify the strategy below. * sysdeps/unix/sysv/linux/lseek.c #ifndef __OFF_T_MATCHES_OFF64_T off_t __lseek (int fd, off_t offset, int whence) { #ifdef _NR__llseek loff_t res; int rc = INLINE_SYSCALL_CALL (_llseek, fd, LO_HI_LONG (offset), &res, whence); return rc ?: lseek_overflow (res); #else return INLINE_SYSCALL_CALL (lseek, fd, offset, whence); #endif } libc_hidden_def (__lseek) weak_alias (__lseek, lseek) strong_alias (__lseek, __libc_lseek) #endif * lseek64.c off64_t __lseek64 (int fd, off64_t offset, int whence) { #if __OFF_T_MATCHES_OFF64_T return INLINE_SYSCALL_CALL (lseek, fd, offset, whence); #else loff_t res; int rc = INLINE_SYSCALL_CALL (_llseek, fd, LO_HI_LONG (offset), &res, whence); return rc ?: lseek_overflow (res); #endif } #ifndef __OFF_T_MATCHES_OFF64_T weak_alias (__lseek64, lseek) weak_alias (__lseek64, __lseek) strong_alias (__lseek64, __libc_lseek) libc_hidden_def (__lseek) #endif strong_alias (__lseek64, __libc_lseek64) strong_alias (__lseek64, __lseek64) weak_alias (__lseek64, lseek64) /* llseek doesn't have a prototype. Since the second parameter is a 64bit type, this results in wrong behaviour if no prototype is provided. */ strong_alias (__lseek64, _llseek) link_warning (llseek, "\ the `llseek' function may be dangerous; use `lseek64' instead.") llseek.c /* Remove file. */ What do you think? > Yury. > > Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> > --- > sysdeps/unix/sysv/linux/generic/wordsize-32/llseek.c | 7 +++++++ > sysdeps/unix/sysv/linux/generic/wordsize-32/lseek.c | 2 ++ > 2 files changed, 9 insertions(+) > > diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/llseek.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/llseek.c > index 458964c..3352ffd 100644 > --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/llseek.c > +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/llseek.c > @@ -39,6 +39,13 @@ strong_alias (__llseek, __libc_lseek64) > strong_alias (__llseek, __lseek64) > weak_alias (__llseek, lseek64) > > +#ifdef __OFF_T_MATCHES_OFF64_T > +strong_alias (__llseek, __lseek) > +libc_hidden_ver (__llseek,__lseek) > +weak_alias (__llseek, lseek) > +strong_alias (__llseek, __libc_lseek) > +#endif > + > /* llseek doesn't have a prototype. Since the second parameter is a > 64bit type, this results in wrong behaviour if no prototype is > provided. */ > diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/lseek.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/lseek.c > index dbf0b26..c953e79 100644 > --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/lseek.c > +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/lseek.c > @@ -23,6 +23,7 @@ > #include <sysdep.h> > #include <sys/syscall.h> > > +#ifndef __OFF_T_MATCHES_OFF64_T > #include "overflow.h" > > off_t > @@ -36,3 +37,4 @@ __lseek (int fd, off_t offset, int whence) > libc_hidden_def (__lseek) > weak_alias (__lseek, lseek) > strong_alias (__lseek, __libc_lseek) > +#endif >
diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/llseek.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/llseek.c index 458964c..3352ffd 100644 --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/llseek.c +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/llseek.c @@ -39,6 +39,13 @@ strong_alias (__llseek, __libc_lseek64) strong_alias (__llseek, __lseek64) weak_alias (__llseek, lseek64) +#ifdef __OFF_T_MATCHES_OFF64_T +strong_alias (__llseek, __lseek) +libc_hidden_ver (__llseek,__lseek) +weak_alias (__llseek, lseek) +strong_alias (__llseek, __libc_lseek) +#endif + /* llseek doesn't have a prototype. Since the second parameter is a 64bit type, this results in wrong behaviour if no prototype is provided. */ diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/lseek.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/lseek.c index dbf0b26..c953e79 100644 --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/lseek.c +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/lseek.c @@ -23,6 +23,7 @@ #include <sysdep.h> #include <sys/syscall.h> +#ifndef __OFF_T_MATCHES_OFF64_T #include "overflow.h" off_t @@ -36,3 +37,4 @@ __lseek (int fd, off_t offset, int whence) libc_hidden_def (__lseek) weak_alias (__lseek, lseek) strong_alias (__lseek, __libc_lseek) +#endif