From patchwork Wed Mar 31 09:53:41 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "wangyanan (Y)" X-Patchwork-Id: 1460446 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) 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 ozlabs.org (Postfix) with ESMTPS id 4F9MDf1LTNz9sVb for ; Wed, 31 Mar 2021 20:57:22 +1100 (AEDT) Received: from localhost ([::1]:36860 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lRXbE-0004dA-5J for incoming@patchwork.ozlabs.org; Wed, 31 Mar 2021 05:57:20 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:52204) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lRXYL-0002lr-T0; Wed, 31 Mar 2021 05:54:21 -0400 Received: from szxga04-in.huawei.com ([45.249.212.190]:4841) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lRXY7-0002aw-2M; Wed, 31 Mar 2021 05:54:21 -0400 Received: from DGGEMS409-HUB.china.huawei.com (unknown [172.30.72.59]) by szxga04-in.huawei.com (SkyGuard) with ESMTP id 4F9M6M1MGlz1BFy9; Wed, 31 Mar 2021 17:51:55 +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:51 +0800 From: Yanan Wang To: , Subject: [RFC PATCH 4/6] hw/i386/pc: Parse cluster cpu topology for PC machines Date: Wed, 31 Mar 2021 17:53:41 +0800 Message-ID: <20210331095343.12172-5-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 X-Originating-IP: [10.174.187.128] X-CFilter-Loop: Reflected Received-SPF: pass client-ip=45.249.212.190; envelope-from=wangyanan55@huawei.com; helo=szxga04-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=ham 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" There is a separate function pc_smp_parse() in hw/i386/pc.c used to parse cpu topology for the PC machines. And there are some x86 implementations that have a similar concept of cluster, for example, on Jacobsville there are 6 clusters of 4 Atom cores, each cluster sharing a separate L2 cache, and 24 cores sharing L3 cache. So parse cluster cpu topology the for PC machines, then guest kernel will take advantages of it for better scheduling performance. In pc_smp_parse(), the computing logic of missing values prefers sockets over cores 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/i386/pc.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/hw/i386/pc.c b/hw/i386/pc.c index 8aa85dec54..f2906f9185 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -716,33 +716,39 @@ void pc_smp_parse(MachineState *ms, QemuOpts *opts) unsigned cpus = qemu_opt_get_number(opts, "cpus", 0); unsigned sockets = qemu_opt_get_number(opts, "sockets", 0); unsigned dies = qemu_opt_get_number(opts, "dies", 1); + 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 sockets over cores over threads */ + /* + * Compute missing values, prefer sockets over cores + * over threads. And the value of dies or clusters has + * been set as default 1 if not explicitly specified. + */ if (cpus == 0 || sockets == 0) { cores = cores > 0 ? cores : 1; threads = threads > 0 ? threads : 1; if (cpus == 0) { sockets = sockets > 0 ? sockets : 1; - cpus = cores * threads * dies * sockets; + cpus = sockets * dies * clusters * cores * threads; } else { ms->smp.max_cpus = qemu_opt_get_number(opts, "maxcpus", cpus); - sockets = ms->smp.max_cpus / (cores * threads * dies); + sockets = ms->smp.max_cpus / + (dies * clusters * cores * threads); } } else if (cores == 0) { threads = threads > 0 ? threads : 1; - cores = cpus / (sockets * dies * threads); + cores = cpus / (sockets * dies * clusters * threads); cores = cores > 0 ? cores : 1; } else if (threads == 0) { - threads = cpus / (cores * dies * sockets); + threads = cpus / (sockets * dies * clusters * cores); threads = threads > 0 ? threads : 1; - } else if (sockets * dies * cores * threads < cpus) { + } else if (sockets * dies * clusters * cores * threads < cpus) { error_report("cpu topology: " - "sockets (%u) * dies (%u) * cores (%u) * threads (%u) < " - "smp_cpus (%u)", - sockets, dies, cores, threads, cpus); + "sockets (%u) * dies (%u) * clusters (%u) * " + "cores (%u) * threads (%u) < smp_cpus (%u)", + sockets, dies, clusters, cores, threads, cpus); exit(1); } @@ -756,14 +762,15 @@ void pc_smp_parse(MachineState *ms, QemuOpts *opts) if (sockets * dies * cores * threads != ms->smp.max_cpus) { error_report("Invalid CPU topology deprecated: " - "sockets (%u) * dies (%u) * cores (%u) * threads (%u) " - "!= maxcpus (%u)", - sockets, dies, cores, threads, + "sockets (%u) * dies (%u) * clusters (%u) * " + "cores (%u) * threads (%u) != maxcpus (%u)", + sockets, dies, 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;