From nobody Tue Feb 10 15:45:17 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=huawei.com ARC-Seal: i=1; a=rsa-sha256; t=1617184681; cv=none; d=zohomail.com; s=zohoarc; b=J2RyBH5eV8wg1xIlhigVHJiHfZGaZqVZNRKYL+nlXTy28jFrSSyHOBlh/IRiOGDtM+6A5X5EzOey1MbzRtvDmd9lQ3Cu9IsZrXsh376t+XYJ48qGwzXKy8eDh7IKFSXHLCsDR9RR3ebOqWhFj4Q23fdlQou8hd1jCWMUH/KqlUU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1617184681; h=Content-Type:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=1rrhz3oz0u+doMkImXKsK/Fp15V5Q9Ull/x+D/I5W1c=; b=QVd8E6mDUWnWyUxjh3zHnqjAuWa+t/c0LIvUfj6X3C/f4itCE832SuXCg055QLiUasQglZ5k5jEPeOU9kqyouaUsDNPTpMEqGaPTJFfH8l4Di28NOj5o/TIxGmyAQUIvTxmeaBqUoAMeB31/FgfI5nn9+C/vncV8InFe5chE33g= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1617184681532139.66915304878376; Wed, 31 Mar 2021 02:58:01 -0700 (PDT) Received: from localhost ([::1]:40754 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lRXbq-0006J8-Up for importer@patchew.org; Wed, 31 Mar 2021 05:58:00 -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 (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; 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+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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=3D" 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 =3D qemu_opt_get_number(opts, "cpus", 0); unsigned sockets =3D qemu_opt_get_number(opts, "sockets", 0); unsigned dies =3D qemu_opt_get_number(opts, "dies", 1); + unsigned clusters =3D qemu_opt_get_number(opts, "clusters", 1); unsigned cores =3D qemu_opt_get_number(opts, "cores", 0); unsigned threads =3D qemu_opt_get_number(opts, "threads", 0); =20 - /* 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 =3D=3D 0 || sockets =3D=3D 0) { cores =3D cores > 0 ? cores : 1; threads =3D threads > 0 ? threads : 1; if (cpus =3D=3D 0) { sockets =3D sockets > 0 ? sockets : 1; - cpus =3D cores * threads * dies * sockets; + cpus =3D sockets * dies * clusters * cores * threads; } else { ms->smp.max_cpus =3D qemu_opt_get_number(opts, "maxcpus", cpus); - sockets =3D ms->smp.max_cpus / (cores * threads * dies); + sockets =3D ms->smp.max_cpus / + (dies * clusters * cores * threads); } } else if (cores =3D=3D 0) { threads =3D threads > 0 ? threads : 1; - cores =3D cpus / (sockets * dies * threads); + cores =3D cpus / (sockets * dies * clusters * threads); cores =3D cores > 0 ? cores : 1; } else if (threads =3D=3D 0) { - threads =3D cpus / (cores * dies * sockets); + threads =3D cpus / (sockets * dies * clusters * cores); threads =3D 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); } =20 @@ -756,14 +762,15 @@ void pc_smp_parse(MachineState *ms, QemuOpts *opts) =20 if (sockets * dies * cores * threads !=3D ms->smp.max_cpus) { error_report("Invalid CPU topology deprecated: " - "sockets (%u) * dies (%u) * cores (%u) * threads = (%u) " - "!=3D maxcpus (%u)", - sockets, dies, cores, threads, + "sockets (%u) * dies (%u) * clusters (%u) * " + "cores (%u) * threads (%u) !=3D maxcpus (%u)", + sockets, dies, clusters, cores, threads, ms->smp.max_cpus); exit(1); } =20 ms->smp.cpus =3D cpus; + ms->smp.clusters =3D clusters; ms->smp.cores =3D cores; ms->smp.threads =3D threads; ms->smp.sockets =3D sockets; --=20 2.19.1