From patchwork Fri Jun 5 18:58:54 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 49600 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-wg0-f69.google.com (mail-wg0-f69.google.com [74.125.82.69]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id BC2CC2462C for ; Fri, 5 Jun 2015 18:59:17 +0000 (UTC) Received: by wgme6 with SMTP id e6sf19394982wgm.3 for ; Fri, 05 Jun 2015 11:59:17 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:mailing-list:precedence:list-id :list-unsubscribe:list-subscribe:list-archive:list-post:list-help :sender:delivered-to:message-id:date:from:user-agent:mime-version:to :subject:content-type:content-transfer-encoding:x-original-sender :x-original-authentication-results; bh=boXee163DsRSnDRdb/5V4hKr2dB4stYDR3dpkq783bo=; b=YAQjV/O97bbigFuOPfUGWbZ0ux/a5bPwApCVirzmIPEJuuaaX/DCB2kbAfYrhgZ0Df fdmh1B4VWbOAqimJJOmXau/xPms53lcQx+7ow7xICrsUEn9Nl/5CJ1V5WTIwOL6r8UEi f8wvt2lfkOxdY72a2I1i5Z0JMKn6GimIprTu/K9EEmqghCBLy47Jy1y1BQ9LDFy4e+m0 ZvNXibox9in79GOBNWP+ReJ8BGVKg4iljl1jrINi94VROFpOH08pFOYGUtID96Ux1F8X Hg748BhmlOU66FdrsPYKLjIWE+rdMnymrzL0hHhjR0PlI94phOQ8swcvINOis1J2a6kz ZCRQ== X-Gm-Message-State: ALoCoQlRt0z+dQK8W/3RvFAmsi67HvFbUiLb/s0nr2+a/Rh2sfhwKx9Sx+VCrtlPXQ9qzm/kQwUx X-Received: by 10.152.3.131 with SMTP id c3mr4383772lac.4.1433530757029; Fri, 05 Jun 2015 11:59:17 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.3.133 with SMTP id c5ls339576lac.68.gmail; Fri, 05 Jun 2015 11:59:16 -0700 (PDT) X-Received: by 10.152.6.1 with SMTP id w1mr4580255law.91.1433530756816; Fri, 05 Jun 2015 11:59:16 -0700 (PDT) Received: from mail-la0-x232.google.com (mail-la0-x232.google.com. [2a00:1450:4010:c03::232]) by mx.google.com with ESMTPS id ky4si5513695lab.70.2015.06.05.11.59.16 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 05 Jun 2015 11:59:16 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 2a00:1450:4010:c03::232 as permitted sender) client-ip=2a00:1450:4010:c03::232; Received: by laar3 with SMTP id r3so11477530laa.3 for ; Fri, 05 Jun 2015 11:59:16 -0700 (PDT) X-Received: by 10.112.97.194 with SMTP id ec2mr4696292lbb.88.1433530756677; Fri, 05 Jun 2015 11:59:16 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.112.108.230 with SMTP id hn6csp78838lbb; Fri, 5 Jun 2015 11:59:15 -0700 (PDT) X-Received: by 10.70.91.136 with SMTP id ce8mr2415459pdb.29.1433530754406; Fri, 05 Jun 2015 11:59:14 -0700 (PDT) Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id zd13si11956516pab.169.2015.06.05.11.59.13 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 05 Jun 2015 11:59:14 -0700 (PDT) Received-SPF: pass (google.com: domain of libc-alpha-return-59759-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Received: (qmail 113620 invoked by alias); 5 Jun 2015 18:59:04 -0000 Mailing-List: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org Precedence: list 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 113601 invoked by uid 89); 5 Jun 2015 18:59:02 -0000 X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.2 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-yh0-f50.google.com X-Received: by 10.170.172.65 with SMTP id o62mr5157776ykd.2.1433530737804; Fri, 05 Jun 2015 11:58:57 -0700 (PDT) Message-ID: <5571F16E.3000509@linaro.org> Date: Fri, 05 Jun 2015 15:58:54 -0300 From: Adhemerval Zanella User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: GNU C Library Subject: [PATCH v2] Consolidate sched_getcpu X-Original-Sender: adhemerval.zanella@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 2a00:1450:4010:c03::232 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org; dkim=pass header.i=@sourceware.org X-Google-Group-Id: 836684582541 This is an update patch for my previous one [1] to consolidates sched_getcpu implementations across all arches (except tile, which requires its own). This patch removes the powerpc, x86_64 and x32 specific files and change the default linux one to use INLINE_VSYSCALL where possible (for ports that implements it). Tested on powerpc64, i386, x86_64, and x32. [1] https://sourceware.org/ml/libc-alpha/2015-04/msg00290.html Changes from previous version: * Do not remove __syscall_clock_gettime for x86_64 (it will be in another cleanup). --- * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h (HAVE_GETCPU_VSYSCALL): Define. * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h (HAVE_GETCPU_VSYSCALL): Likewise. * sysdeps/unix/sysv/linux/powerpc/sched_getcpu.c: Remove file. * sysdeps/unix/sysv/linux/sched_getcpu.c (HAVE_VSYSCALL) [HAVE_GETCPU_VSYSCALL]: Define. (sched_getcpu): Use INLINE_VSYSCALL instead of INLINE_SYSCALL. * sysdeps/unix/sysv/linux/x86/libc-vdso.h (getcpu): Add vDSO prototype. * sysdeps/unix/sysv/linux/x86_64/init-first.c (__vdso_platform_setup): Remove vsyscall getcpu fallback. * sysdeps/unix/sysv/linux/x86_64/sched_getcpu.S: Remove file. * sysdeps/unix/sysv/linux/x86_64/sysdep.h (HAVE_GETCPU_VSYSCALL): Define. * sysdeps/unix/sysv/linux/x86_64/x32/Makefile: Remove file. * sysdeps/unix/sysv/linux/x86_64/x32/init-first.c: Likewise. * sysdeps/unix/sysv/linux/x86_64/x32/sched_getcpu-static.c: Likewise. * sysdeps/unix/sysv/linux/x86_64/x32/sched_getcpu.S: Likewise. --- diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h b/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h index cbce324..dc56bea 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h @@ -165,6 +165,7 @@ /* List of system calls which are supported as vsyscalls. */ # define HAVE_CLOCK_GETRES_VSYSCALL 1 # define HAVE_CLOCK_GETTIME_VSYSCALL 1 +# define HAVE_GETCPU_VSYSCALL 1 # define LOADARGS_0(name, dummy) \ diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h b/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h index a727f38..e2014cc 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h @@ -80,6 +80,7 @@ /* List of system calls which are supported as vsyscalls. */ #define HAVE_CLOCK_GETRES_VSYSCALL 1 #define HAVE_CLOCK_GETTIME_VSYSCALL 1 +#define HAVE_GETCPU_VSYSCALL 1 /* Define a macro which expands inline into the wrapper code for a system call. This use is for internal calls that do not need to handle errors diff --git a/sysdeps/unix/sysv/linux/powerpc/sched_getcpu.c b/sysdeps/unix/sysv/linux/powerpc/sched_getcpu.c deleted file mode 100644 index f93be01..0000000 --- a/sysdeps/unix/sysv/linux/powerpc/sched_getcpu.c +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright (C) 2013-2015 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 - -int -sched_getcpu (void) -{ - unsigned int cpu; - int r = INLINE_VSYSCALL (getcpu, 3, &cpu, NULL, NULL); - - return r == -1 ? r : cpu; -} diff --git a/sysdeps/unix/sysv/linux/sched_getcpu.c b/sysdeps/unix/sysv/linux/sched_getcpu.c index 09f0816..a485d36 100644 --- a/sysdeps/unix/sysv/linux/sched_getcpu.c +++ b/sysdeps/unix/sysv/linux/sched_getcpu.c @@ -19,13 +19,17 @@ #include #include +#ifdef HAVE_GETCPU_VSYSCALL +# define HAVE_VSYSCALL +#endif +#include int sched_getcpu (void) { #ifdef __NR_getcpu unsigned int cpu; - int r = INLINE_SYSCALL (getcpu, 3, &cpu, NULL, NULL); + int r = INLINE_VSYSCALL (getcpu, 3, &cpu, NULL, NULL); return r == -1 ? r : cpu; #else diff --git a/sysdeps/unix/sysv/linux/x86/libc-vdso.h b/sysdeps/unix/sysv/linux/x86/libc-vdso.h index fea9c2b..f3a8f07 100644 --- a/sysdeps/unix/sysv/linux/x86/libc-vdso.h +++ b/sysdeps/unix/sysv/linux/x86/libc-vdso.h @@ -29,6 +29,8 @@ extern long int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *) attribute_hidden; +extern long int (*VDSO_SYMBOL(getcpu)) (unsigned *, unsigned *, void *); + #endif #endif /* _LIBC_VDSO_H */ diff --git a/sysdeps/unix/sysv/linux/x86_64/init-first.c b/sysdeps/unix/sysv/linux/x86_64/init-first.c index b7bdbd1..6e2b040 100644 --- a/sysdeps/unix/sysv/linux/x86_64/init-first.c +++ b/sysdeps/unix/sysv/linux/x86_64/init-first.c @@ -42,10 +42,6 @@ __vdso_platform_setup (void) VDSO_SYMBOL(clock_gettime) = p; p = _dl_vdso_vsym ("__vdso_getcpu", &linux26); - /* If the vDSO is not available we fall back on the old vsyscall. */ -#define VSYSCALL_ADDR_vgetcpu 0xffffffffff600800 - if (p == NULL) - p = (void *) VSYSCALL_ADDR_vgetcpu; PTR_MANGLE (p); VDSO_SYMBOL(getcpu) = p; } diff --git a/sysdeps/unix/sysv/linux/x86_64/sched_getcpu.S b/sysdeps/unix/sysv/linux/x86_64/sched_getcpu.S deleted file mode 100644 index b87f803..0000000 --- a/sysdeps/unix/sysv/linux/x86_64/sched_getcpu.S +++ /dev/null @@ -1,74 +0,0 @@ -/* Copyright (C) 2007-2015 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 -#define _ERRNO_H 1 -#include -#include - -/* For the calculation see asm/vsyscall.h. */ -#define VSYSCALL_ADDR_vgetcpu 0xffffffffff600800 - - -ENTRY (sched_getcpu) - /* Align stack and create local variable for result. */ - sub $0x8, %rsp - cfi_adjust_cfa_offset(8) - - movq %rsp, %rdi - xorl %esi, %esi - movl $VGETCPU_CACHE_OFFSET, %edx - addq %fs:0, %rdx - -#ifdef SHARED - movq __vdso_getcpu(%rip), %rax - PTR_DEMANGLE (%rax) - callq *%rax -#else -# ifdef __NR_getcpu - movl $__NR_getcpu, %eax - syscall -# ifndef __ASSUME_GETCPU_SYSCALL - cmpq $-ENOSYS, %rax - jne 1f -# endif -# endif -# ifndef __ASSUME_GETCPU_SYSCALL - movq $VSYSCALL_ADDR_vgetcpu, %rax - callq *%rax -1: -# else -# ifndef __NR_getcpu -# error "cannot happen" -# endif -# endif -#endif - - /* Local variable is result if the call is successful. */ - movl (%rsp), %edx - /* Restore stack pointer before we might jump to - SYSCALL_ERROR_LABEL which returns to the caller. */ - add $0x8, %rsp - cfi_adjust_cfa_offset(-8) - - cmpq $-4095, %rax - jae SYSCALL_ERROR_LABEL - - movl %edx, %eax - ret -PSEUDO_END(sched_getcpu) diff --git a/sysdeps/unix/sysv/linux/x86_64/sysdep.h b/sysdeps/unix/sysv/linux/x86_64/sysdep.h index bea3192..5a62cce 100644 --- a/sysdeps/unix/sysv/linux/x86_64/sysdep.h +++ b/sysdeps/unix/sysv/linux/x86_64/sysdep.h @@ -255,6 +255,7 @@ /* List of system calls which are supported as vsyscalls. */ # define HAVE_CLOCK_GETTIME_VSYSCALL 1 # define HAVE_GETTIMEOFDAY_VSYSCALL 1 +# define HAVE_GETCPU_VSYSCALL 1 # define LOAD_ARGS_0() # define LOAD_REGS_0 diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/Makefile b/sysdeps/unix/sysv/linux/x86_64/x32/Makefile index ecbdefb..8c3253b 100644 --- a/sysdeps/unix/sysv/linux/x86_64/x32/Makefile +++ b/sysdeps/unix/sysv/linux/x86_64/x32/Makefile @@ -4,7 +4,3 @@ default-abi := x32 ifeq ($(subdir),misc) sysdep_routines += arch_prctl endif - -ifeq ($(subdir),posix) -sysdep_routines += getcpu sched_getcpu-static -endif diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/init-first.c b/sysdeps/unix/sysv/linux/x86_64/x32/init-first.c deleted file mode 100644 index 31ec80f..0000000 --- a/sysdeps/unix/sysv/linux/x86_64/x32/init-first.c +++ /dev/null @@ -1,39 +0,0 @@ -/* Initialization code run first thing by the ELF startup code. Linux/x32. - Copyright (C) 2012-2015 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 - . */ - -#ifdef SHARED -# include -# include - -long int (*__vdso_clock_gettime) (clockid_t, struct timespec *) - attribute_hidden; - -static inline void -_libc_vdso_platform_setup (void) -{ - PREPARE_VERSION (linux26, "LINUX_2.6", 61765110); - - void *p = _dl_vdso_vsym ("__vdso_clock_gettime", &linux26); - PTR_MANGLE (p); - __vdso_clock_gettime = p; -} - -# define VDSO_SETUP _libc_vdso_platform_setup -#endif - -#include diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/sched_getcpu-static.c b/sysdeps/unix/sysv/linux/x86_64/x32/sched_getcpu-static.c deleted file mode 100644 index 38bbf9a..0000000 --- a/sysdeps/unix/sysv/linux/x86_64/x32/sched_getcpu-static.c +++ /dev/null @@ -1,3 +0,0 @@ -#ifndef SHARED -#include "../../sched_getcpu.c" -#endif diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/sched_getcpu.S b/sysdeps/unix/sysv/linux/x86_64/x32/sched_getcpu.S deleted file mode 100644 index 35ad01b..0000000 --- a/sysdeps/unix/sysv/linux/x86_64/x32/sched_getcpu.S +++ /dev/null @@ -1,49 +0,0 @@ -/* Copyright (C) 2012-2015 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 - . */ - -#ifdef SHARED -#include -#include -#define _ERRNO_H 1 -#include - -ENTRY (sched_getcpu) - /* Align stack and create local variable for result. */ - sub $0x8, %esp - cfi_adjust_cfa_offset(8) - - mov %esp, %edi - xor %esi, %esi - mov $VGETCPU_CACHE_OFFSET, %edx - add %fs:0, %edx - - call __getcpu - - /* Local variable is result if the call is successful. */ - mov (%rsp), %edx - /* Restore stack pointer before we might jump to - SYSCALL_ERROR_LABEL which returns to the caller. */ - add $0x8, %esp - cfi_adjust_cfa_offset(-8) - - cmp $-4095, %eax - jae SYSCALL_ERROR_LABEL - - mov %edx, %eax - ret -PSEUDO_END(sched_getcpu) -#endif