From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-io1-xd44.google.com (mail-io1-xd44.google.com [IPv6:2607:f8b0:4864:20::d44]) by sourceware.org (Postfix) with ESMTPS id BBD7C386EC76 for ; Fri, 11 Sep 2020 20:55:10 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org BBD7C386EC76 Received: by mail-io1-xd44.google.com with SMTP id u126so12464106iod.12 for ; Fri, 11 Sep 2020 13:55:10 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=r6yrSQPtxOTQNsWd2jgZB1X4l3uGEXoz14DgoPw9gDk=; b=LWQw+6cxXcqCeMO5NL6xUPBK9n5p3DcECbTPEoTpEAaOduzoXvk69eFWGbDM0Hqkx8 0P83YZO36Qif83yPzXcjqJnW+6JFJrpWy10HBCduyWVRc6V/gAfkLu0R0tjLR4epVAko dtSZHsdaF0WZ5DRvOn9uSNve25NuDCCBTcaQlsg24j/TB5JzEGRfqWNAMw8RCf/JXmz/ 31pbSW66wLaU7tN+LDC22U/ZNK16lbOol4O/r+vYOANB//PuIwQDaDFszWPqJzpTmQQc 95TnD0NFhBOkHXJrH1BW+1nJzaMitJ20qiFTntboWyKVV3VZBxOHF+amy4FtzWxT8l9v onGg== X-Gm-Message-State: AOAM5331BzGMZevzwS+mX3kaOAwaYbvx/Qo4uE4tX9lFOTB5iKLBZM00 2jjEDoPwE+KbkJpxVL+tOJfReY5itltpBXVFwWQ= X-Google-Smtp-Source: ABdhPJxgcTCHq152sPd3SARQtg/7ujaTmSB0Axufoe3aEbB0YfEyJxGk1gNRYWxfQ2SKWd3nRExmBZ7a4x2N7D6gm4o= X-Received: by 2002:a05:6602:15c5:: with SMTP id f5mr2256819iow.42.1599857710020; Fri, 11 Sep 2020 13:55:10 -0700 (PDT) MIME-Version: 1.0 References: <20200908145738.640039-1-adhemerval.zanella@linaro.org> <20200908145738.640039-5-adhemerval.zanella@linaro.org> In-Reply-To: <20200908145738.640039-5-adhemerval.zanella@linaro.org> From: Alistair Francis Date: Fri, 11 Sep 2020 13:44:07 -0700 Message-ID: Subject: Re: [PATCH v2 05/14] linux: Add time64 select support To: Adhemerval Zanella Cc: GNU C Library Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-9.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 11 Sep 2020 20:55:12 -0000 On Tue, Sep 8, 2020 at 7:59 AM Adhemerval Zanella via Libc-alpha wrote: > > The syscall __NR_pselect6_time64 (32-bit) or __NR_pselect6 (64-bit) > is used as default. For architectures with __ASSUME_TIME64_SYSCALLS > the 32-bit fallback uses __NR_select/__NR__newselect or __NR_pselect6 > (it should cover the microblaze case where older kernels do not > provide __NR_pselect6). > > Checked on x86_64-linux-gnu and i686-linux-gnu (on 5.4 and on 4.15 > kernel). Reviewed-by: Alistair Francis Alistair > --- > include/sys/select.h | 8 +++ > include/time.h | 6 +++ > sysdeps/unix/sysv/linux/select.c | 92 ++++++++++++++++++++++++-------- > 3 files changed, 83 insertions(+), 23 deletions(-) > > diff --git a/include/sys/select.h b/include/sys/select.h > index b5ae9af861..ec073deeba 100644 > --- a/include/sys/select.h > +++ b/include/sys/select.h > @@ -5,8 +5,11 @@ > /* Now define the internal interfaces. */ > # if __TIMESIZE == 64 > # define __pselect64 __pselect > +# define __select64 __select > #else > # include > +# include > + > extern int __pselect64 (int __nfds, fd_set *__readfds, > fd_set *__writefds, fd_set *__exceptfds, > const struct __timespec64 *__timeout, > @@ -18,6 +21,11 @@ extern int __pselect32 (int __nfds, fd_set *__readfds, > const struct __timespec64 *__timeout, > const __sigset_t *__sigmask) > attribute_hidden; > + > +extern int __select64 (int __nfds, fd_set *__readfds, > + fd_set *__writefds, fd_set *__exceptfds, > + struct __timeval64 *__timeout); > +libc_hidden_proto (__select64) > #endif > extern int __pselect (int __nfds, fd_set *__readfds, > fd_set *__writefds, fd_set *__exceptfds, > diff --git a/include/time.h b/include/time.h > index fe4da9ca10..936486e206 100644 > --- a/include/time.h > +++ b/include/time.h > @@ -464,6 +464,12 @@ valid_timespec_to_timeval32 (const struct timespec ts) > return (struct __timeval32) { (time_t) ts.tv_sec, ts.tv_nsec / 1000 }; > } > > +static inline struct __timeval64 > +valid_timespec_to_timeval64 (const struct timespec ts) > +{ > + return (struct __timeval64) { (time_t) ts.tv_sec, ts.tv_nsec / 1000 }; > +} > + > /* Check if a value is in the valid nanoseconds range. Return true if > it is, false otherwise. */ > static inline bool > diff --git a/sysdeps/unix/sysv/linux/select.c b/sysdeps/unix/sysv/linux/select.c > index 54c50edba2..bed52fbda2 100644 > --- a/sysdeps/unix/sysv/linux/select.c > +++ b/sysdeps/unix/sysv/linux/select.c > @@ -21,6 +21,7 @@ > #include > #include > #include > +#include > > /* Check the first NFDS descriptors each in READFDS (if not NULL) for read > readiness, in WRITEFDS (if not NULL) for write readiness, and in EXCEPTFDS > @@ -28,43 +29,88 @@ > after waiting the interval specified therein. Returns the number of ready > descriptors, or -1 for errors. */ > > -#ifdef __NR__newselect > -# undef __NR_select > -# define __NR_select __NR__newselect > -#endif > - > int > -__select (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, > - struct timeval *timeout) > +__select64 (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, > + struct __timeval64 *timeout) > { > -#ifdef __NR_select > - return SYSCALL_CANCEL (select, nfds, readfds, writefds, exceptfds, > - timeout); > -#else > - int result; > - struct timespec ts, *tsp = NULL; > - > - if (timeout) > + struct __timespec64 ts64, *pts64 = NULL; > + if (timeout != NULL) > { > - TIMEVAL_TO_TIMESPEC (timeout, &ts); > - tsp = &ts; > + ts64 = timeval64_to_timespec64 (*timeout); > + pts64 = &ts64; > } > > - result = SYSCALL_CANCEL (pselect6, nfds, readfds, writefds, exceptfds, tsp, > - NULL); > - > - if (timeout) > +#ifndef __NR_pselect6_time64 > +# define __NR_pselect6_time64 __NR_pselect6 > +#endif > + int r; > + if (supports_time64 ()) > { > + r = SYSCALL_CANCEL (pselect6_time64, nfds, readfds, writefds, exceptfds, > + pts64, NULL); > /* Linux by default will update the timeout after a pselect6 syscall > (though the pselect() glibc call suppresses this behavior). > Since select() on Linux has the same behavior as the pselect6 > syscall, we update the timeout here. */ > - TIMESPEC_TO_TIMEVAL (timeout, &ts); > + if (r == 0 || errno != ENOSYS) > + { > + if (timeout != NULL) > + TIMEVAL_TO_TIMESPEC (timeout, &ts64); > + return r; > + } > + > + mark_time64_unsupported (); > } > > - return result; > +#ifndef __ASSUME_TIME64_SYSCALLS > + struct timespec ts32, *pts32 = NULL; > + if (timeout != NULL) > + { > + if (! in_time_t_range (timeout->tv_sec)) > + { > + __set_errno (EINVAL); > + return -1; > + } > + ts32 = valid_timespec64_to_timespec (ts64); > + pts32 = &ts32; > + } > +# ifndef __ASSUME_PSELECT > +# ifdef __NR__newselect > +# undef __NR_select > +# define __NR_select __NR__newselect > +# endif > + r = SYSCALL_CANCEL (select, nfds, readfds, writefds, exceptfds, pts32); > +# else > + r = SYSCALL_CANCEL (pselect6, nfds, readfds, writefds, exceptfds, pts32, > + NULL); > +# endif > + if (r >= 0 && timeout != NULL) > + *timeout = valid_timespec_to_timeval64 (ts32); > #endif > + > + return r; > } > + > +#if __TIMESIZE != 64 > +libc_hidden_def (__select64) > + > +int > +__select (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, > + struct timeval *timeout) > +{ > + struct __timeval64 tv64, *ptv64 = NULL; > + if (timeout != NULL) > + { > + tv64 = valid_timeval_to_timeval64 (*timeout); > + ptv64 = &tv64; > + } > + int r = __select64 (nfds, readfds, writefds, exceptfds, ptv64); > + if (r >= 0 && timeout != NULL) > + /* The remanining timeout will be always less the input TIMEOUT. */ > + *timeout = valid_timeval64_to_timeval (tv64); > + return r; > +} > +#endif > libc_hidden_def (__select) > > weak_alias (__select, select) > -- > 2.25.1 >