From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-io1-xd43.google.com (mail-io1-xd43.google.com [IPv6:2607:f8b0:4864:20::d43]) by sourceware.org (Postfix) with ESMTPS id 608BF3857C5B for ; Mon, 21 Sep 2020 17:12:07 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 608BF3857C5B Received: by mail-io1-xd43.google.com with SMTP id r25so16270971ioj.0 for ; Mon, 21 Sep 2020 10:12:07 -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=pd6GG+d8klGhgAX53HBpW8cDLh3vcH/D04HcXGIvcmA=; b=O7Jffw8KG5gYCQ9Z/dqMeEcBPcjWLLp1xjrCgOf2tJF6fjPzfF6ObRAx8NdnRHV7Ec Nw/x2LXNeYA/4KzGJbB/Cc/PAcJor8nKuoQuUU+A4d0cHsMLS8JCkHuBMJEpFM0obdBG mAvyEsgPO/Q1fp0UoaBAzGnrkS1FY7MKnr++V2CS5JncvCSM7DZBeGdUu3cRxSPYmPqw BIcZwpsc4MXg2vZ8dvOrdUrV38VTGin9lqTJaqZEPfzlKiQa8kFkFnLB6kN2P91Uysvo p+Mzq8zxN3YmCYEXu7N3DsPncjPVQptyMEse1pzEshX7qolVwESPPh6kmQFUufzyH0Rj rJMQ== X-Gm-Message-State: AOAM532Qvtq8YDNM2jo6qlAYPcDz1ODUoCKD9ISUcpqSZf6rcyWw8Mcx FWSWGjKqIJJEAYjXslmyBPXLtWTNV2kq4O/PVHAjq8klLQA= X-Google-Smtp-Source: ABdhPJyHGSVAMyGb56Qzh8vznMdYnJFV9EFZLnuyqQqgJ15w5PifeJvcmFprlCxW+Cn9t2UsEwRPHsh1f9vHNuUbR6M= X-Received: by 2002:a02:3213:: with SMTP id j19mr819638jaa.135.1600708326704; Mon, 21 Sep 2020 10:12:06 -0700 (PDT) MIME-Version: 1.0 References: <20200919130759.31916-1-lukma@denx.de> <20200919130759.31916-2-lukma@denx.de> In-Reply-To: <20200919130759.31916-2-lukma@denx.de> From: Alistair Francis Date: Mon, 21 Sep 2020 10:00:54 -0700 Message-ID: Subject: Re: [PATCH v2 2/3] Y2038: nptl: Provide futex_abstimed_wait64 supporting 64 bit time To: Lukasz Majewski Cc: Joseph Myers , Paul Eggert , Adhemerval Zanella , Arnd Bergmann , Alistair Francis , GNU C Library , Florian Weimer , "Carlos O'Donell" , Stepan Golosunov , Andreas Schwab , Zack Weinberg , Jeff Law 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: Mon, 21 Sep 2020 17:12:08 -0000 On Sat, Sep 19, 2020 at 6:08 AM Lukasz Majewski wrote: > > This is the helper function, which uses struct __timespec64 > to provide 64 bit absolute time to futex syscalls. > > The aim of this function is to move convoluted pre-processor > macro code from sysdeps/nptl/lowlevellock-futex.h to C > function in futex-internal.c > > The futex_abstimed_wait64 function has been put into a separate > file on the purpose - to avoid issues apparent on the m68k > architecture related to small number of available registers (there > is not enough registers to put all necessary arguments in them if > the above function would be added to futex-internal.h with > __always_inline attribute). > > Additional precautions for m68k port have been taken - the > futex-internal.c file will be compiled with -fno-inline flag. Reviewed-by: Alistair Francis Alistair > > --- > Changes for v2: > - Handle the case when *abstime pointer is NULL > --- > sysdeps/nptl/futex-internal.c | 70 +++++++++++++++++++++++++++ > sysdeps/nptl/futex-internal.h | 6 +++ > sysdeps/unix/sysv/linux/m68k/Makefile | 2 + > 3 files changed, 78 insertions(+) > > diff --git a/sysdeps/nptl/futex-internal.c b/sysdeps/nptl/futex-internal.c > index 3366aac162..3211b4c94f 100644 > --- a/sysdeps/nptl/futex-internal.c > +++ b/sysdeps/nptl/futex-internal.c > @@ -45,6 +45,29 @@ __futex_abstimed_wait_cancelable32 (unsigned int* futex_word, > abstime != NULL ? &ts32 : NULL, > NULL /* Unused. */, FUTEX_BITSET_MATCH_ANY); > } > + > +static int > +__futex_abstimed_wait32 (unsigned int* futex_word, > + unsigned int expected, clockid_t clockid, > + const struct __timespec64* abstime, > + int private) > +{ > + struct timespec ts32; > + > + if (abstime != NULL && ! in_time_t_range (abstime->tv_sec)) > + return -EOVERFLOW; > + > + unsigned int clockbit = (clockid == CLOCK_REALTIME) ? > + FUTEX_CLOCK_REALTIME : 0; > + int op = __lll_private_flag (FUTEX_WAIT_BITSET | clockbit, private); > + > + if (abstime != NULL) > + ts32 = valid_timespec64_to_timespec (*abstime); > + > + return INTERNAL_SYSCALL_CALL (futex, futex_word, op, expected, > + abstime != NULL ? &ts32 : NULL, > + NULL /* Unused. */, FUTEX_BITSET_MATCH_ANY); > +} > #endif > > int > @@ -97,3 +120,50 @@ __futex_abstimed_wait_cancelable64 (unsigned int* futex_word, > futex_fatal_error (); > } > } > + > +int > +__futex_abstimed_wait64 (unsigned int* futex_word, unsigned int expected, > + clockid_t clockid, > + const struct __timespec64* abstime, int private) > +{ > + unsigned int clockbit; > + int err; > + > + /* Work around the fact that the kernel rejects negative timeout values > + despite them being valid. */ > + if (__glibc_unlikely ((abstime != NULL) && (abstime->tv_sec < 0))) > + return ETIMEDOUT; > + > + if (! lll_futex_supported_clockid(clockid)) > + return EINVAL; > + > + clockbit = (clockid == CLOCK_REALTIME) ? FUTEX_CLOCK_REALTIME : 0; > + int op = __lll_private_flag (FUTEX_WAIT_BITSET | clockbit, private); > + > + err = INTERNAL_SYSCALL_CALL (futex_time64, futex_word, op, expected, > + abstime, NULL /* Unused. */, > + FUTEX_BITSET_MATCH_ANY); > +#ifndef __ASSUME_TIME64_SYSCALLS > + if (err == -ENOSYS) > + err = __futex_abstimed_wait32 (futex_word, expected, > + clockid, abstime, private); > +#endif > + switch (err) > + { > + case 0: > + case -EAGAIN: > + case -EINTR: > + case -ETIMEDOUT: > + return -err; > + > + case -EFAULT: /* Must have been caused by a glibc or application bug. */ > + case -EINVAL: /* Either due to wrong alignment, unsupported > + clockid or due to the timeout not being > + normalized. Must have been caused by a glibc or > + application bug. */ > + case -ENOSYS: /* Must have been caused by a glibc bug. */ > + /* No other errors are documented at this time. */ > + default: > + futex_fatal_error (); > + } > +} > diff --git a/sysdeps/nptl/futex-internal.h b/sysdeps/nptl/futex-internal.h > index 7f3910ad98..1ba0d61938 100644 > --- a/sysdeps/nptl/futex-internal.h > +++ b/sysdeps/nptl/futex-internal.h > @@ -529,4 +529,10 @@ __futex_abstimed_wait_cancelable64 (unsigned int* futex_word, > const struct __timespec64* abstime, > int private) attribute_hidden; > > +int > +__futex_abstimed_wait64 (unsigned int* futex_word, unsigned int expected, > + clockid_t clockid, > + const struct __timespec64* abstime, > + int private) attribute_hidden; > + > #endif /* futex-internal.h */ > diff --git a/sysdeps/unix/sysv/linux/m68k/Makefile b/sysdeps/unix/sysv/linux/m68k/Makefile > index be40fae68a..65164c5752 100644 > --- a/sysdeps/unix/sysv/linux/m68k/Makefile > +++ b/sysdeps/unix/sysv/linux/m68k/Makefile > @@ -21,3 +21,5 @@ sysdep-dl-routines += dl-static > sysdep-others += lddlibc4 > install-bin += lddlibc4 > endif > + > +CFLAGS-futex-internal.c += -fno-inline > -- > 2.20.1 >