From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 156EBC433E1 for ; Wed, 31 Mar 2021 09:59:48 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id B8CC161878 for ; Wed, 31 Mar 2021 09:59:47 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B8CC161878 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=huawei.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:46452 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lRXda-00007x-Qf for qemu-devel@archiver.kernel.org; Wed, 31 Mar 2021 05:59:46 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:52186) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lRXYL-0002ku-In; Wed, 31 Mar 2021 05:54:21 -0400 Received: from szxga06-in.huawei.com ([45.249.212.32]:4060) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lRXY5-0002av-Ci; Wed, 31 Mar 2021 05:54:18 -0400 Received: from DGGEMS409-HUB.china.huawei.com (unknown [172.30.72.58]) by szxga06-in.huawei.com (SkyGuard) with ESMTP id 4F9M6p0JsbzlWlP; Wed, 31 Mar 2021 17:52:18 +0800 (CST) Received: from DESKTOP-TMVL5KK.china.huawei.com (10.174.187.128) by DGGEMS409-HUB.china.huawei.com (10.3.19.209) with Microsoft SMTP Server id 14.3.498.0; Wed, 31 Mar 2021 17:53:49 +0800 From: Yanan Wang To: , Subject: [RFC PATCH 3/6] hw/arm/virt: Parse cluster cpu topology for ARM machines Date: Wed, 31 Mar 2021 17:53:40 +0800 Message-ID: <20210331095343.12172-4-wangyanan55@huawei.com> X-Mailer: git-send-email 2.8.4.windows.1 In-Reply-To: <20210331095343.12172-1-wangyanan55@huawei.com> References: <20210331095343.12172-1-wangyanan55@huawei.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.174.187.128] X-CFilter-Loop: Reflected Received-SPF: pass client-ip=45.249.212.32; envelope-from=wangyanan55@huawei.com; helo=szxga06-in.huawei.com X-Spam_score_int: -41 X-Spam_score: -4.2 X-Spam_bar: ---- X-Spam_report: (-4.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Barry Song , Peter Maydell , Andrew Jones , Eduardo Habkost , "Michael S . Tsirkin" , wanghaibin.wang@huawei.com, Richard Henderson , Yanan Wang , Shannon Zhao , Paolo Bonzini , yuzenghui@huawei.com, Igor Mammedov , zhukeqian1@huawei.com, Jiajie Li Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" There is a separate function virt_smp_parse() in hw/virt/arm.c used to parse cpu topology for the ARM machines. And there are some ARM implementations that have the concept of cluster, for example, ARM64 server chip Kunpeng 920 has 6 or 8 clusters in each NUMA node and each cluster has 4 cores. All clusters share L3 cache data while the cores within each cluster share L2 cache. So parse cluster cpu topology for ARM machines, then guest kernel will take advantages of it for better scheduling performance. In virt_smp_parse(), the computing logic of missing values prefers cores over sockets over threads. And the value of clusters will be set as default 1 if not explictly specified, so that it will not impact the parsing results of machines that won't specify "clusters=" in -smp command line because they just don't support it. Signed-off-by: Yanan Wang --- hw/arm/virt.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/hw/arm/virt.c b/hw/arm/virt.c index 911ad7d3aa..c9ad76ff64 100644 --- a/hw/arm/virt.c +++ b/hw/arm/virt.c @@ -2608,35 +2608,37 @@ static void virt_smp_parse(MachineState *ms, QemuOpts *opts) if (opts) { unsigned cpus = qemu_opt_get_number(opts, "cpus", 0); unsigned sockets = qemu_opt_get_number(opts, "sockets", 0); + unsigned clusters = qemu_opt_get_number(opts, "clusters", 1); unsigned cores = qemu_opt_get_number(opts, "cores", 0); unsigned threads = qemu_opt_get_number(opts, "threads", 0); /* - * Compute missing values; prefer cores over sockets and - * sockets over threads. + * Compute missing values, prefer cores over sockets + * and sockets over threads. The value of clusters has + * been be set as default 1 if not explicitly specified. */ if (cpus == 0 || cores == 0) { sockets = sockets > 0 ? sockets : 1; threads = threads > 0 ? threads : 1; if (cpus == 0) { cores = cores > 0 ? cores : 1; - cpus = cores * threads * sockets; + cpus = sockets * clusters * cores * threads; } else { ms->smp.max_cpus = qemu_opt_get_number(opts, "maxcpus", cpus); - cores = ms->smp.max_cpus / (sockets * threads); + cores = ms->smp.max_cpus / (sockets * clusters * threads); } } else if (sockets == 0) { threads = threads > 0 ? threads : 1; - sockets = cpus / (cores * threads); + sockets = cpus / (clusters * cores * threads); sockets = sockets > 0 ? sockets : 1; } else if (threads == 0) { - threads = cpus / (cores * sockets); + threads = cpus / (sockets * clusters * cores); threads = threads > 0 ? threads : 1; - } else if (sockets * cores * threads < cpus) { + } else if (sockets * clusters * cores * threads < cpus) { error_report("cpu topology: " - "sockets (%u) * cores (%u) * threads (%u) < " - "smp_cpus (%u)", - sockets, cores, threads, cpus); + "sockets (%u) * clusters (%u) * cores (%u) * " + "threads (%u) < smp_cpus (%u)", + sockets, clusters, cores, threads, cpus); exit(1); } @@ -2647,16 +2649,17 @@ static void virt_smp_parse(MachineState *ms, QemuOpts *opts) exit(1); } - if (sockets * cores * threads != ms->smp.max_cpus) { + if (sockets * clusters * cores * threads != ms->smp.max_cpus) { error_report("cpu topology: " - "sockets (%u) * cores (%u) * threads (%u)" - "!= maxcpus (%u)", - sockets, cores, threads, + "sockets (%u) * clusters(%u) * cores (%u) * " + "threads (%u) != maxcpus (%u)", + sockets, clusters, cores, threads, ms->smp.max_cpus); exit(1); } ms->smp.cpus = cpus; + ms->smp.clusters = clusters; ms->smp.cores = cores; ms->smp.threads = threads; ms->smp.sockets = sockets; -- 2.19.1