From patchwork Wed Dec 11 16:54:43 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lukasz Majewski X-Patchwork-Id: 1207769 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=libc-alpha-return-107953-incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=denx.de Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.b="AyqqJJKd"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 47Y32b1GRGz9sTV for ; Thu, 12 Dec 2019 03:55:18 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id :mime-version:content-transfer-encoding; q=dns; s=default; b=g1Y zztBX+PnzLrhTGMDOiUarlbYt+H8VgruwoWrwyKnKrwOIqwnzWBOVfPaXchRE5WB P2b3UsReLYLxrkQKcyV8uUJM6iHW/Pwq0bYfL6KtuiPAVsllMO7dG/ZtHBsMoFl7 TbvoVY1bI2uzLGg4hj/Jqd1lEFt6w6sYLgIs6u4I= 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:from:to:cc:subject:date:message-id :mime-version:content-transfer-encoding; s=default; bh=EcpuqjooI BNQkicxRZnRgBCUhL0=; b=AyqqJJKd2fSJDk+PZAebYLez66t/3gIANfDsq2pM0 jNv5t1bG05eemjygBJctIiuEjfNcG8buO2QDrTUfQqrPuZaexIF3LAa+7cx9iwpE 9mR9iqrzrhFYgL6A5ky8wZkVcSuUgqUYOR+N5Y+o1tKLJIJRATiVOwmggGlQVJIt vc= Received: (qmail 17586 invoked by alias); 11 Dec 2019 16:55:12 -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 17575 invoked by uid 89); 11 Dec 2019 16:55:12 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-20.7 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.1 spammy=EXTRA, replaces, conceptually X-HELO: mail-out.m-online.net From: Lukasz Majewski To: Joseph Myers , Paul Eggert , Adhemerval Zanella Cc: Alistair Francis , Alistair Francis , GNU C Library , Siddhesh Poyarekar , Florian Weimer , Florian Weimer , Zack Weinberg , Carlos O'Donell , Lukasz Majewski Subject: [PATCH v2 1/2] y2038: linux: Provide __timerfd_gettime64 implementation Date: Wed, 11 Dec 2019 17:54:43 +0100 Message-Id: <20191211165444.18951-1-lukma@denx.de> MIME-Version: 1.0 This patch replaces auto generated wrapper (as described in sysdeps/unix/sysv/linux/syscalls.list) for timerfd_gettime with one which adds extra support for reading 64 bit time values on machines with __TIMESIZE != 64. There is no functional change for architectures already supporting 64 bit time ABI. This patch is conceptually identical to timer_gettime conversion already done in sysdeps/unix/sysv/linux/timer_gettime.c. Please refer to corresponding commit message for detailed description of introduced functions and the testing procedure. --- Changes for v2: - Remove "Contributed by" from the file header - Remove early check for (fd < 0) in __timerfd_gettime64 as the fd correctness check is already done in Linux kernel - Add single descriptive comment line to provide concise explanation of the code --- include/time.h | 3 ++ sysdeps/unix/sysv/linux/Makefile | 3 +- sysdeps/unix/sysv/linux/syscalls.list | 1 - sysdeps/unix/sysv/linux/timerfd_gettime.c | 66 +++++++++++++++++++++++ 4 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 sysdeps/unix/sysv/linux/timerfd_gettime.c diff --git a/include/time.h b/include/time.h index e5e8246eac..eb5082b4d7 100644 --- a/include/time.h +++ b/include/time.h @@ -181,9 +181,12 @@ libc_hidden_proto (__futimens64); #if __TIMESIZE == 64 # define __timer_gettime64 __timer_gettime +# define __timerfd_gettime64 __timerfd_gettime #else extern int __timer_gettime64 (timer_t timerid, struct __itimerspec64 *value); +extern int __timerfd_gettime64 (int fd, struct __itimerspec64 *value); libc_hidden_proto (__timer_gettime64); +libc_hidden_proto (__timerfd_gettime64); #endif #if __TIMESIZE == 64 diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index 07776d28ea..e599fcec23 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -18,7 +18,8 @@ sysdep_routines += adjtimex clone umount umount2 readahead \ setfsuid setfsgid epoll_pwait signalfd \ eventfd eventfd_read eventfd_write prlimit \ personality epoll_wait tee vmsplice splice \ - open_by_handle_at mlock2 pkey_mprotect pkey_set pkey_get + open_by_handle_at mlock2 pkey_mprotect pkey_set pkey_get \ + timerfd_gettime CFLAGS-gethostid.c = -fexceptions CFLAGS-tee.c = -fexceptions -fasynchronous-unwind-tables diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list index 603e517ca6..385007c662 100644 --- a/sysdeps/unix/sysv/linux/syscalls.list +++ b/sysdeps/unix/sysv/linux/syscalls.list @@ -95,7 +95,6 @@ mq_setattr - mq_getsetattr i:ipp mq_setattr timerfd_create EXTRA timerfd_create i:ii timerfd_create timerfd_settime EXTRA timerfd_settime i:iipp timerfd_settime -timerfd_gettime EXTRA timerfd_gettime i:ip timerfd_gettime fanotify_init EXTRA fanotify_init i:ii fanotify_init diff --git a/sysdeps/unix/sysv/linux/timerfd_gettime.c b/sysdeps/unix/sysv/linux/timerfd_gettime.c new file mode 100644 index 0000000000..18e1fd2991 --- /dev/null +++ b/sysdeps/unix/sysv/linux/timerfd_gettime.c @@ -0,0 +1,66 @@ +/* timerfd_gettime -- get the timer setting referred to by file descriptor. + Copyright (C) 2019 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; see the file COPYING.LIB. If + not, see . */ + +#include +#include +#include +#include +#include + +int +__timerfd_gettime64 (int fd, struct __itimerspec64 *value) +{ +#ifdef __ASSUME_TIME64_SYSCALLS +# ifndef __NR_timerfd_gettime64 +# define __NR_timerfd_gettime64 __NR_timerfd_gettime +# endif + return INLINE_SYSCALL_CALL (timerfd_gettime64, fd, value); +#else +# ifdef __NR_timerfd_gettime64 + int ret = INLINE_SYSCALL_CALL (timerfd_gettime64, fd, value); + if (ret == 0 || errno != ENOSYS) + return ret; +# endif + struct itimerspec its32; + int retval = INLINE_SYSCALL_CALL (timerfd_gettime, fd, &its32); + if (retval == 0) + { + value->it_interval = valid_timespec_to_timespec64 (its32.it_interval); + value->it_value = valid_timespec_to_timespec64 (its32.it_value); + } + + return retval; +#endif +} + +#if __TIMESIZE != 64 +int +__timerfd_gettime (int fd, struct itimerspec *value) +{ + struct __itimerspec64 its64; + int retval = __timerfd_gettime64 (fd, &its64); + if (retval == 0) + { + value->it_interval = valid_timespec64_to_timespec (its64.it_interval); + value->it_value = valid_timespec64_to_timespec (its64.it_value); + } + + return retval; +} +#endif +strong_alias (__timerfd_gettime, timerfd_gettime) From patchwork Wed Dec 11 16:54:44 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lukasz Majewski X-Patchwork-Id: 1207770 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=libc-alpha-return-107954-incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=denx.de Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.b="MWhjW/o3"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 47Y32l11d4z9sTT for ; Thu, 12 Dec 2019 03:55:26 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; q=dns; s= default; b=WWvECYbah3GrHaRC0iSFyffApykHeZJcrA1/7f2M9LKrrGYXC+cWi cRLBjbZKR/S4y/6kUQvG/YtNQZdL4wGXpUVYDDs+Y4UhcnXvXOgERotWs1z6lHRm iW2be6XqXQlkZYbSri7ENyig3Rcu/d14xXawEztrxcUEqNXY6RvzIw= 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:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; s=default; bh=9McxO+BhEMfj7/8NoOJ3fcpar/8=; b=MWhjW/o3dKWL9KX060JrWpHpUIyi WB0gBKky4xwaj+x2oW5RXJ/3zqjob93NAaa+Qi9pUhEnxAstm7kRbfl/r99/nZzi 72HIG7BVt9bSsRQ5enJW7x0MtXCcFWAo3vz1qqT4lt5eXr4Fz0scVAobFr70HE4p xy4ZJYlIJa+gvL8= Received: (qmail 17931 invoked by alias); 11 Dec 2019 16:55:15 -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 17878 invoked by uid 89); 11 Dec 2019 16:55:14 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-20.7 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.1 spammy= X-HELO: mail-out.m-online.net From: Lukasz Majewski To: Joseph Myers , Paul Eggert , Adhemerval Zanella Cc: Alistair Francis , Alistair Francis , GNU C Library , Siddhesh Poyarekar , Florian Weimer , Florian Weimer , Zack Weinberg , Carlos O'Donell , Lukasz Majewski Subject: [PATCH v2 2/2] y2038: linux: Provide __timerfd_settime64 implementation Date: Wed, 11 Dec 2019 17:54:44 +0100 Message-Id: <20191211165444.18951-2-lukma@denx.de> In-Reply-To: <20191211165444.18951-1-lukma@denx.de> References: <20191211165444.18951-1-lukma@denx.de> MIME-Version: 1.0 This patch replaces auto generated wrapper (as described in sysdeps/unix/sysv/linux/syscalls.list) for timerfd_settime with one which adds extra support for reading and writing from Linux kernel 64 bit time values on machines with __TIMESIZE != 64. There is no functional change for archs already supporting 64 bit time ABI. This patch is conceptually identical to timer_settime conversion already done in sysdeps/unix/sysv/linux/timer_settime.c. Please refer to corresponding commit message for detailed description of introduced functions and the testing procedure. --- Changes for v2: - Remove "Contributed by" from the file header - Remove early check for (fd < 0) in __timerfd_settime64 as the fd correctness check is already done in Linux kernel - Add single descriptive comment line to provide concise explanation of the code --- include/time.h | 5 ++ sysdeps/unix/sysv/linux/Makefile | 2 +- sysdeps/unix/sysv/linux/syscalls.list | 1 - sysdeps/unix/sysv/linux/timerfd_settime.c | 85 +++++++++++++++++++++++ 4 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 sysdeps/unix/sysv/linux/timerfd_settime.c diff --git a/include/time.h b/include/time.h index eb5082b4d7..f23bfea737 100644 --- a/include/time.h +++ b/include/time.h @@ -191,11 +191,16 @@ libc_hidden_proto (__timerfd_gettime64); #if __TIMESIZE == 64 # define __timer_settime64 __timer_settime +# define __timerfd_settime64 __timerfd_settime #else extern int __timer_settime64 (timer_t timerid, int flags, const struct __itimerspec64 *value, struct __itimerspec64 *ovalue); +extern int __timerfd_settime64 (int fd, int flags, + const struct __itimerspec64 *value, + struct __itimerspec64 *ovalue); libc_hidden_proto (__timer_settime64); +libc_hidden_proto (__timerfd_settime64); #endif /* Compute the `struct tm' representation of T, diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index e599fcec23..70cf06bf36 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -19,7 +19,7 @@ sysdep_routines += adjtimex clone umount umount2 readahead \ eventfd eventfd_read eventfd_write prlimit \ personality epoll_wait tee vmsplice splice \ open_by_handle_at mlock2 pkey_mprotect pkey_set pkey_get \ - timerfd_gettime + timerfd_gettime timerfd_settime CFLAGS-gethostid.c = -fexceptions CFLAGS-tee.c = -fexceptions -fasynchronous-unwind-tables diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list index 385007c662..16c673fc1a 100644 --- a/sysdeps/unix/sysv/linux/syscalls.list +++ b/sysdeps/unix/sysv/linux/syscalls.list @@ -94,7 +94,6 @@ fremovexattr - fremovexattr i:is fremovexattr mq_setattr - mq_getsetattr i:ipp mq_setattr timerfd_create EXTRA timerfd_create i:ii timerfd_create -timerfd_settime EXTRA timerfd_settime i:iipp timerfd_settime fanotify_init EXTRA fanotify_init i:ii fanotify_init diff --git a/sysdeps/unix/sysv/linux/timerfd_settime.c b/sysdeps/unix/sysv/linux/timerfd_settime.c new file mode 100644 index 0000000000..019a1b66e0 --- /dev/null +++ b/sysdeps/unix/sysv/linux/timerfd_settime.c @@ -0,0 +1,85 @@ +/* timerfd_settime -- start or stop the timer referred to by file descriptor. + Copyright (C) 2019 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; see the file COPYING.LIB. If + not, see . */ + +#include +#include +#include +#include +#include + +int +__timerfd_settime64 (int fd, int flags, const struct __itimerspec64 *value, + struct __itimerspec64 *ovalue) +{ +#ifdef __ASSUME_TIME64_SYSCALLS +# ifndef __NR_timerfd_settime64 +# define __NR_timerfd_settime64 __NR_timerfd_settime +# endif + return INLINE_SYSCALL_CALL (timerfd_settime64, fd, flags, value, ovalue); +#else +# ifdef __NR_timerfd_settime64 + int ret = INLINE_SYSCALL_CALL (timerfd_settime64, fd, flags, value, ovalue); + if (ret == 0 || errno != ENOSYS) + return ret; +# endif + struct itimerspec its32, oits32; + + if (! in_time_t_range ((value->it_value).tv_sec) + || ! in_time_t_range ((value->it_interval).tv_sec)) + { + __set_errno (EOVERFLOW); + return -1; + } + + its32.it_interval = valid_timespec64_to_timespec (value->it_interval); + its32.it_value = valid_timespec64_to_timespec (value->it_value); + + int retval = INLINE_SYSCALL_CALL (timerfd_settime, fd, flags, + &its32, ovalue ? &oits32 : NULL); + if (retval == 0 && ovalue) + { + ovalue->it_interval = valid_timespec_to_timespec64 (oits32.it_interval); + ovalue->it_value = valid_timespec_to_timespec64 (oits32.it_value); + } + + return retval; +#endif +} + +#if __TIMESIZE != 64 +int +__timerfd_settime (int fd, int flags, const struct itimerspec *value, + struct itimerspec *ovalue) +{ + struct __itimerspec64 its64, oits64; + int retval; + + its64.it_interval = valid_timespec_to_timespec64 (value->it_interval); + its64.it_value = valid_timespec_to_timespec64 (value->it_value); + + retval = __timerfd_settime64 (fd, flags, &its64, ovalue ? &oits64 : NULL); + if (retval == 0 && ovalue) + { + ovalue->it_interval = valid_timespec64_to_timespec (oits64.it_interval); + ovalue->it_value = valid_timespec64_to_timespec (oits64.it_value); + } + + return retval; +} +#endif +strong_alias (__timerfd_settime, timerfd_settime)