From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-qv1-xf2f.google.com (mail-qv1-xf2f.google.com [IPv6:2607:f8b0:4864:20::f2f]) by sourceware.org (Postfix) with ESMTPS id 3D8193894418 for ; Thu, 17 Jun 2021 11:51:33 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 3D8193894418 Received: by mail-qv1-xf2f.google.com with SMTP id ct13so1259940qvb.12 for ; Thu, 17 Jun 2021 04:51:33 -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=wxL+wuLse+5RJPiXxK/95JTd55PjtaKahV36/7G2LDo=; b=liEXYxqSlC5jaceC8rmiqEAHxf7J0nQFP+zki8k0PTE/37iA8cWG3f7ugcnYg9N7QF gVn8GIghRiEqHJeMH0KTn7a4Ke3RkUOIYEArW3TJjGYTkanNxDL8ar/kzekYN3M5O5xq CJGwPdfKeptedkjF23Zv4h2jLby0U8kwX+UvfuCEEzDKM1mVxO9iqWiAqXxkAnSa//4x KYRRe4jemNHao/2Eef5Ct1cA6fck+8nUtc84isvyyek7GC+rwOz5vC+d6rjkGeULt9Li eDxHE/68o92SiQO4bRiwfHYf4WczwjJzAI9lY1sw5/b83ST3hbJuitxvATqwPhTIT7Vq V4Vg== X-Gm-Message-State: AOAM530SXBjY6B4GfonUkqTS10AytkpQdMSJ8VJSbI+xXcQbs7AFeTGB ITir9VukOZOampuJq/glvsRg5Wd7vLgxPg== X-Google-Smtp-Source: ABdhPJzKSIxeHsWiYgrTy9SXSGrastLllBbeD6FtgT1gOpAgXfmnBHDarQ3TUo7kQ7/FnDgodBONEQ== X-Received: by 2002:a0c:f085:: with SMTP id g5mr5606434qvk.18.1623930692733; Thu, 17 Jun 2021 04:51:32 -0700 (PDT) Received: from birita.. ([177.194.59.218]) by smtp.googlemail.com with ESMTPSA id p12sm3016435qtw.61.2021.06.17.04.51.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 17 Jun 2021 04:51:32 -0700 (PDT) From: Adhemerval Zanella To: libc-alpha@sourceware.org, Lukasz Majewski , Carlos O'Donell Subject: [PATCH 14/18] linux: Only use 64-bit syscall if required for mq_timedsend Date: Thu, 17 Jun 2021 08:51:00 -0300 Message-Id: <20210617115104.1359598-15-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 Content-Transfer-Encoding: 8bit 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-List-Received-Date: Thu, 17 Jun 2021 11:51:34 -0000 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. --- rt/tst-mqueue10.c | 10 ++++++++ sysdeps/unix/sysv/linux/mq_timedsend.c | 35 ++++++++++++++------------ 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/rt/tst-mqueue10.c b/rt/tst-mqueue10.c index 7fb53a1cae..18795808e0 100644 --- a/rt/tst-mqueue10.c +++ b/rt/tst-mqueue10.c @@ -54,6 +54,16 @@ do_test (void) support_delete_timer (timer); } + { + timer_t timer = support_create_timer (0, 100000000, false, NULL); + /* Fill the internal buffer first. */ + TEST_COMPARE (mq_timedsend (q, msg, sizeof (msg), 0, + &(struct timespec) { 0, 0 }), 0); + TEST_COMPARE (mq_timedsend (q, msg, sizeof (msg), 0, &ts), -1); + TEST_VERIFY (errno == EINTR || errno == EOVERFLOW); + support_delete_timer (timer); + } + mq_unlink (name); return 0; diff --git a/sysdeps/unix/sysv/linux/mq_timedsend.c b/sysdeps/unix/sysv/linux/mq_timedsend.c index 5f14ecb0bf..8fa8c010ad 100644 --- a/sysdeps/unix/sysv/linux/mq_timedsend.c +++ b/sysdeps/unix/sysv/linux/mq_timedsend.c @@ -29,30 +29,33 @@ __mq_timedsend_time64 (mqd_t mqdes, const char *msg_ptr, size_t msg_len, # ifndef __NR_mq_timedsend_time64 # define __NR_mq_timedsend_time64 __NR_mq_timedsend # endif - int ret = SYSCALL_CANCEL (mq_timedsend_time64, mqdes, msg_ptr, msg_len, - msg_prio, abs_timeout); -#ifndef __ASSUME_TIME64_SYSCALLS - if (ret == 0 || errno != ENOSYS) - return ret; +#ifdef __ASSUME_TIME64_SYSCALLS + return SYSCALL_CANCEL (mq_timedsend_time64, mqdes, msg_ptr, msg_len, + msg_prio, abs_timeout); +#else + bool is32bit = abs_timeout != NULL + ? in_time_t_range (abs_timeout->tv_sec) : true; + if (!is32bit) + { + int r = SYSCALL_CANCEL (mq_timedsend_time64, mqdes, msg_ptr, msg_len, + msg_prio, abs_timeout); + if (r == 0 || errno != ENOSYS) + return r; + __set_errno (EOVERFLOW); + return -1; + } - struct timespec ts32; + struct timespec ts32, *pts32 = NULL; if (abs_timeout != NULL) { - if (! in_time_t_range (abs_timeout->tv_sec)) - { - __set_errno (EOVERFLOW); - return -1; - } - ts32 = valid_timespec64_to_timespec (*abs_timeout); + pts32 = &ts32; } - ret = SYSCALL_CANCEL (mq_timedsend, mqdes, msg_ptr, msg_len, msg_prio, - abs_timeout != NULL ? &ts32 : NULL); + return SYSCALL_CANCEL (mq_timedsend, mqdes, msg_ptr, msg_len, msg_prio, + pts32); #endif - - return ret; } #if __TIMESIZE != 64 -- 2.30.2