From patchwork Thu Jun 17 11:51:03 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 43878 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 1E8D9393A424 for ; Thu, 17 Jun 2021 12:05:43 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 1E8D9393A424 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1623931543; bh=aamX2mJCUM2UOfO081QDbVpP30oU1VkUORJIMKTW5qQ=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=RkjgyRYxJsVKBjUy/l3yasQcwmR6Gv0jyaUfR+IfeHvxEaIVC6DvhZNCWbUW7COLT hbBEhOsclNJxMtr7lK+SqcNzgm1rHwJHhCT7fm0hdFomMnGfaio6gJmTn4X2GoGsGR IB1VOmy0hc79DU71uYjog8hDf2yQW+TYB8pjqpBw= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-qk1-x734.google.com (mail-qk1-x734.google.com [IPv6:2607:f8b0:4864:20::734]) by sourceware.org (Postfix) with ESMTPS id E8243385383A for ; Thu, 17 Jun 2021 11:51:37 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E8243385383A Received: by mail-qk1-x734.google.com with SMTP id c138so2778265qkg.5 for ; Thu, 17 Jun 2021 04:51:37 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=aamX2mJCUM2UOfO081QDbVpP30oU1VkUORJIMKTW5qQ=; b=dyMExEB5EZneLM6N+AwwvRejJ+jRQ0lS2Yodz+nPruP+ul+29grG8iBpQZE2rLqxpk R4iJPoFxlzeCM7bULGJaWGYIHT2ODt1zyoYan/Xb7XMk/hkIwajAr+Y4E9paenoPMx9v mQ68wTItkoa0hJjp061JP8NBukVc7++HtReUS/KopmbL5vlt9vJ+e9kC1BXFLEO/ngvo JYfD/p1M/G4a22rJcU3s4EshDcPwErU4aqZQH5XCpu53MZ6ouKYa7TLdH5K7Wh7k7ikS 1pnjl2afKIo91B0CMwS4rnvSa0YQoWldMK5F0THlfToYCld1cVROt2ErmO2qET11bpQn TbZw== X-Gm-Message-State: AOAM532QAQRFDMttijamYDVfHn9nZJP/uFpOOrVl+OMRrOtDds8GswIQ gBtNkTboCJbvhQAalH9Z47gUaWtl/p9tmw== X-Google-Smtp-Source: ABdhPJzwjLDMIupouEQMMj2kfYfwkILtl5vP4xbC3pINMLX58SqrWCgxgbTyy6vEcH8e+iXBwfh0bw== X-Received: by 2002:ae9:ed02:: with SMTP id c2mr3414689qkg.128.1623930697419; Thu, 17 Jun 2021 04:51:37 -0700 (PDT) Received: from birita.. ([177.194.59.218]) by smtp.googlemail.com with ESMTPSA id p12sm3016435qtw.61.2021.06.17.04.51.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 17 Jun 2021 04:51:37 -0700 (PDT) To: libc-alpha@sourceware.org, Lukasz Majewski , Carlos O'Donell Subject: [PATCH 17/18] linux: Only use 64-bit syscall if required for internal futex Date: Thu, 17 Jun 2021 08:51:03 -0300 Message-Id: <20210617115104.1359598-18-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210617115104.1359598-1-adhemerval.zanella@linaro.org> References: <20210617115104.1359598-1-adhemerval.zanella@linaro.org> MIME-Version: 1.0 X-Spam-Status: No, score=-12.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, 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-Patchwork-Original-From: Adhemerval Zanella via Libc-alpha From: Adhemerval Zanella Reply-To: Adhemerval Zanella Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" For !__ASSUME_TIME64_SYSCALLS there is no need to issue a 64-bit syscall if the provided timeout fits in a 32-bit one. The 64-bit usage should be rare since the timeout is a relative one. Checked on i686-linux-gnu on a 4.15 kernel and on a 5.11 kernel (with and without --enable-kernel=5.1) and on x86_64-linux-gnu. Reviewed-by: Lukasz Majewski --- nptl/futex-internal.c | 52 +++++++++++++++++++++++------------ sysdeps/nptl/futex-internal.h | 24 ++++++++++------ 2 files changed, 50 insertions(+), 26 deletions(-) diff --git a/nptl/futex-internal.c b/nptl/futex-internal.c index 850bf4fd83..277e60986e 100644 --- a/nptl/futex-internal.c +++ b/nptl/futex-internal.c @@ -32,9 +32,6 @@ __futex_abstimed_wait_common32 (unsigned int* futex_word, struct timespec ts32, *pts32 = NULL; if (abstime != NULL) { - if (! in_time_t_range (abstime->tv_sec)) - return -EOVERFLOW; - ts32 = valid_timespec64_to_timespec (*abstime); pts32 = &ts32; } @@ -52,12 +49,28 @@ __futex_abstimed_wait_common32 (unsigned int* futex_word, static int __futex_abstimed_wait_common64 (unsigned int* futex_word, - unsigned int expected, clockid_t clockid, + unsigned int expected, int op, const struct __timespec64* abstime, int private, bool cancel) { - unsigned int clockbit; + if (cancel) + return INTERNAL_SYSCALL_CANCEL (futex_time64, futex_word, op, expected, + abstime, NULL /* Unused. */, + FUTEX_BITSET_MATCH_ANY); + else + return INTERNAL_SYSCALL_CALL (futex_time64, futex_word, op, expected, + abstime, NULL /* Ununsed. */, + FUTEX_BITSET_MATCH_ANY); +} + +static int +__futex_abstimed_wait_common (unsigned int* futex_word, + unsigned int expected, clockid_t clockid, + const struct __timespec64* abstime, + int private, bool cancel) +{ int err; + unsigned int clockbit; /* Work around the fact that the kernel rejects negative timeout values despite them being valid. */ @@ -70,16 +83,19 @@ __futex_abstimed_wait_common64 (unsigned int* futex_word, clockbit = (clockid == CLOCK_REALTIME) ? FUTEX_CLOCK_REALTIME : 0; int op = __lll_private_flag (FUTEX_WAIT_BITSET | clockbit, private); - if (cancel) - err = INTERNAL_SYSCALL_CANCEL (futex_time64, futex_word, op, expected, - abstime, NULL /* Unused. */, - FUTEX_BITSET_MATCH_ANY); +#ifdef __ASSUME_TIME64_SYSCALLS + err = __futex_abstimed_wait_common64 (futex_word, expected, op, abstime, + private, cancel); +#else + bool is32bit = abstime != NULL ? in_time_t_range (abstime->tv_sec) : true; + if (!is32bit) + { + err = __futex_abstimed_wait_common64 (futex_word, expected, op, abstime, + private, cancel); + if (err == -ENOSYS) + err = -EOVERFLOW; + } else - err = INTERNAL_SYSCALL_CALL (futex_time64, futex_word, op, expected, - abstime, NULL /* Ununsed. */, - FUTEX_BITSET_MATCH_ANY); -#ifndef __ASSUME_TIME64_SYSCALLS - if (err == -ENOSYS) err = __futex_abstimed_wait_common32 (futex_word, expected, op, abstime, private, cancel); #endif @@ -109,8 +125,8 @@ __futex_abstimed_wait64 (unsigned int* futex_word, unsigned int expected, clockid_t clockid, const struct __timespec64* abstime, int private) { - return __futex_abstimed_wait_common64 (futex_word, expected, clockid, - abstime, private, false); + return __futex_abstimed_wait_common (futex_word, expected, clockid, + abstime, private, false); } libc_hidden_def (__futex_abstimed_wait64) @@ -120,7 +136,7 @@ __futex_abstimed_wait_cancelable64 (unsigned int* futex_word, const struct __timespec64* abstime, int private) { - return __futex_abstimed_wait_common64 (futex_word, expected, clockid, - abstime, private, true); + return __futex_abstimed_wait_common (futex_word, expected, clockid, + abstime, private, true); } libc_hidden_def (__futex_abstimed_wait_cancelable64) diff --git a/sysdeps/nptl/futex-internal.h b/sysdeps/nptl/futex-internal.h index 969ab2bf4b..b54fdd44c1 100644 --- a/sysdeps/nptl/futex-internal.h +++ b/sysdeps/nptl/futex-internal.h @@ -254,15 +254,23 @@ static __always_inline int futex_lock_pi64 (int *futex_word, const struct __timespec64 *abstime, int private) { - int err = INTERNAL_SYSCALL_CALL (futex_time64, futex_word, - __lll_private_flag - (FUTEX_LOCK_PI, private), 0, abstime); -#ifndef __ASSUME_TIME64_SYSCALLS - if (err == -ENOSYS) + int err; +#ifdef __ASSUME_TIME64_SYSCALLS + err = INTERNAL_SYSCALL_CALL (futex_time64, futex_word, + __lll_private_flag (FUTEX_LOCK_PI, private), 0, + abstime); +#else + bool is32bit = abstime != NULL ? in_time_t_range (abstime->tv_sec) : true; + if (!is32bit) + { + err = INTERNAL_SYSCALL_CALL (futex_time64, futex_word, + __lll_private_flag (FUTEX_LOCK_PI, private), + 0, abstime); + if (err == -ENOSYS) + err = -EOVERFLOW; + } + else { - if (abstime != NULL && ! in_time_t_range (abstime->tv_sec)) - return EOVERFLOW; - struct timespec ts32; if (abstime != NULL) ts32 = valid_timespec64_to_timespec (*abstime);