Received: by 2002:ac0:a581:0:0:0:0:0 with SMTP id m1-v6csp1426952imm; Tue, 3 Jul 2018 10:54:55 -0700 (PDT) X-Google-Smtp-Source: ADUXVKI48fy6lbRDLf7RW6QNHUC+jA0gHNYnaaF6pOq7dF7GgJ1NUDjcPbGl2KQpyeJAZ4Zg/PrF X-Received: by 2002:a17:902:8497:: with SMTP id c23-v6mr31884688plo.124.1530640495829; Tue, 03 Jul 2018 10:54:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530640495; cv=none; d=google.com; s=arc-20160816; b=KGtoQ4Y++1qSc6rFeI7S+MwjntzUGIIZphW/aTQoGQOKmEhwSeJEyBH+RwBSDJr0Eq /iUME6HCLtOsjz/L3F0hGBgjWXbY8QRslyXlW/ddjxM9mAmRGTpZWry/OopjAF3l457f zgzfB29vbIfZLxJNcMzaIoyIUyzkE+z5iAGpwirWu4mgAxBklduDv7MyHptn/5b1+N2B YvPaY0Z2vqZjW20TELmxYSk1tDnzbyUHdhbFGz28OcVmKH2AkQp09pP1h6TddQQ9lUF1 DoXsnLN7vm9QZVxjJvVoNhW/reqm7MlzpYSjZqrbLYot/zc0BfH8FBgWTzzExcZuFI2N Y2mA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:user-agent:in-reply-to :content-disposition:mime-version:references:subject:cc:to:from:date :arc-authentication-results; bh=rhpBy56BjWrfFi3W+fBEN29n0Ie2jOaolFIrJiTxDqw=; b=yoKYCfADRxR5d04j7/ooIaK83wGkavy6WTHb5B4VjqdJZ3Pq4tIQ+YsdVV+I0sMb2o gSdNBoxvmDxQQNy1VW6S1MOWeONU569/PYF8cXfx67PBvuQ/BjsQA7mwku8e4Eo3MTAb B+O2jDnZMAcy/8zV1xVJIu+whRBkazEHUMUBgRW3F0/JHdtR9QkBY/AKx+xSJNHJrlyY jpw0ontf6JZEYcv2mIyPHevo1OSh+SeR1vCrm3M1AhaHHlBZbgRrJQBIPCtOCBg/1f90 dqkyDge7JLAblaxMQnWLFAbkmnlw9axOI6mGxylNSsarKaocY6F0yfE2x0m9OvMVRXuE Sy/w== 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=ibm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id c12-v6si1490649pga.608.2018.07.03.10.54.40; Tue, 03 Jul 2018 10:54:55 -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=ibm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934311AbeGCRxy (ORCPT + 99 others); Tue, 3 Jul 2018 13:53:54 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:49072 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S933569AbeGCRxx (ORCPT ); Tue, 3 Jul 2018 13:53:53 -0400 Received: from pps.filterd (m0098417.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w63HnPS6015318 for ; Tue, 3 Jul 2018 13:53:52 -0400 Received: from e12.ny.us.ibm.com (e12.ny.us.ibm.com [129.33.205.202]) by mx0a-001b2d01.pphosted.com with ESMTP id 2k0dpdgjk4-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Tue, 03 Jul 2018 13:53:52 -0400 Received: from localhost by e12.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 3 Jul 2018 13:53:51 -0400 Received: from b01cxnp22034.gho.pok.ibm.com (9.57.198.24) by e12.ny.us.ibm.com (146.89.104.199) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Tue, 3 Jul 2018 13:53:49 -0400 Received: from b01ledav004.gho.pok.ibm.com (b01ledav004.gho.pok.ibm.com [9.57.199.109]) by b01cxnp22034.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w63Hrm0P7602584 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Tue, 3 Jul 2018 17:53:48 GMT Received: from b01ledav004.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id DDC92112067; Tue, 3 Jul 2018 13:53:40 -0400 (EDT) Received: from b01ledav004.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 93878112064; Tue, 3 Jul 2018 13:53:40 -0400 (EDT) Received: from localhost (unknown [9.18.235.193]) by b01ledav004.gho.pok.ibm.com (Postfix) with ESMTPS; Tue, 3 Jul 2018 13:53:40 -0400 (EDT) Date: Tue, 3 Jul 2018 14:53:46 -0300 From: Murilo Opsfelder Araujo To: "Gautham R. Shenoy" Cc: Michael Ellerman , Benjamin Herrenschmidt , Michael Neuling , Vaidyanathan Srinivasan , Akshay Adiga , Shilpasri G Bhat , "Oliver O'Halloran" , Nicholas Piggin , linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org Subject: Re: [v2 PATCH 2/2] powerpc: Enable CPU_FTR_ASYM_SMT for interleaved big-cores References: <573a559dff87da1d68a55bf6ada97b7697102909.1530609795.git.ego@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <573a559dff87da1d68a55bf6ada97b7697102909.1530609795.git.ego@linux.vnet.ibm.com> User-Agent: Mutt/1.10.0 (2018-05-17) X-TM-AS-GCONF: 00 x-cbid: 18070317-0060-0000-0000-00000286D03B X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00009302; HX=3.00000241; KW=3.00000007; PH=3.00000004; SC=3.00000266; SDB=6.01056043; UDB=6.00541694; IPR=6.00833966; MB=3.00021978; MTD=3.00000008; XFM=3.00000015; UTC=2018-07-03 17:53:50 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18070317-0061-0000-0000-000045AACB63 Message-Id: <20180703175346.GB6474@kermit-br-ibm-com.br.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:,, definitions=2018-07-03_07:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1806210000 definitions=main-1807030203 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Jul 03, 2018 at 04:33:51PM +0530, Gautham R. Shenoy wrote: > From: "Gautham R. Shenoy" > > A pair of IBM POWER9 SMT4 cores can be fused together to form a big-core > with 8 SMT threads. This can be discovered via the "ibm,thread-groups" > CPU property in the device tree which will indicate which group of > threads that share the L1 cache, translation cache and instruction data > flow. If there are multiple such group of threads, then the core is a > big-core. > > Furthermore, if the thread-ids of the threads of the big-core can be > obtained by interleaving the thread-ids of the thread-groups > (component small core), then such a big-core is called an interleaved > big-core. > > Eg: Threads in the pair of component SMT4 cores of an interleaved > big-core are numbered {0,2,4,6} and {1,3,5,7} respectively. > > The SMT4 cores forming a big-core are more or less independent > units. Thus when multiple tasks are scheduled to run on the fused > core, we get the best performance when the tasks are spread across the > pair of SMT4 cores. > > This patch enables CPU_FTR_ASYM_SMT bit in the cpu-features on > detecting the presence of interleaved big-cores at boot up. This will > will bias the load-balancing of tasks on smaller numbered threads, > which will automatically result in spreading the tasks uniformly > across the associated pair of SMT4 cores. > > Signed-off-by: Gautham R. Shenoy > --- > arch/powerpc/kernel/setup-common.c | 67 +++++++++++++++++++++++++++++++++++++- > 1 file changed, 66 insertions(+), 1 deletion(-) > > diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c > index a78ec66..f63d797 100644 > --- a/arch/powerpc/kernel/setup-common.c > +++ b/arch/powerpc/kernel/setup-common.c > @@ -537,6 +537,56 @@ int get_cpu_thread_group_start(int cpu, struct thread_groups *tg) > return -1; > } > > +/* > + * check_interleaved_big_core - Checks if the thread group tg > + * corresponds to a big-core whose threads are interleavings of the > + * threads of the component small cores. > + * > + * @tg: A thread-group struct for the core. > + * > + * Returns true if the core is a interleaved big-core. > + * Returns false otherwise. > + */ > +static inline bool check_interleaved_big_core(struct thread_groups *tg) > +{ > + int nr_groups; > + int threads_per_group; > + int cur_cpu, next_cpu, i, j; > + > + nr_groups = tg->nr_groups; > + threads_per_group = tg->threads_per_group; > + > + if (tg->property != 1) > + return false; > + > + if (nr_groups < 2 || threads_per_group < 2) > + return false; > + > + /* > + * In case of an interleaved big-core, the thread-ids of the > + * big-core can be obtained by interleaving the the thread-ids > + * of the component small > + * > + * Eg: On a 8-thread big-core with two SMT4 small cores, the > + * threads of the two component small cores will be > + * {0, 2, 4, 6} and {1, 3, 5, 7}. > + */ > + for (i = 0; i < nr_groups; i++) { > + int group_start = i * threads_per_group; > + > + for (j = 0; j < threads_per_group - 1; j++) { > + int cur_idx = group_start + j; > + > + cur_cpu = tg->thread_list[cur_idx]; > + next_cpu = tg->thread_list[cur_idx + 1]; > + if (next_cpu != cur_cpu + nr_groups) > + return false; > + } > + } > + > + return true; > +} > + > /** > * setup_cpu_maps - initialize the following cpu maps: > * cpu_possible_mask > @@ -560,6 +610,7 @@ void __init smp_setup_cpu_maps(void) > struct device_node *dn; > int cpu = 0; > int nthreads = 1; > + bool has_interleaved_big_core = true; > > DBG("smp_setup_cpu_maps()\n"); > > @@ -613,6 +664,12 @@ void __init smp_setup_cpu_maps(void) > if (parse_thread_groups(dn, &tg) || > tg.nr_groups < 1 || tg.property != 1) { > has_big_cores = false; > + has_interleaved_big_core = false; > + } > + > + if (has_interleaved_big_core) { > + has_interleaved_big_core = > + check_interleaved_big_core(&tg); > } > > if (cpu >= nr_cpu_ids) { > @@ -669,7 +726,15 @@ void __init smp_setup_cpu_maps(void) > vdso_data->processorCount = num_present_cpus(); > #endif /* CONFIG_PPC64 */ > > - /* Initialize CPU <=> thread mapping/ > + if (has_interleaved_big_core) { > + int key = __builtin_ctzl(CPU_FTR_ASYM_SMT); > + > + cur_cpu_spec->cpu_features |= CPU_FTR_ASYM_SMT; > + static_branch_enable(&cpu_feature_keys[key]); > + pr_info("Detected interleaved big-cores\n"); > + } Shouldn't we use cpu_has_feature(CPU_FTR_ASYM_SMT) before setting it? > + > + /* Initialize CPU <=> thread mapping/ > * > * WARNING: We assume that the number of threads is the same for > * every CPU in the system. If that is not the case, then some code > -- > 1.9.4 > -- Murilo