From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752170AbdKUCCw (ORCPT ); Mon, 20 Nov 2017 21:02:52 -0500 Received: from mga03.intel.com ([134.134.136.65]:48527 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751305AbdKUCCu (ORCPT ); Mon, 20 Nov 2017 21:02:50 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.44,431,1505804400"; d="scan'208";a="4106219" From: ning.a.zhang@intel.com To: linux-kernel@vger.kernel.org Cc: ning.a.zhang@intel.com Subject: [PATCH] x86/smpboot: set topology CPU mask before use. Date: Tue, 21 Nov 2017 10:02:46 +0800 Message-Id: <20171121020246.22007-1-ning.a.zhang@intel.com> X-Mailer: git-send-email 2.11.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Zhang Ning we detect topology CPU mask in tsc is used before it is set, it leads to longer bootup time. let's check the code. smpboot.c:smp_callin() ---> calibarate.c:calibrate_delay() ---> tsc.c: calibrate_delay_is_known() ---> topology_core_cpumask(): read topology CPU mask ---> set_cpu_sibling_map(raw_smp_processor_id()) ---> cpumask_set_cpu(cpu, topology_core_cpumask(cpu)); from the calling chain, we know topology CPU mask is used before it actually set. So move set_cpu_sibling_map before calibrate_delay. Change-Id: I4eb8facb8751fe7aa2c6d2eac32437266d92ec00 Signed-off-by: Zhang Ning --- arch/x86/kernel/smpboot.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 36171bcd91f8..acee1ca3ef43 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c @@ -181,6 +181,12 @@ static void smp_callin(void) smp_store_cpu_info(cpuid); /* + * This must be done before setting cpu_online_mask + * or calling notify_cpu_starting. + */ + set_cpu_sibling_map(raw_smp_processor_id()); + + /* * Get our bogomips. * Update loops_per_jiffy in cpu_data. Previous call to * smp_store_cpu_info() stored a value that is close but not as @@ -190,11 +196,7 @@ static void smp_callin(void) cpu_data(cpuid).loops_per_jiffy = loops_per_jiffy; pr_debug("Stack at about %p\n", &cpuid); - /* - * This must be done before setting cpu_online_mask - * or calling notify_cpu_starting. - */ - set_cpu_sibling_map(raw_smp_processor_id()); + wmb(); notify_cpu_starting(cpuid); -- 2.11.0