From patchwork Tue Sep 5 20:34:21 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 75331 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 93755385843A for ; Tue, 5 Sep 2023 20:34:56 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 93755385843A DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1693946096; bh=yBmAAI/0rmLzm88o0wk1jXX8TkdqU7haUeR+uv71ZBs=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=J0y/WBW6DVozsML3W5ZoPHjzp8ZctUIfglDNBkRRUOYU4NcDtSlpcD6X8Hr4hXh/i gn3/XQPd83Kd/PX8ddnOJM0ARp3tOKKSbHz9JpaGjSZ4OS/sWBu/2Txf90dd3y4YQe hI97CLo3SYnKeyOuvWMryJywERNwQHC8pnhKmyLY= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-oo1-xc2f.google.com (mail-oo1-xc2f.google.com [IPv6:2607:f8b0:4864:20::c2f]) by sourceware.org (Postfix) with ESMTPS id 494443858C1F for ; Tue, 5 Sep 2023 20:34:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 494443858C1F Received: by mail-oo1-xc2f.google.com with SMTP id 006d021491bc7-5735282d713so1831233eaf.2 for ; Tue, 05 Sep 2023 13:34:28 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1693946067; x=1694550867; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=yBmAAI/0rmLzm88o0wk1jXX8TkdqU7haUeR+uv71ZBs=; b=AuACVOCmKxEiYIIekSkSL78VOsjhdQCcj2Wke3m8XPi8D8RYGksPEvkRTLGsId2W3z CdTLND2Fn7RD6ae82uFIBL6zN48ijQRIlrmXfMfp0JO/5v9eOWgf3Z7zxuoUna+wjYJm ANTZ07Qd0BrGdUiTOFLMOQgLqndrDkDTYlbNuesQKJnMg6ZlZl9wOx2+Z72B8P3zIlaY KlWB88gLL7LdLFy783P9qkfgjV6fwOghibjQPFQhHfHx77Kah701vLXixWeN9grPunSs 4NtRGxtEP2CLzozzD3/l3FBk3BpjTlTh1GHMWqly2L3XCuqq4XBNBgmK3Bz7e4k31WdZ s75g== X-Gm-Message-State: AOJu0YwvKkp8jMZYjbvQhqR+KGlEbe1c7VZFmmjdaVpdwOEzSaCIbT5p YmyuQGyChA6GqBAgo+jcwKP3upSWzwQgdJAyFNI0nA== X-Google-Smtp-Source: AGHT+IHTY+KNL25IR0oOz56dj/PpTJQXNVbx+Ov6p3OZvozTIo/t6T8avhRb9CnF1I6DZkNDx3w7mQ== X-Received: by 2002:a05:6820:284:b0:573:3fe0:cdd6 with SMTP id q4-20020a056820028400b005733fe0cdd6mr13336670ood.6.1693946066808; Tue, 05 Sep 2023 13:34:26 -0700 (PDT) Received: from mandiga.. ([2804:1b3:a7c3:fee4:20bd:98a7:c4a5:3b96]) by smtp.gmail.com with ESMTPSA id x44-20020a4a97ef000000b00569c5eadf15sm6263425ooi.26.2023.09.05.13.34.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 05 Sep 2023 13:34:25 -0700 (PDT) To: libc-alpha@sourceware.org, Mateusz Guzik , Linus Torvalds Subject: [PATCH] io: Do not implement fstat with fstatat Date: Tue, 5 Sep 2023 17:34:21 -0300 Message-Id: <20230905203421.2127750-1-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 X-Spam-Status: No, score=-12.8 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.30 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 Netto Reply-To: Adhemerval Zanella Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" AT_EMPTY_PATH is a requirement to implement fstat over fstatat, however it does not prevent the kernel to read the path argument. It is not an issue, but it has performance implications on x86_64 with SMAP enable, since each newfstatat syscall generates a pagefault even with an empty path. Instead, issue the fstat syscall directly on LFS fstat implementation (32 bit architectures will still continue to use statx, which is required to have 64 bit time_t support). it should be even a small performance gain on non x86_64, since there is no need to handle the path argument. Checked on x86_64-linux-gnu. --- sysdeps/unix/sysv/linux/fstat64.c | 37 +++++++++++++++++++++++-- sysdeps/unix/sysv/linux/fstatat64.c | 12 ++------ sysdeps/unix/sysv/linux/internal-stat.h | 31 +++++++++++++++++++++ 3 files changed, 68 insertions(+), 12 deletions(-) create mode 100644 sysdeps/unix/sysv/linux/internal-stat.h diff --git a/sysdeps/unix/sysv/linux/fstat64.c b/sysdeps/unix/sysv/linux/fstat64.c index 124384e57f..a7f4935a01 100644 --- a/sysdeps/unix/sysv/linux/fstat64.c +++ b/sysdeps/unix/sysv/linux/fstat64.c @@ -19,20 +19,53 @@ #define __fstat __redirect___fstat #define fstat __redirect_fstat #include +#undef __fstat +#undef fstat #include -#include -#include +#include #include int __fstat64_time64 (int fd, struct __stat64_t64 *buf) { +#if !FSTATAT_USE_STATX +# if XSTAT_IS_XSTAT64 +# ifdef __NR_newfstatat + /* 64-bit kABI, e.g. aarch64, ia64, powerpc64*, s390x, riscv64, and + x86_64. */ + return INLINE_SYSCALL_CALL (fstat, fd, buf); +# elif defined __NR_fstatat64 +# if STAT64_IS_KERNEL_STAT64 + /* 64-bit kABI outlier, e.g. alpha */ + return INLINE_SYSCALL_CALL (fstat64, fd, buf); +# else + /* 64-bit kABI outlier, e.g. sparc64. */ + struct kernel_stat64 kst64; + int r = INLINE_SYSCALL_CALL (fstat64, fd, &kst64); + if (r == 0) + __cp_stat64_kstat64 (buf, &kst64); + return r; +# endif /* STAT64_IS_KERNEL_STAT64 */ +# endif +# else /* XSTAT_IS_XSTAT64 */ + /* 64-bit kabi outlier, e.g. mips64 and mips64-n32. */ + struct kernel_stat kst; + int r = INLINE_SYSCALL_CALL (fstat, fd, &kst); + if (r == 0) + __cp_kstat_stat64_t64 (&kst, buf); + return r; +# endif +#else /* !FSTATAT_USE_STATX */ + /* All kABIs with non-LFS support and with old 32-bit time_t support + e.g. arm, csky, i386, hppa, m68k, microblaze, nios2, sh, powerpc32, + and sparc32. */ if (fd < 0) { __set_errno (EBADF); return -1; } return __fstatat64_time64 (fd, "", buf, AT_EMPTY_PATH); +#endif } #if __TIMESIZE != 64 hidden_def (__fstat64_time64) diff --git a/sysdeps/unix/sysv/linux/fstatat64.c b/sysdeps/unix/sysv/linux/fstatat64.c index 3509d3ca6d..127c6ff601 100644 --- a/sysdeps/unix/sysv/linux/fstatat64.c +++ b/sysdeps/unix/sysv/linux/fstatat64.c @@ -21,12 +21,10 @@ #include #include #include -#include #include #include -#include -#include #include +#include #if __TIMESIZE == 64 \ && (__WORDSIZE == 32 \ @@ -40,11 +38,7 @@ _Static_assert (sizeof (__blkcnt_t) == sizeof (__blkcnt64_t), "__blkcnt_t and __blkcnt64_t must match"); #endif -#if (__WORDSIZE == 32 \ - && (!defined __SYSCALL_WORDSIZE || __SYSCALL_WORDSIZE == 32)) \ - || defined STAT_HAS_TIME32 \ - || (!defined __NR_newfstatat && !defined __NR_fstatat64) -# define FSTATAT_USE_STATX 1 +#if FSTATAT_USE_STATX static inline int fstatat64_time64_statx (int fd, const char *file, struct __stat64_t64 *buf, @@ -79,8 +73,6 @@ fstatat64_time64_statx (int fd, const char *file, struct __stat64_t64 *buf, return r; } -#else -# define FSTATAT_USE_STATX 0 #endif /* Only statx supports 64-bit timestamps for 32-bit architectures with diff --git a/sysdeps/unix/sysv/linux/internal-stat.h b/sysdeps/unix/sysv/linux/internal-stat.h new file mode 100644 index 0000000000..e3b0569853 --- /dev/null +++ b/sysdeps/unix/sysv/linux/internal-stat.h @@ -0,0 +1,31 @@ +/* Internal stat definitions. + Copyright (C) 2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include + +#if (__WORDSIZE == 32 \ + && (!defined __SYSCALL_WORDSIZE || __SYSCALL_WORDSIZE == 32)) \ + || defined STAT_HAS_TIME32 \ + || (!defined __NR_newfstatat && !defined __NR_fstatat64) +# define FSTATAT_USE_STATX 1 +#else +# define FSTATAT_USE_STATX 0 +#endif