Received: by 2002:ac0:a581:0:0:0:0:0 with SMTP id m1-v6csp1337842imm; Wed, 20 Jun 2018 16:18:25 -0700 (PDT) X-Google-Smtp-Source: ADUXVKKzLre5sezjSLlSRttfnulUxZvI6odO0tSgGr6mGVJMW9ot5regiocKP/W8JKdFkjAyehaL X-Received: by 2002:a17:902:ac1:: with SMTP id 59-v6mr25163228plp.36.1529536705116; Wed, 20 Jun 2018 16:18:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1529536705; cv=none; d=google.com; s=arc-20160816; b=tcRpG3otySBI/i9JDSUDTKII/UIihNCP0jwUjeU6yEE7rRjNHa0AI67tR5J50FwQjb dDJXezfY4BffarkmFDbY7vFpNheH5SiTjtz/ysIUiV8l5dNuNmxNT8vhbTNVXDxc/cxS S4bvGbYEOBCUJJandEq4maS9kPIuegPhYY9ClXYDOdgp7M5xTVTIi48f3/ix/3gLq9eJ D29Lf5ViUhPoG11jmzX6+nooZb4sEFSyM6r7NfpqQv8g0uM9Q6dviS/xkrwQcBK2nZfp 3Qgxl3HtoVVttaV9inOKM5CTYo2F8ebIPyPO0tNn7Tvzc0m2uYYyondqcd2HyF06yoZ5 4WLQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=JCqpnEWd4+lGGb2kvbYQkWlcgtrgyZH+vVpDUcaN9mg=; b=Z2SvtRRs9t5QJAzaAG0eIWXL9LEVdi9oG9r2RAgpys+/QgLSy3OtTYmkohTb0aZ7r0 n5NAp7kKaRLK1GMW9I6+LBBiBJ/Xe+AkOeht/gHf86nU5hyFaXKXPtAXaCnbIRrKOdP/ sDsywGESTOKbgdIeKpYRJKr3jlSMQVejQ/A4RnsSm674IyZ6vfMuV7ImuM15dkWkV1AV zx2H8HTx2s0OVWv6I02viDa/YOj/S65iiwOt9zN6OylJJMZ0O2VneqTPiW2bgrZlvvWx //maMTl6S+qzbVIL13QFfZ+U2OCPyBy9oy5X0JmACdztooT9P4kacfu3h9fCNjyEZXIL xWTQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a22-v6si3126995pfn.19.2018.06.20.16.18.11; Wed, 20 Jun 2018 16:18:25 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932670AbeFTXQH (ORCPT + 99 others); Wed, 20 Jun 2018 19:16:07 -0400 Received: from mga12.intel.com ([192.55.52.136]:65395 "EHLO mga12.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932415AbeFTXP3 (ORCPT ); Wed, 20 Jun 2018 19:15:29 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 20 Jun 2018 16:15:28 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,249,1526367600"; d="scan'208";a="66325231" Received: from chang-linux-2.sc.intel.com ([10.3.52.139]) by orsmga001.jf.intel.com with ESMTP; 20 Jun 2018 16:15:28 -0700 From: "Chang S. Bae" To: Andy Lutomirski , "H . Peter Anvin" , Thomas Gleixner , Ingo Molnar Cc: Andi Kleen , Dave Hansen , Markus T Metzger , Ravi Shankar , "Chang S . Bae" , LKML Subject: [PATCH v4 7/7] x86/vdso: Move out the CPU number store Date: Wed, 20 Jun 2018 16:15:06 -0700 Message-Id: <1529536506-26237-8-git-send-email-chang.seok.bae@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1529536506-26237-1-git-send-email-chang.seok.bae@intel.com> References: <1529536506-26237-1-git-send-email-chang.seok.bae@intel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The CPU (and node) number will be written, as early enough, to the segment limit of per CPU data and TSC_AUX MSR entry. The information has been retrieved by vgetcpu in user space and will be also loaded from the paranoid entry, when FSGSBASE enabled. CPU number initialization will be done during each CPU initialization, before setting up IST. The redundant setting of the segment in entry/vdso/vma.c was removed; a substantial code removal. It removes a hotplug notifier, makes a facility useful to both the kernel and userspace unconditionally available much sooner. (Thanks to HPA for suggesting the cleanup) Signed-off-by: Chang S. Bae Cc: H. Peter Anvin Cc: Dave Hansen Cc: Andy Lutomirski Cc: Andi Kleen Cc: Thomas Gleixner Cc: Ingo Molnar --- arch/x86/entry/vdso/vma.c | 41 +---------------------------------------- arch/x86/kernel/cpu/common.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 40 deletions(-) diff --git a/arch/x86/entry/vdso/vma.c b/arch/x86/entry/vdso/vma.c index 1fc93da..3f9d43f 100644 --- a/arch/x86/entry/vdso/vma.c +++ b/arch/x86/entry/vdso/vma.c @@ -332,43 +332,6 @@ static __init int vdso_setup(char *s) return 0; } __setup("vdso=", vdso_setup); -#endif - -#ifdef CONFIG_X86_64 -static void vgetcpu_cpu_init(void *arg) -{ - int cpu = smp_processor_id(); - struct desc_struct d = { }; - unsigned long node = 0; - unsigned long cpu_number = 0; -#ifdef CONFIG_NUMA - node = cpu_to_node(cpu); -#endif - cpu_number = make_lsl_tscp(cpu, node); - - if (static_cpu_has(X86_FEATURE_RDTSCP)) - write_rdtscp_aux(cpu_number); - - /* Store cpu number in limit */ - d.limit0 = cpu_number; - d.limit1 = cpu_number >> 16; - - d.type = 5; /* RO data, expand down, accessed */ - d.dpl = 3; /* Visible to user code */ - d.s = 1; /* Not a system segment */ - d.p = 1; /* Present */ - d.d = 1; /* 32-bit */ - - write_gdt_entry(get_cpu_gdt_rw(cpu), - GDT_ENTRY_CPU_NUMBER, - &d, - DESCTYPE_S); -} - -static int vgetcpu_online(unsigned int cpu) -{ - return smp_call_function_single(cpu, vgetcpu_cpu_init, NULL, 1); -} static int __init init_vdso(void) { @@ -378,9 +341,7 @@ static int __init init_vdso(void) init_vdso_image(&vdso_image_x32); #endif - /* notifier priority > KVM */ - return cpuhp_setup_state(CPUHP_AP_X86_VDSO_VMA_ONLINE, - "x86/vdso/vma:online", vgetcpu_online, NULL); + return 0; } subsys_initcall(init_vdso); #endif /* CONFIG_X86_64 */ diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 0df7151..a554e4a 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c @@ -1648,6 +1648,33 @@ static void wait_for_master_cpu(int cpu) #endif } +#ifdef CONFIG_X86_64 +static void setup_cpu_number(int cpu) +{ + unsigned long node = early_cpu_to_node(cpu); + unsigned long cpu_number = make_lsl_tscp(cpu, node); + struct desc_struct d = { }; + + /* Store cpu number in limit */ + d.limit0 = cpu_number; + d.limit1 = cpu_number >> 16; + + d.type = 5; /* RO data, expand down, accessed */ + d.dpl = 3; /* Visible to user code */ + d.s = 1; /* Not a system segment */ + d.p = 1; /* Present */ + d.d = 1; /* 32-bit */ + + write_gdt_entry(get_cpu_gdt_rw(cpu), + GDT_ENTRY_CPU_NUMBER, + &d, + DESCTYPE_S); + + if (static_cpu_has(X86_FEATURE_RDTSCP)) + write_rdtscp_aux(cpu_number); +} +#endif + /* * cpu_init() initializes state that is per-CPU. Some data is already * initialized (naturally) in the bootstrap process, such as the GDT @@ -1685,6 +1712,7 @@ void cpu_init(void) early_cpu_to_node(cpu) != NUMA_NO_NODE) set_numa_node(early_cpu_to_node(cpu)); #endif + setup_cpu_number(cpu); me = current; -- 2.7.4