From patchwork Fri Feb 14 09:17:30 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lukasz Majewski X-Patchwork-Id: 1237939 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=libc-alpha-return-109729-incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=denx.de Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.a=rsa-sha1 header.s=default header.b=RFjyDb2l; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48Jnq429hqz9sRN for ; Fri, 14 Feb 2020 20:18:08 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; q=dns; s= default; b=f/WYksrP3ZgPei2FuA3DnSnXVTCeC9edCfY7SSa6eC06aHgUIywzV T2Pldp8YxUnmEORxHGcUdG6fR3qwMN44cAZDCFd/ACwfRmRlB59dbR041d2ZGzqv p2pYFogQcIP8J7spTXDtRj7P2gglh7JUUlzqfzKFMKalFKnlWa/N1o= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; s=default; bh=DrFx/JD9et3T/rNuHAj1EokLIxg=; b=RFjyDb2lfse9rNn/XvdMRQznMSPY uEQR4TGzy+TJ92EyT2YkEEZ7pkAqqCaHo2devpaK03DX2YDz7h95zz0iJ7LpEZtu Z/VVsrEH9YZmmtMnw+d0RI0Fd+OGxdOCZs0lHdpwl1Dk/O6vhU7v0gjjoz+cQ28n ZHDmIn2Brmf3kP0= Received: (qmail 32645 invoked by alias); 14 Feb 2020 09:17:53 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 32630 invoked by uid 89); 14 Feb 2020 09:17:53 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-21.6 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.1 spammy=contemporary, Moreover, 5.1, 51 X-HELO: mail-out.m-online.net From: Lukasz Majewski To: Joseph Myers , Paul Eggert , Adhemerval Zanella Cc: Alistair Francis , Alistair Francis , GNU C Library , Siddhesh Poyarekar , Florian Weimer , Florian Weimer , Zack Weinberg , Carlos O'Donell , Andreas Schwab , Vineet Gupta , Lukasz Majewski Subject: [PATCH v2 2/3] y2038: linux: Provide __mq_timedsend_time64 implementation Date: Fri, 14 Feb 2020 10:17:30 +0100 Message-Id: <20200214091731.14552-2-lukma@denx.de> In-Reply-To: <20200214091731.14552-1-lukma@denx.de> References: <20200214091731.14552-1-lukma@denx.de> MIME-Version: 1.0 This patch provides new __mq_timedsend_time64 explicit 64 bit function for sending messages with absolute timeout. Moreover, a 32 bit version - __mq_timedsend has been refactored to internally use __mq_timedsend_time64. The __mq_timedsend is now supposed to be used on systems still supporting 32 bit time (__TIMESIZE != 64) - hence the necessary conversion to 64 bit struct __timespec64 from struct timespec. The new __mq_timedsend_time64 syscall available from Linux 5.1+ has been used, when applicable. As this wrapper function is also used internally in the glibc, to e.g. provide mq_send implementation, an explicit check for abs_timeout being NULL has been added due to conversions between struct timespec and struct __timespec64. Before this change the Linux kernel handled this NULL pointer. Build tests: - ./src/scripts/build-many-glibcs.py glibcs Run-time tests: - Run specific tests on ARM/x86 32bit systems (qemu): https://github.com/lmajewski/meta-y2038 and run tests: https://github.com/lmajewski/y2038-tests/commits/master Linux kernel, headers and minimal kernel version for glibc build test matrix: - Linux v5.1 (with mq_timedsend_time64) and glibc built with v5.1 as a minimal kernel version (--enable-kernel="5.1.0") The __ASSUME_TIME64_SYSCALLS flag defined. - Linux v5.1 and default minimal kernel version The __ASSUME_TIME64_SYSCALLS not defined, but kernel supports mq_timedsend_time64 syscall. - Linux v4.19 (no mq_timedsend_time64 support) with default minimal kernel version for contemporary glibc (3.2.0) This kernel doesn't support mq_timedsend_time64 syscall, so the fallback to mq_timedsend is tested. Above tests were performed with Y2038 redirection applied as well as without (so the __TIMESIZE != 64 execution path is checked as well). --- Changes for v2: - Fix indentation for __mq_timedsend - #include instead of --- include/mqueue.h | 9 +++++ sysdeps/unix/sysv/linux/mq_timedsend.c | 49 ++++++++++++++++++++++++-- 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/include/mqueue.h b/include/mqueue.h index 3c66f1711e..81d30dbdf7 100644 --- a/include/mqueue.h +++ b/include/mqueue.h @@ -10,4 +10,13 @@ extern __typeof (mq_timedreceive) __mq_timedreceive __nonnull ((2, 5)); hidden_proto (__mq_timedreceive) hidden_proto (mq_setattr) # endif +#if __TIMESIZE == 64 +# define __mq_timedsend_time64 __mq_timedsend +#else +# include +extern int __mq_timedsend_time64 (mqd_t mqdes, const char *msg_ptr, + size_t msg_len, unsigned int msg_prio, + const struct __timespec64 *abs_timeout); +librt_hidden_proto (__mq_timedsend_time64) +#endif #endif diff --git a/sysdeps/unix/sysv/linux/mq_timedsend.c b/sysdeps/unix/sysv/linux/mq_timedsend.c index 888ec6744a..0d5a860c48 100644 --- a/sysdeps/unix/sysv/linux/mq_timedsend.c +++ b/sysdeps/unix/sysv/linux/mq_timedsend.c @@ -22,12 +22,55 @@ /* Add message pointed by MSG_PTR to message queue MQDES, stop blocking on full message queue if ABS_TIMEOUT expires. */ int -__mq_timedsend (mqd_t mqdes, const char *msg_ptr, size_t msg_len, - unsigned int msg_prio, const struct timespec *abs_timeout) +__mq_timedsend_time64 (mqd_t mqdes, const char *msg_ptr, size_t msg_len, + unsigned int msg_prio, + const struct __timespec64 *abs_timeout) { +#ifdef __ASSUME_TIME64_SYSCALLS +# ifndef __NR_mq_timedsend_time64 +# define __NR_mq_timedsend_time64 __NR_mq_timedsend +# endif + return SYSCALL_CANCEL (mq_timedsend_time64, mqdes, msg_ptr, msg_len, msg_prio, + abs_timeout); +#else + int ret = SYSCALL_CANCEL (mq_timedsend_time64, mqdes, msg_ptr, msg_len, + msg_prio, abs_timeout); + if (ret == 0 || errno != ENOSYS) + return ret; + + struct timespec ts32; + if (abs_timeout) + { + if (! in_time_t_range (abs_timeout->tv_sec)) + { + __set_errno (EOVERFLOW); + return -1; + } + + ts32 = valid_timespec64_to_timespec (*abs_timeout); + } + return SYSCALL_CANCEL (mq_timedsend, mqdes, msg_ptr, msg_len, msg_prio, - abs_timeout); + abs_timeout ? &ts32 : NULL); +#endif +} + +#if __TIMESIZE != 64 +librt_hidden_def (__mq_timedsend_time64) + +int +__mq_timedsend (mqd_t mqdes, const char *msg_ptr, size_t msg_len, + unsigned int msg_prio, const struct timespec *abs_timeout) +{ + struct __timespec64 ts64; + if (abs_timeout) + ts64 = valid_timespec_to_timespec64 (*abs_timeout); + + return __mq_timedsend_time64 (mqdes, msg_ptr, msg_len, msg_prio, + abs_timeout ? &ts64 : NULL); } +#endif + hidden_def (__mq_timedsend) weak_alias (__mq_timedsend, mq_timedsend) hidden_weak (mq_timedsend)