From patchwork Wed Feb 28 22:06:19 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeremy Linton X-Patchwork-Id: 10249969 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id F395060211 for ; Wed, 28 Feb 2018 22:15:27 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D488D28858 for ; Wed, 28 Feb 2018 22:15:27 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C697328BF4; Wed, 28 Feb 2018 22:15:27 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 38EA228858 for ; Wed, 28 Feb 2018 22:15:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=XkZH/+dIxl1Q3Mqt74UcNb744eIG+GtzitXCeLDoWis=; b=iN1kNFsox9emv3uVR06l+krzOw vjQbPOEzUIYreOtWzjJwJHQGyPICkpaW/fU4FNvcf0QTq2CGZLMEOln0oFUthnw14a4NB4+kRP6L/ s+7xfFzyBPBAsbJeqCoVIQCqwBLXkBWF3RTLVc5LQ23plsRdRsusC52XCNJFqGIVJEwpEk+jvo3k2 lGrUzYrrrcn55iL8z6UNGQKGbIfEQXCt3n5BZtErzgGFWnXFaQVSaaiRD/zGv2767B1nM7RrAmdTb oTfqMmhJMbvdGdAJvr1t/4vBP9k85p+s2PZCJg/jKwf6XlB64CmnBNlR22H+XCVYm6q2VQOBIS3+q DEqnr7fA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.89 #1 (Red Hat Linux)) id 1erA0N-0000TW-F1; Wed, 28 Feb 2018 22:15:19 +0000 Received: from foss.arm.com ([217.140.101.70]) by bombadil.infradead.org with esmtp (Exim 4.89 #1 (Red Hat Linux)) id 1er9sz-0002hF-Dg; Wed, 28 Feb 2018 22:07:58 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id A0C2216BA; Wed, 28 Feb 2018 14:07:33 -0800 (PST) Received: from beelzebub.austin.arm.com (beelzebub.austin.arm.com [10.118.12.119]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id A961D3F246; Wed, 28 Feb 2018 14:07:32 -0800 (PST) From: Jeremy Linton To: linux-acpi@vger.kernel.org Subject: [PATCH v7 13/13] arm64: topology: divorce MC scheduling domain from core_siblings Date: Wed, 28 Feb 2018 16:06:19 -0600 Message-Id: <20180228220619.6992-14-jeremy.linton@arm.com> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20180228220619.6992-1-jeremy.linton@arm.com> References: <20180228220619.6992-1-jeremy.linton@arm.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180228_140742_409624_3BFC3932 X-CRM114-Status: GOOD ( 15.21 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: mark.rutland@arm.com, austinwc@codeaurora.org, tnowicki@caviumnetworks.com, catalin.marinas@arm.com, palmer@sifive.com, will.deacon@arm.com, linux-riscv@lists.infradead.org, morten.rasmussen@arm.com, vkilari@codeaurora.org, lorenzo.pieralisi@arm.com, ahs3@redhat.com, lenb@kernel.org, john.garry@huawei.com, wangxiongfeng2@huawei.com, dietmar.eggemann@arm.com, linux-arm-kernel@lists.infradead.org, gregkh@linuxfoundation.org, rjw@rjwysocki.net, linux-kernel@vger.kernel.org, Jeremy Linton , hanjun.guo@linaro.org, sudeep.holla@arm.com MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP Now that we have an accurate view of the physical topology we need to represent it correctly to the scheduler. In the case of NUMA in socket, we need to assure that the sched domain we build for the MC layer isn't larger than the DIE above it. To do this correctly, we should really base that on the cache topology immediately below the NUMA node (for NUMA in socket) or below the physical package for normal NUMA configurations. This patch creates a set of early cache_siblings masks, then when the scheduler requests the coregroup mask we pick the smaller of the physical package siblings, or the numa siblings and locate the largest cache which is an entire subset of those siblings. If we are unable to find a proper subset of cores then we retain the original behavior and return the core_sibling list. Signed-off-by: Jeremy Linton --- arch/arm64/include/asm/topology.h | 5 +++ arch/arm64/kernel/topology.c | 64 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/arch/arm64/include/asm/topology.h b/arch/arm64/include/asm/topology.h index 6b10459e6905..08db3e4e44e1 100644 --- a/arch/arm64/include/asm/topology.h +++ b/arch/arm64/include/asm/topology.h @@ -4,12 +4,17 @@ #include +#define MAX_CACHE_CHECKS 4 + struct cpu_topology { int thread_id; int core_id; int package_id; + int cache_id[MAX_CACHE_CHECKS]; cpumask_t thread_sibling; cpumask_t core_sibling; + cpumask_t cache_siblings[MAX_CACHE_CHECKS]; + int cache_level; }; extern struct cpu_topology cpu_topology[NR_CPUS]; diff --git a/arch/arm64/kernel/topology.c b/arch/arm64/kernel/topology.c index bd1aae438a31..1809dc9d347c 100644 --- a/arch/arm64/kernel/topology.c +++ b/arch/arm64/kernel/topology.c @@ -212,8 +212,42 @@ static int __init parse_dt_topology(void) struct cpu_topology cpu_topology[NR_CPUS]; EXPORT_SYMBOL_GPL(cpu_topology); +static void find_llc_topology_for_cpu(int cpu) +{ + /* first determine if we are a NUMA in package */ + const cpumask_t *node_mask = cpumask_of_node(cpu_to_node(cpu)); + int indx; + + if (!cpumask_subset(node_mask, &cpu_topology[cpu].core_sibling)) { + /* not numa in package, lets use the package siblings */ + node_mask = &cpu_topology[cpu].core_sibling; + } + + /* + * node_mask should represent the smallest package/numa grouping + * lets search for the largest cache smaller than the node_mask. + */ + for (indx = 0; indx < MAX_CACHE_CHECKS; indx++) { + cpumask_t *cache_sibs = &cpu_topology[cpu].cache_siblings[indx]; + + if (cpu_topology[cpu].cache_id[indx] < 0) + continue; + + if (cpumask_subset(cache_sibs, node_mask)) + cpu_topology[cpu].cache_level = indx; + } +} + const struct cpumask *cpu_coregroup_mask(int cpu) { + int *llc = &cpu_topology[cpu].cache_level; + + if (*llc == -1) + find_llc_topology_for_cpu(cpu); + + if (*llc != -1) + return &cpu_topology[cpu].cache_siblings[*llc]; + return &cpu_topology[cpu].core_sibling; } @@ -221,6 +255,7 @@ static void update_siblings_masks(unsigned int cpuid) { struct cpu_topology *cpu_topo, *cpuid_topo = &cpu_topology[cpuid]; int cpu; + int idx; /* update core and thread sibling masks */ for_each_possible_cpu(cpu) { @@ -229,6 +264,16 @@ static void update_siblings_masks(unsigned int cpuid) if (cpuid_topo->package_id != cpu_topo->package_id) continue; + for (idx = 0; idx < MAX_CACHE_CHECKS; idx++) { + cpumask_t *lsib; + int cput_id = cpuid_topo->cache_id[idx]; + + if (cput_id == cpu_topo->cache_id[idx]) { + lsib = &cpuid_topo->cache_siblings[idx]; + cpumask_set_cpu(cpu, lsib); + } + } + cpumask_set_cpu(cpuid, &cpu_topo->core_sibling); if (cpu != cpuid) cpumask_set_cpu(cpu, &cpuid_topo->core_sibling); @@ -286,10 +331,18 @@ static void __init reset_cpu_topology(void) for_each_possible_cpu(cpu) { struct cpu_topology *cpu_topo = &cpu_topology[cpu]; + int idx; cpu_topo->thread_id = -1; cpu_topo->core_id = 0; cpu_topo->package_id = -1; + cpu_topo->cache_level = -1; + + for (idx = 0; idx < MAX_CACHE_CHECKS; idx++) { + cpu_topo->cache_id[idx] = -1; + cpumask_clear(&cpu_topo->cache_siblings[idx]); + cpumask_set_cpu(cpu, &cpu_topo->cache_siblings[idx]); + } cpumask_clear(&cpu_topo->core_sibling); cpumask_set_cpu(cpu, &cpu_topo->core_sibling); @@ -311,6 +364,9 @@ static int __init parse_acpi_topology(void) is_threaded = read_cpuid_mpidr() & MPIDR_MT_BITMASK; for_each_possible_cpu(cpu) { + int tidx = 0; + int i; + topology_id = find_acpi_cpu_topology(cpu, 0); if (topology_id < 0) return topology_id; @@ -325,6 +381,14 @@ static int __init parse_acpi_topology(void) } topology_id = find_acpi_cpu_topology_package(cpu); cpu_topology[cpu].package_id = topology_id; + + for (i = 0; i < MAX_CACHE_CHECKS; i++) { + topology_id = find_acpi_cpu_cache_topology(cpu, i + 1); + if (topology_id > 0) { + cpu_topology[cpu].cache_id[tidx] = topology_id; + tidx++; + } + } } return 0;