From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/13146 Path: news.gmane.org!.POSTED!not-for-mail From: Peter Hurley Newsgroups: gmane.linux.lib.musl.general Subject: Re: [PATCH] Preserve select() behavior on arm64 Date: Tue, 28 Aug 2018 23:11:12 -0700 Message-ID: References: <20180525205240.20319-1-peter@meraki.com> Reply-To: musl@lists.openwall.com NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" X-Trace: blaine.gmane.org 1535522965 5663 195.159.176.226 (29 Aug 2018 06:09:25 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Wed, 29 Aug 2018 06:09:25 +0000 (UTC) Cc: Peter Hurley To: musl@lists.openwall.com Original-X-From: musl-return-13162-gllmg-musl=m.gmane.org@lists.openwall.com Wed Aug 29 08:09:20 2018 Return-path: Envelope-to: gllmg-musl@m.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by blaine.gmane.org with smtp (Exim 4.84_2) (envelope-from ) id 1futfL-0001Ni-6D for gllmg-musl@m.gmane.org; Wed, 29 Aug 2018 08:09:19 +0200 Original-Received: (qmail 24020 invoked by uid 550); 29 Aug 2018 06:11:26 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Original-Received: (qmail 23973 invoked from network); 29 Aug 2018 06:11:25 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=meraki.com; s=google; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=o5OZQoX/SvuKad83HuvKkvpOAoyzsKwud0VGuiZ88ho=; b=AzemD2BEPjDCbxCSLUg69/GkO8OvBVuA7tcNRDlBZR54bEqH5iN0LG7J2JTt45Blbs K2rMKh8cMpB6XzuKPdJPilvb2naNpvKfsaLm1PdBmmvFZWswROov/JCDgX2/u2SVpUJP djiWUqreyo4O6no6XXNYg93/JyXK2W7qK3TZE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=o5OZQoX/SvuKad83HuvKkvpOAoyzsKwud0VGuiZ88ho=; b=C5sF3+elcbLU8vf6toAsr/7zPEhg+UYtUakAjBzNCedY1BAobVcFhD3oFVm0nuzjvi Z+qLQ5YUSbRMpGivzetj0FQpDlPaV7r8Ts2hAGwluURFYirzNJXx216CqT4baWeoKg5Y fzQv6WjfJP4HAY56igQWPGmzTqsBUKITaQEW0LUmb7/RNjqgwGKbUw/YIU4QO7aWOgZ6 kV45ItVF9RvGd0Wzd7wDZJw1lUgVezWYju51+zVUHJuAiXoSJ3+SOqyJv/tsZE6OfeWO vU183wER4mAFg5kTL1aYCGYCqZZ5dw5MHQM0/893cFR8edcb/AIT5geH85ig7L6lkHl4 cf6Q== X-Gm-Message-State: APzg51CCd4MUgWIXG0iTxHG/MDWTx0OFzSNrBAZjBlJQCQ6gm5NEUOvi QG0EW+v38wyJ9Q3ged82YNZqw5qCcDygL9rv7YlfTGIw X-Google-Smtp-Source: ANB0Vdawcf/G0ApqziV7TzPQ6GGiZTUQ6pdT47uOc2rz8b2+nIlp38clA9aBrQ0wlAcmC3V/9ooRn/qKwOnQBso7rME= X-Received: by 2002:a02:ad14:: with SMTP id s20-v6mr4223432jan.132.1535523073471; Tue, 28 Aug 2018 23:11:13 -0700 (PDT) In-Reply-To: <20180525205240.20319-1-peter@meraki.com> Xref: news.gmane.org gmane.linux.lib.musl.general:13146 Archived-At: Ping? On Fri, May 25, 2018 at 1:52 PM, Peter Hurley wrote: > On Linux, all the select-related syscalls update the timeout value to > indicate how much elapsed time the syscall consumed, and many programs > expect this behavior when running on Linux. > > Newer archs like arm64 have deprecated the select syscall because the > pselect syscall is a superset implementation of the select syscall. > > A complication of implementing select() with the pselect syscall is > that the timeouts are specified in different units; select() accepts > a struct timeval ptr whereas the pselect syscall takes a struct > timespec ptr. These are trivial convertible; struct timeval is > specified in seconds + microseconds and struct timespec is in > seconds + nanoseconds. > > For kernel configurations without select syscall available, update the > caller's struct timeval argument after the pselect syscall. > --- > src/select/select.c | 17 +++++++++-------- > 1 file changed, 9 insertions(+), 8 deletions(-) > > diff --git a/src/select/select.c b/src/select/select.c > index 7b5f6dcf7a53..45d4cb7a3d0a 100644 > --- a/src/select/select.c > +++ b/src/select/select.c > @@ -12,15 +12,16 @@ int select(int n, fd_set *restrict rfds, fd_set *restrict wfds, fd_set *restrict > #else > syscall_arg_t data[2] = { 0, _NSIG/8 }; > struct timespec ts; > + int result; > if (tv) { > - if (tv->tv_sec < 0 || tv->tv_usec < 0) > - return __syscall_ret(-EINVAL); > - time_t extra_secs = tv->tv_usec / 1000000; > - ts.tv_nsec = tv->tv_usec % 1000000 * 1000; > - const time_t max_time = (1ULL<<8*sizeof(time_t)-1)-1; > - ts.tv_sec = extra_secs > max_time - tv->tv_sec ? > - max_time : tv->tv_sec + extra_secs; > + ts->tv_sec = tv->tv_sec; > + ts->tv_nsec = tv->usec * 1000; > } > - return syscall_cp(SYS_pselect6, n, rfds, wfds, efds, tv ? &ts : 0, data); > + result = syscall_cp(SYS_pselect6, n, rfds, wfds, efds, tv ? &ts : 0, data); > + if (tv) { > + tv->tv_sec = ts->tv_sec; > + tv->tv_usec = ts->tv_nsec / 1000; > + } > + return result; > #endif > } > -- > 2.14.2 >