* [PATCH v2 0/7] Introduce SMP Cache Topology
@ 2024-09-08 12:59 Zhao Liu
2024-09-08 12:59 ` [PATCH v2 1/7] hw/core: Make CPU topology enumeration arch-agnostic Zhao Liu
` (8 more replies)
0 siblings, 9 replies; 18+ messages in thread
From: Zhao Liu @ 2024-09-08 12:59 UTC (permalink / raw)
To: Daniel P . Berrangé, Igor Mammedov, Eduardo Habkost,
Marcel Apfelbaum, Philippe Mathieu-Daudé, Yanan Wang,
Michael S . Tsirkin, Paolo Bonzini, Richard Henderson, Eric Blake,
Markus Armbruster, Marcelo Tosatti, Alex Bennée,
Peter Maydell, Jonathan Cameron, Sia Jee Heng, Alireza Sanaee
Cc: qemu-devel, kvm, qemu-riscv, qemu-arm, Zhenyu Wang, Dapeng Mi,
Yongwei Ma, Zhao Liu
Hi all,
Compared with previous Patch v1 [1], I've put the cache properties list
into -machine, this is to meet current needs and also remain compatible
with my future topology support (more discussion details, pls refer [2]).
This series is based on the commit 1581a0bc928d ("Merge tag 'pull-ufs-
20240906' of https://gitlab.com/jeuk20.kim/qemu into staging ufs
queue").
Background
==========
The x86 and ARM (RISCV) need to allow user to configure cache properties
(current only topology):
* For x86, the default cache topology model (of max/host CPU) does not
always match the Host's real physical cache topology. Performance can
increase when the configured virtual topology is closer to the
physical topology than a default topology would be.
* For ARM, QEMU can't get the cache topology information from the CPU
registers, then user configuration is necessary. Additionally, the
cache information is also needed for MPAM emulation (for TCG) to
build the right PPTT. (Originally from Jonathan)
About smp-cache
===============
In this version, smp-cache is implemented as a array integrated in
-machine. Though -machine currently can't support JSON format, this is
the one of the directions of future.
An example is as follows:
smp_cache=smp-cache.0.cache=l1i,smp-cache.0.topology=core,smp-cache.1.cache=l1d,smp-cache.1.topology=core,smp-cache.2.cache=l2,smp-cache.2.topology=module,smp-cache.3.cache=l3,smp-cache.3.topology=die
"cache" specifies the cache that the properties will be applied on. This
field is the combination of cache level and cache type. Now it supports
"l1d" (L1 data cache), "l1i" (L1 instruction cache), "l2" (L2 unified
cache) and "l3" (L3 unified cache).
"topology" field accepts CPU topology levels including "thread", "core",
"module", "cluster", "die", "socket", "book", "drawer" and a special
value "default".
The "default" is introduced to make it easier for libvirt to set a
default parameter value without having to care about the specific
machine (because currently there is no proper way for machine to
expose supported topology levels and caches).
If "default" is set, then the cache topology will follow the
architecture's default cache topology model. If other CPU topology level
is set, the cache will be shared at corresponding CPU topology level.
Welcome your comment!
[1]: Patch v1: https://lore.kernel.org/qemu-devel/20240704031603.1744546-1-zhao1.liu@intel.com/
[2]: API disscussion: https://lore.kernel.org/qemu-devel/8734ndj33j.fsf@pond.sub.org/
Thanks and Best Regards,
Zhao
---
Changelog:
Main changes since Patch v1:
* Dropped handwriten smp-cache object and integrated cache properties
list into MachineState and used -machine to configure SMP cache
properties. (Markus)
* Dropped prefix of CpuTopologyLevel enumeration. (Markus)
* Rename CPU_TOPO_LEVEL_* to CPU_TOPOLOGY_LEVEL_* to match the QAPI's
generated code. (Markus)
* Renamed SMPCacheProperty/SMPCacheProperties (QAPI structures) to
SmpCacheProperties/SmpCachePropertiesWrapper. (Markus)
* Renamed SMPCacheName (QAPI structure) to SmpCacheLevelAndType and
dropped prefix. (Markus)
* Renamed 'name' field in SmpCacheProperties to 'cache', since the
type and level of the cache in SMP system could be able to specify
all of these kinds of cache explicitly enough.
* Renamed 'topo' field in SmpCacheProperties to 'topology'. (Markus)
* Returned error information when user repeats setting cache
properties. (Markus)
* Renamed SmpCacheLevelAndType to CacheLevelAndType, since this
representation is general across SMP or hybrid system.
* Dropped machine_check_smp_cache_support() and did the check when
-machine parses smp-cache in machine_parse_smp_cache().
Main changes since RFC v2:
* Dropped cpu-topology.h and cpu-topology.c since QAPI has the helper
(CpuTopologyLevel_str) to convert enum to string. (Markus)
* Fixed text format in machine.json (CpuTopologyLevel naming, 2 spaces
between sentences). (Markus)
* Added a new level "default" to de-compatibilize some arch-specific
topo settings. (Daniel)
* Moved CpuTopologyLevel to qapi/machine-common.json, at where the
cache enumeration and smp-cache object would be added.
- If smp-cache object is defined in qapi/machine.json, storage-daemon
will complain about the qmp cmds in qapi/machine.json during
compiling.
* Referred to Daniel's suggestion to introduce cache JSON list, though
as a standalone object since -smp/-machine can't support JSON.
* Linked machine's smp_cache to smp-cache object instead of a builtin
structure. This is to get around the fact that the keyval format of
-machine can't support JSON.
* Wrapped the cache topology level access into a helper.
* Split as a separate commit to just include compatibility checking and
topology checking.
* Allow setting "default" topology level even though the cache
isn't supported by machine. (Daniel)
* Rewrote the document of smp-cache object.
Main changes since RFC v1:
* Split CpuTopology renaimg out of this RFC.
* Use QAPI to enumerate CPU topology levels.
* Drop string_to_cpu_topo() since QAPI will help to parse the topo
levels.
* Set has_*_cache field in machine_get_smp(). (JeeHeng)
* Use "*_cache=topo_level" as -smp example as the original "level"
term for a cache has a totally different meaning. (Jonathan)
---
Zhao Liu (7):
hw/core: Make CPU topology enumeration arch-agnostic
qapi/qom: Define cache enumeration and properties
hw/core: Add smp cache topology for machine
hw/core: Check smp cache topology support for machine
i386/cpu: Support thread and module level cache topology
i386/cpu: Update cache topology with machine's configuration
i386/pc: Support cache topology in -machine for PC machine
hw/core/machine-smp.c | 119 +++++++++++++++++++++++
hw/core/machine.c | 44 +++++++++
hw/i386/pc.c | 4 +
hw/i386/x86-common.c | 4 +-
include/hw/boards.h | 13 +++
include/hw/i386/topology.h | 22 +----
qapi/machine-common.json | 96 ++++++++++++++++++-
qemu-options.hx | 28 +++++-
target/i386/cpu.c | 191 ++++++++++++++++++++++---------------
target/i386/cpu.h | 4 +-
10 files changed, 425 insertions(+), 100 deletions(-)
--
2.34.1
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v2 1/7] hw/core: Make CPU topology enumeration arch-agnostic
2024-09-08 12:59 [PATCH v2 0/7] Introduce SMP Cache Topology Zhao Liu
@ 2024-09-08 12:59 ` Zhao Liu
2024-09-08 12:59 ` [PATCH v2 2/7] qapi/qom: Define cache enumeration and properties Zhao Liu
` (7 subsequent siblings)
8 siblings, 0 replies; 18+ messages in thread
From: Zhao Liu @ 2024-09-08 12:59 UTC (permalink / raw)
To: Daniel P . Berrangé, Igor Mammedov, Eduardo Habkost,
Marcel Apfelbaum, Philippe Mathieu-Daudé, Yanan Wang,
Michael S . Tsirkin, Paolo Bonzini, Richard Henderson, Eric Blake,
Markus Armbruster, Marcelo Tosatti, Alex Bennée,
Peter Maydell, Jonathan Cameron, Sia Jee Heng, Alireza Sanaee
Cc: qemu-devel, kvm, qemu-riscv, qemu-arm, Zhenyu Wang, Dapeng Mi,
Yongwei Ma, Zhao Liu
Cache topology needs to be defined based on CPU topology levels. Thus,
define CPU topology enumeration in qapi/machine.json to make it generic
for all architectures.
To match the general topology naming style, rename CPU_TOPO_LEVEL_* to
CPU_TOPOLOGY_LEVEL_*, and rename SMT and package levels to thread and
socket.
Also, enumerate additional topology levels for non-i386 arches, and add
a CPU_TOPOLOGY_LEVEL_DEFAULT to help future smp-cache object to work
with compatibility requirement of arch-specific cache topology models.
Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
Tested-by: Yongwei Ma <yongwei.ma@intel.com>
---
Changes since Patch v1:
* Dropped prefix of CpuTopologyLevel enumeration. (Markus)
* Rename CPU_TOPO_LEVEL_* to CPU_TOPOLOGY_LEVEL_* to match the QAPI's
generated code. (Markus)
Changes since RFC v2:
* Dropped cpu-topology.h and cpu-topology.c since QAPI has the helper
(CpuTopologyLevel_str) to convert enum to string. (Markus)
* Fixed text format in machine.json (CpuTopologyLevel naming, 2 spaces
between sentences). (Markus)
* Added a new level "default" to de-compatibilize some arch-specific
topo settings. (Daniel)
* Moved CpuTopologyLevel to qapi/machine-common.json, at where the
cache enumeration and smp-cache object would be added.
- If smp-cache object is defined in qapi/machine.json, storage-daemon
will complain about the qmp cmds in qapi/machine.json during
compiling.
Changes since RFC v1:
* Used QAPI to enumerate CPU topology levels.
* Dropped string_to_cpu_topo() since QAPI will help to parse the topo
levels.
---
hw/i386/x86-common.c | 4 +-
include/hw/i386/topology.h | 22 +-----
qapi/machine-common.json | 46 +++++++++++-
target/i386/cpu.c | 144 ++++++++++++++++++-------------------
target/i386/cpu.h | 4 +-
5 files changed, 124 insertions(+), 96 deletions(-)
diff --git a/hw/i386/x86-common.c b/hw/i386/x86-common.c
index 992ea1f25e94..b21d2ab97349 100644
--- a/hw/i386/x86-common.c
+++ b/hw/i386/x86-common.c
@@ -273,12 +273,12 @@ void x86_cpu_pre_plug(HotplugHandler *hotplug_dev,
if (ms->smp.modules > 1) {
env->nr_modules = ms->smp.modules;
- set_bit(CPU_TOPO_LEVEL_MODULE, env->avail_cpu_topo);
+ set_bit(CPU_TOPOLOGY_LEVEL_MODULE, env->avail_cpu_topo);
}
if (ms->smp.dies > 1) {
env->nr_dies = ms->smp.dies;
- set_bit(CPU_TOPO_LEVEL_DIE, env->avail_cpu_topo);
+ set_bit(CPU_TOPOLOGY_LEVEL_DIE, env->avail_cpu_topo);
}
/*
diff --git a/include/hw/i386/topology.h b/include/hw/i386/topology.h
index dff49fce1154..bf740383038b 100644
--- a/include/hw/i386/topology.h
+++ b/include/hw/i386/topology.h
@@ -39,7 +39,7 @@
* CPUID Fn8000_0008_ECX[ApicIdCoreIdSize[3:0]] is set to apicid_core_width().
*/
-
+#include "qapi/qapi-types-machine-common.h"
#include "qemu/bitops.h"
/*
@@ -62,22 +62,6 @@ typedef struct X86CPUTopoInfo {
unsigned threads_per_core;
} X86CPUTopoInfo;
-/*
- * CPUTopoLevel is the general i386 topology hierarchical representation,
- * ordered by increasing hierarchical relationship.
- * Its enumeration value is not bound to the type value of Intel (CPUID[0x1F])
- * or AMD (CPUID[0x80000026]).
- */
-enum CPUTopoLevel {
- CPU_TOPO_LEVEL_INVALID,
- CPU_TOPO_LEVEL_SMT,
- CPU_TOPO_LEVEL_CORE,
- CPU_TOPO_LEVEL_MODULE,
- CPU_TOPO_LEVEL_DIE,
- CPU_TOPO_LEVEL_PACKAGE,
- CPU_TOPO_LEVEL_MAX,
-};
-
/* Return the bit width needed for 'count' IDs */
static unsigned apicid_bitwidth_for_count(unsigned count)
{
@@ -212,8 +196,8 @@ static inline apic_id_t x86_apicid_from_cpu_idx(X86CPUTopoInfo *topo_info,
*/
static inline bool x86_has_extended_topo(unsigned long *topo_bitmap)
{
- return test_bit(CPU_TOPO_LEVEL_MODULE, topo_bitmap) ||
- test_bit(CPU_TOPO_LEVEL_DIE, topo_bitmap);
+ return test_bit(CPU_TOPOLOGY_LEVEL_MODULE, topo_bitmap) ||
+ test_bit(CPU_TOPOLOGY_LEVEL_DIE, topo_bitmap);
}
#endif /* HW_I386_TOPOLOGY_H */
diff --git a/qapi/machine-common.json b/qapi/machine-common.json
index fa6bd71d1280..148a2c8dccca 100644
--- a/qapi/machine-common.json
+++ b/qapi/machine-common.json
@@ -5,7 +5,7 @@
# See the COPYING file in the top-level directory.
##
-# = Machines S390 data types
+# = Common machine types
##
##
@@ -19,3 +19,47 @@
{ 'enum': 'CpuS390Entitlement',
'prefix': 'S390_CPU_ENTITLEMENT',
'data': [ 'auto', 'low', 'medium', 'high' ] }
+
+##
+# @CpuTopologyLevel:
+#
+# An enumeration of CPU topology levels.
+#
+# @invalid: Invalid topology level.
+#
+# @thread: thread level, which would also be called SMT level or
+# logical processor level. The @threads option in
+# SMPConfiguration is used to configure the topology of this
+# level.
+#
+# @core: core level. The @cores option in SMPConfiguration is used
+# to configure the topology of this level.
+#
+# @module: module level. The @modules option in SMPConfiguration is
+# used to configure the topology of this level.
+#
+# @cluster: cluster level. The @clusters option in SMPConfiguration
+# is used to configure the topology of this level.
+#
+# @die: die level. The @dies option in SMPConfiguration is used to
+# configure the topology of this level.
+#
+# @socket: socket level, which would also be called package level.
+# The @sockets option in SMPConfiguration is used to configure
+# the topology of this level.
+#
+# @book: book level. The @books option in SMPConfiguration is used
+# to configure the topology of this level.
+#
+# @drawer: drawer level. The @drawers option in SMPConfiguration is
+# used to configure the topology of this level.
+#
+# @default: default level. Some architectures will have default
+# topology settings (e.g., cache topology), and this special
+# level means following the architecture-specific settings.
+#
+# Since: 9.1
+##
+{ 'enum': 'CpuTopologyLevel',
+ 'data': [ 'invalid', 'thread', 'core', 'module', 'cluster',
+ 'die', 'socket', 'book', 'drawer', 'default' ] }
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index 85ef7452c04e..e3a81bc64922 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -236,23 +236,23 @@ static uint8_t cpuid2_cache_descriptor(CPUCacheInfo *cache)
0 /* Invalid value */)
static uint32_t max_thread_ids_for_cache(X86CPUTopoInfo *topo_info,
- enum CPUTopoLevel share_level)
+ enum CpuTopologyLevel share_level)
{
uint32_t num_ids = 0;
switch (share_level) {
- case CPU_TOPO_LEVEL_CORE:
+ case CPU_TOPOLOGY_LEVEL_CORE:
num_ids = 1 << apicid_core_offset(topo_info);
break;
- case CPU_TOPO_LEVEL_DIE:
+ case CPU_TOPOLOGY_LEVEL_DIE:
num_ids = 1 << apicid_die_offset(topo_info);
break;
- case CPU_TOPO_LEVEL_PACKAGE:
+ case CPU_TOPOLOGY_LEVEL_SOCKET:
num_ids = 1 << apicid_pkg_offset(topo_info);
break;
default:
/*
- * Currently there is no use case for SMT and MODULE, so use
+ * Currently there is no use case for THREAD and MODULE, so use
* assert directly to facilitate debugging.
*/
g_assert_not_reached();
@@ -301,19 +301,19 @@ static void encode_cache_cpuid4(CPUCacheInfo *cache,
}
static uint32_t num_threads_by_topo_level(X86CPUTopoInfo *topo_info,
- enum CPUTopoLevel topo_level)
+ enum CpuTopologyLevel topo_level)
{
switch (topo_level) {
- case CPU_TOPO_LEVEL_SMT:
+ case CPU_TOPOLOGY_LEVEL_THREAD:
return 1;
- case CPU_TOPO_LEVEL_CORE:
+ case CPU_TOPOLOGY_LEVEL_CORE:
return topo_info->threads_per_core;
- case CPU_TOPO_LEVEL_MODULE:
+ case CPU_TOPOLOGY_LEVEL_MODULE:
return topo_info->threads_per_core * topo_info->cores_per_module;
- case CPU_TOPO_LEVEL_DIE:
+ case CPU_TOPOLOGY_LEVEL_DIE:
return topo_info->threads_per_core * topo_info->cores_per_module *
topo_info->modules_per_die;
- case CPU_TOPO_LEVEL_PACKAGE:
+ case CPU_TOPOLOGY_LEVEL_SOCKET:
return topo_info->threads_per_core * topo_info->cores_per_module *
topo_info->modules_per_die * topo_info->dies_per_pkg;
default:
@@ -323,18 +323,18 @@ static uint32_t num_threads_by_topo_level(X86CPUTopoInfo *topo_info,
}
static uint32_t apicid_offset_by_topo_level(X86CPUTopoInfo *topo_info,
- enum CPUTopoLevel topo_level)
+ enum CpuTopologyLevel topo_level)
{
switch (topo_level) {
- case CPU_TOPO_LEVEL_SMT:
+ case CPU_TOPOLOGY_LEVEL_THREAD:
return 0;
- case CPU_TOPO_LEVEL_CORE:
+ case CPU_TOPOLOGY_LEVEL_CORE:
return apicid_core_offset(topo_info);
- case CPU_TOPO_LEVEL_MODULE:
+ case CPU_TOPOLOGY_LEVEL_MODULE:
return apicid_module_offset(topo_info);
- case CPU_TOPO_LEVEL_DIE:
+ case CPU_TOPOLOGY_LEVEL_DIE:
return apicid_die_offset(topo_info);
- case CPU_TOPO_LEVEL_PACKAGE:
+ case CPU_TOPOLOGY_LEVEL_SOCKET:
return apicid_pkg_offset(topo_info);
default:
g_assert_not_reached();
@@ -342,18 +342,18 @@ static uint32_t apicid_offset_by_topo_level(X86CPUTopoInfo *topo_info,
return 0;
}
-static uint32_t cpuid1f_topo_type(enum CPUTopoLevel topo_level)
+static uint32_t cpuid1f_topo_type(enum CpuTopologyLevel topo_level)
{
switch (topo_level) {
- case CPU_TOPO_LEVEL_INVALID:
+ case CPU_TOPOLOGY_LEVEL_INVALID:
return CPUID_1F_ECX_TOPO_LEVEL_INVALID;
- case CPU_TOPO_LEVEL_SMT:
+ case CPU_TOPOLOGY_LEVEL_THREAD:
return CPUID_1F_ECX_TOPO_LEVEL_SMT;
- case CPU_TOPO_LEVEL_CORE:
+ case CPU_TOPOLOGY_LEVEL_CORE:
return CPUID_1F_ECX_TOPO_LEVEL_CORE;
- case CPU_TOPO_LEVEL_MODULE:
+ case CPU_TOPOLOGY_LEVEL_MODULE:
return CPUID_1F_ECX_TOPO_LEVEL_MODULE;
- case CPU_TOPO_LEVEL_DIE:
+ case CPU_TOPOLOGY_LEVEL_DIE:
return CPUID_1F_ECX_TOPO_LEVEL_DIE;
default:
/* Other types are not supported in QEMU. */
@@ -371,16 +371,16 @@ static void encode_topo_cpuid1f(CPUX86State *env, uint32_t count,
unsigned long level, next_level;
uint32_t num_threads_next_level, offset_next_level;
- assert(count + 1 < CPU_TOPO_LEVEL_MAX);
+ assert(count + 1 < CPU_TOPOLOGY_LEVEL__MAX);
/*
* Find the No.(count + 1) topology level in avail_cpu_topo bitmap.
- * The search starts from bit 1 (CPU_TOPO_LEVEL_INVALID + 1).
+ * The search starts from bit 1 (CPU_TOPOLOGY_LEVEL_INVALID + 1).
*/
- level = CPU_TOPO_LEVEL_INVALID;
+ level = CPU_TOPOLOGY_LEVEL_INVALID;
for (int i = 0; i <= count; i++) {
level = find_next_bit(env->avail_cpu_topo,
- CPU_TOPO_LEVEL_PACKAGE,
+ CPU_TOPOLOGY_LEVEL_SOCKET,
level + 1);
/*
@@ -388,18 +388,18 @@ static void encode_topo_cpuid1f(CPUX86State *env, uint32_t count,
* and it just encodes the invalid level (all fields are 0)
* into the last subleaf of 0x1f.
*/
- if (level == CPU_TOPO_LEVEL_PACKAGE) {
- level = CPU_TOPO_LEVEL_INVALID;
+ if (level == CPU_TOPOLOGY_LEVEL_SOCKET) {
+ level = CPU_TOPOLOGY_LEVEL_INVALID;
break;
}
}
- if (level == CPU_TOPO_LEVEL_INVALID) {
+ if (level == CPU_TOPOLOGY_LEVEL_INVALID) {
num_threads_next_level = 0;
offset_next_level = 0;
} else {
next_level = find_next_bit(env->avail_cpu_topo,
- CPU_TOPO_LEVEL_PACKAGE,
+ CPU_TOPOLOGY_LEVEL_SOCKET,
level + 1);
num_threads_next_level = num_threads_by_topo_level(topo_info,
next_level);
@@ -575,7 +575,7 @@ static CPUCacheInfo legacy_l1d_cache = {
.sets = 64,
.partitions = 1,
.no_invd_sharing = true,
- .share_level = CPU_TOPO_LEVEL_CORE,
+ .share_level = CPU_TOPOLOGY_LEVEL_CORE,
};
/*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */
@@ -590,7 +590,7 @@ static CPUCacheInfo legacy_l1d_cache_amd = {
.partitions = 1,
.lines_per_tag = 1,
.no_invd_sharing = true,
- .share_level = CPU_TOPO_LEVEL_CORE,
+ .share_level = CPU_TOPOLOGY_LEVEL_CORE,
};
/* L1 instruction cache: */
@@ -604,7 +604,7 @@ static CPUCacheInfo legacy_l1i_cache = {
.sets = 64,
.partitions = 1,
.no_invd_sharing = true,
- .share_level = CPU_TOPO_LEVEL_CORE,
+ .share_level = CPU_TOPOLOGY_LEVEL_CORE,
};
/*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */
@@ -619,7 +619,7 @@ static CPUCacheInfo legacy_l1i_cache_amd = {
.partitions = 1,
.lines_per_tag = 1,
.no_invd_sharing = true,
- .share_level = CPU_TOPO_LEVEL_CORE,
+ .share_level = CPU_TOPOLOGY_LEVEL_CORE,
};
/* Level 2 unified cache: */
@@ -633,7 +633,7 @@ static CPUCacheInfo legacy_l2_cache = {
.sets = 4096,
.partitions = 1,
.no_invd_sharing = true,
- .share_level = CPU_TOPO_LEVEL_CORE,
+ .share_level = CPU_TOPOLOGY_LEVEL_CORE,
};
/*FIXME: CPUID leaf 2 descriptor is inconsistent with CPUID leaf 4 */
@@ -643,7 +643,7 @@ static CPUCacheInfo legacy_l2_cache_cpuid2 = {
.size = 2 * MiB,
.line_size = 64,
.associativity = 8,
- .share_level = CPU_TOPO_LEVEL_INVALID,
+ .share_level = CPU_TOPOLOGY_LEVEL_INVALID,
};
@@ -657,7 +657,7 @@ static CPUCacheInfo legacy_l2_cache_amd = {
.associativity = 16,
.sets = 512,
.partitions = 1,
- .share_level = CPU_TOPO_LEVEL_CORE,
+ .share_level = CPU_TOPOLOGY_LEVEL_CORE,
};
/* Level 3 unified cache: */
@@ -673,7 +673,7 @@ static CPUCacheInfo legacy_l3_cache = {
.self_init = true,
.inclusive = true,
.complex_indexing = true,
- .share_level = CPU_TOPO_LEVEL_DIE,
+ .share_level = CPU_TOPOLOGY_LEVEL_DIE,
};
/* TLB definitions: */
@@ -2017,7 +2017,7 @@ static const CPUCaches epyc_cache_info = {
.lines_per_tag = 1,
.self_init = 1,
.no_invd_sharing = true,
- .share_level = CPU_TOPO_LEVEL_CORE,
+ .share_level = CPU_TOPOLOGY_LEVEL_CORE,
},
.l1i_cache = &(CPUCacheInfo) {
.type = INSTRUCTION_CACHE,
@@ -2030,7 +2030,7 @@ static const CPUCaches epyc_cache_info = {
.lines_per_tag = 1,
.self_init = 1,
.no_invd_sharing = true,
- .share_level = CPU_TOPO_LEVEL_CORE,
+ .share_level = CPU_TOPOLOGY_LEVEL_CORE,
},
.l2_cache = &(CPUCacheInfo) {
.type = UNIFIED_CACHE,
@@ -2041,7 +2041,7 @@ static const CPUCaches epyc_cache_info = {
.partitions = 1,
.sets = 1024,
.lines_per_tag = 1,
- .share_level = CPU_TOPO_LEVEL_CORE,
+ .share_level = CPU_TOPOLOGY_LEVEL_CORE,
},
.l3_cache = &(CPUCacheInfo) {
.type = UNIFIED_CACHE,
@@ -2055,7 +2055,7 @@ static const CPUCaches epyc_cache_info = {
.self_init = true,
.inclusive = true,
.complex_indexing = true,
- .share_level = CPU_TOPO_LEVEL_DIE,
+ .share_level = CPU_TOPOLOGY_LEVEL_DIE,
},
};
@@ -2071,7 +2071,7 @@ static CPUCaches epyc_v4_cache_info = {
.lines_per_tag = 1,
.self_init = 1,
.no_invd_sharing = true,
- .share_level = CPU_TOPO_LEVEL_CORE,
+ .share_level = CPU_TOPOLOGY_LEVEL_CORE,
},
.l1i_cache = &(CPUCacheInfo) {
.type = INSTRUCTION_CACHE,
@@ -2084,7 +2084,7 @@ static CPUCaches epyc_v4_cache_info = {
.lines_per_tag = 1,
.self_init = 1,
.no_invd_sharing = true,
- .share_level = CPU_TOPO_LEVEL_CORE,
+ .share_level = CPU_TOPOLOGY_LEVEL_CORE,
},
.l2_cache = &(CPUCacheInfo) {
.type = UNIFIED_CACHE,
@@ -2095,7 +2095,7 @@ static CPUCaches epyc_v4_cache_info = {
.partitions = 1,
.sets = 1024,
.lines_per_tag = 1,
- .share_level = CPU_TOPO_LEVEL_CORE,
+ .share_level = CPU_TOPOLOGY_LEVEL_CORE,
},
.l3_cache = &(CPUCacheInfo) {
.type = UNIFIED_CACHE,
@@ -2109,7 +2109,7 @@ static CPUCaches epyc_v4_cache_info = {
.self_init = true,
.inclusive = true,
.complex_indexing = false,
- .share_level = CPU_TOPO_LEVEL_DIE,
+ .share_level = CPU_TOPOLOGY_LEVEL_DIE,
},
};
@@ -2125,7 +2125,7 @@ static const CPUCaches epyc_rome_cache_info = {
.lines_per_tag = 1,
.self_init = 1,
.no_invd_sharing = true,
- .share_level = CPU_TOPO_LEVEL_CORE,
+ .share_level = CPU_TOPOLOGY_LEVEL_CORE,
},
.l1i_cache = &(CPUCacheInfo) {
.type = INSTRUCTION_CACHE,
@@ -2138,7 +2138,7 @@ static const CPUCaches epyc_rome_cache_info = {
.lines_per_tag = 1,
.self_init = 1,
.no_invd_sharing = true,
- .share_level = CPU_TOPO_LEVEL_CORE,
+ .share_level = CPU_TOPOLOGY_LEVEL_CORE,
},
.l2_cache = &(CPUCacheInfo) {
.type = UNIFIED_CACHE,
@@ -2149,7 +2149,7 @@ static const CPUCaches epyc_rome_cache_info = {
.partitions = 1,
.sets = 1024,
.lines_per_tag = 1,
- .share_level = CPU_TOPO_LEVEL_CORE,
+ .share_level = CPU_TOPOLOGY_LEVEL_CORE,
},
.l3_cache = &(CPUCacheInfo) {
.type = UNIFIED_CACHE,
@@ -2163,7 +2163,7 @@ static const CPUCaches epyc_rome_cache_info = {
.self_init = true,
.inclusive = true,
.complex_indexing = true,
- .share_level = CPU_TOPO_LEVEL_DIE,
+ .share_level = CPU_TOPOLOGY_LEVEL_DIE,
},
};
@@ -2179,7 +2179,7 @@ static const CPUCaches epyc_rome_v3_cache_info = {
.lines_per_tag = 1,
.self_init = 1,
.no_invd_sharing = true,
- .share_level = CPU_TOPO_LEVEL_CORE,
+ .share_level = CPU_TOPOLOGY_LEVEL_CORE,
},
.l1i_cache = &(CPUCacheInfo) {
.type = INSTRUCTION_CACHE,
@@ -2192,7 +2192,7 @@ static const CPUCaches epyc_rome_v3_cache_info = {
.lines_per_tag = 1,
.self_init = 1,
.no_invd_sharing = true,
- .share_level = CPU_TOPO_LEVEL_CORE,
+ .share_level = CPU_TOPOLOGY_LEVEL_CORE,
},
.l2_cache = &(CPUCacheInfo) {
.type = UNIFIED_CACHE,
@@ -2203,7 +2203,7 @@ static const CPUCaches epyc_rome_v3_cache_info = {
.partitions = 1,
.sets = 1024,
.lines_per_tag = 1,
- .share_level = CPU_TOPO_LEVEL_CORE,
+ .share_level = CPU_TOPOLOGY_LEVEL_CORE,
},
.l3_cache = &(CPUCacheInfo) {
.type = UNIFIED_CACHE,
@@ -2217,7 +2217,7 @@ static const CPUCaches epyc_rome_v3_cache_info = {
.self_init = true,
.inclusive = true,
.complex_indexing = false,
- .share_level = CPU_TOPO_LEVEL_DIE,
+ .share_level = CPU_TOPOLOGY_LEVEL_DIE,
},
};
@@ -2233,7 +2233,7 @@ static const CPUCaches epyc_milan_cache_info = {
.lines_per_tag = 1,
.self_init = 1,
.no_invd_sharing = true,
- .share_level = CPU_TOPO_LEVEL_CORE,
+ .share_level = CPU_TOPOLOGY_LEVEL_CORE,
},
.l1i_cache = &(CPUCacheInfo) {
.type = INSTRUCTION_CACHE,
@@ -2246,7 +2246,7 @@ static const CPUCaches epyc_milan_cache_info = {
.lines_per_tag = 1,
.self_init = 1,
.no_invd_sharing = true,
- .share_level = CPU_TOPO_LEVEL_CORE,
+ .share_level = CPU_TOPOLOGY_LEVEL_CORE,
},
.l2_cache = &(CPUCacheInfo) {
.type = UNIFIED_CACHE,
@@ -2257,7 +2257,7 @@ static const CPUCaches epyc_milan_cache_info = {
.partitions = 1,
.sets = 1024,
.lines_per_tag = 1,
- .share_level = CPU_TOPO_LEVEL_CORE,
+ .share_level = CPU_TOPOLOGY_LEVEL_CORE,
},
.l3_cache = &(CPUCacheInfo) {
.type = UNIFIED_CACHE,
@@ -2271,7 +2271,7 @@ static const CPUCaches epyc_milan_cache_info = {
.self_init = true,
.inclusive = true,
.complex_indexing = true,
- .share_level = CPU_TOPO_LEVEL_DIE,
+ .share_level = CPU_TOPOLOGY_LEVEL_DIE,
},
};
@@ -2287,7 +2287,7 @@ static const CPUCaches epyc_milan_v2_cache_info = {
.lines_per_tag = 1,
.self_init = 1,
.no_invd_sharing = true,
- .share_level = CPU_TOPO_LEVEL_CORE,
+ .share_level = CPU_TOPOLOGY_LEVEL_CORE,
},
.l1i_cache = &(CPUCacheInfo) {
.type = INSTRUCTION_CACHE,
@@ -2300,7 +2300,7 @@ static const CPUCaches epyc_milan_v2_cache_info = {
.lines_per_tag = 1,
.self_init = 1,
.no_invd_sharing = true,
- .share_level = CPU_TOPO_LEVEL_CORE,
+ .share_level = CPU_TOPOLOGY_LEVEL_CORE,
},
.l2_cache = &(CPUCacheInfo) {
.type = UNIFIED_CACHE,
@@ -2311,7 +2311,7 @@ static const CPUCaches epyc_milan_v2_cache_info = {
.partitions = 1,
.sets = 1024,
.lines_per_tag = 1,
- .share_level = CPU_TOPO_LEVEL_CORE,
+ .share_level = CPU_TOPOLOGY_LEVEL_CORE,
},
.l3_cache = &(CPUCacheInfo) {
.type = UNIFIED_CACHE,
@@ -2325,7 +2325,7 @@ static const CPUCaches epyc_milan_v2_cache_info = {
.self_init = true,
.inclusive = true,
.complex_indexing = false,
- .share_level = CPU_TOPO_LEVEL_DIE,
+ .share_level = CPU_TOPOLOGY_LEVEL_DIE,
},
};
@@ -2341,7 +2341,7 @@ static const CPUCaches epyc_genoa_cache_info = {
.lines_per_tag = 1,
.self_init = 1,
.no_invd_sharing = true,
- .share_level = CPU_TOPO_LEVEL_CORE,
+ .share_level = CPU_TOPOLOGY_LEVEL_CORE,
},
.l1i_cache = &(CPUCacheInfo) {
.type = INSTRUCTION_CACHE,
@@ -2354,7 +2354,7 @@ static const CPUCaches epyc_genoa_cache_info = {
.lines_per_tag = 1,
.self_init = 1,
.no_invd_sharing = true,
- .share_level = CPU_TOPO_LEVEL_CORE,
+ .share_level = CPU_TOPOLOGY_LEVEL_CORE,
},
.l2_cache = &(CPUCacheInfo) {
.type = UNIFIED_CACHE,
@@ -2365,7 +2365,7 @@ static const CPUCaches epyc_genoa_cache_info = {
.partitions = 1,
.sets = 2048,
.lines_per_tag = 1,
- .share_level = CPU_TOPO_LEVEL_CORE,
+ .share_level = CPU_TOPOLOGY_LEVEL_CORE,
},
.l3_cache = &(CPUCacheInfo) {
.type = UNIFIED_CACHE,
@@ -2379,7 +2379,7 @@ static const CPUCaches epyc_genoa_cache_info = {
.self_init = true,
.inclusive = true,
.complex_indexing = false,
- .share_level = CPU_TOPO_LEVEL_DIE,
+ .share_level = CPU_TOPOLOGY_LEVEL_DIE,
},
};
@@ -6507,7 +6507,7 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
/* Share the cache at package level. */
*eax |= max_thread_ids_for_cache(&topo_info,
- CPU_TOPO_LEVEL_PACKAGE) << 14;
+ CPU_TOPOLOGY_LEVEL_SOCKET) << 14;
}
}
} else if (cpu->vendor_cpuid_only && IS_AMD_CPU(env)) {
@@ -7992,10 +7992,10 @@ static void x86_cpu_init_default_topo(X86CPU *cpu)
env->nr_modules = 1;
env->nr_dies = 1;
- /* SMT, core and package levels are set by default. */
- set_bit(CPU_TOPO_LEVEL_SMT, env->avail_cpu_topo);
- set_bit(CPU_TOPO_LEVEL_CORE, env->avail_cpu_topo);
- set_bit(CPU_TOPO_LEVEL_PACKAGE, env->avail_cpu_topo);
+ /* thread, core and socket levels are set by default. */
+ set_bit(CPU_TOPOLOGY_LEVEL_THREAD, env->avail_cpu_topo);
+ set_bit(CPU_TOPOLOGY_LEVEL_CORE, env->avail_cpu_topo);
+ set_bit(CPU_TOPOLOGY_LEVEL_SOCKET, env->avail_cpu_topo);
}
static void x86_cpu_initfn(Object *obj)
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
index 14edd57a37ba..afe2b5fd3382 100644
--- a/target/i386/cpu.h
+++ b/target/i386/cpu.h
@@ -1665,7 +1665,7 @@ typedef struct CPUCacheInfo {
* Used to encode CPUID[4].EAX[bits 25:14] or
* CPUID[0x8000001D].EAX[bits 25:14].
*/
- enum CPUTopoLevel share_level;
+ CpuTopologyLevel share_level;
} CPUCacheInfo;
@@ -1995,7 +1995,7 @@ typedef struct CPUArchState {
unsigned nr_modules;
/* Bitmap of available CPU topology levels for this CPU. */
- DECLARE_BITMAP(avail_cpu_topo, CPU_TOPO_LEVEL_MAX);
+ DECLARE_BITMAP(avail_cpu_topo, CPU_TOPOLOGY_LEVEL__MAX);
} CPUX86State;
struct kvm_msrs;
--
2.34.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v2 2/7] qapi/qom: Define cache enumeration and properties
2024-09-08 12:59 [PATCH v2 0/7] Introduce SMP Cache Topology Zhao Liu
2024-09-08 12:59 ` [PATCH v2 1/7] hw/core: Make CPU topology enumeration arch-agnostic Zhao Liu
@ 2024-09-08 12:59 ` Zhao Liu
[not found] ` <20240917095126.000036f1@Huawei.com>
2024-09-08 12:59 ` [PATCH v2 3/7] hw/core: Add smp cache topology for machine Zhao Liu
` (6 subsequent siblings)
8 siblings, 1 reply; 18+ messages in thread
From: Zhao Liu @ 2024-09-08 12:59 UTC (permalink / raw)
To: Daniel P . Berrangé, Igor Mammedov, Eduardo Habkost,
Marcel Apfelbaum, Philippe Mathieu-Daudé, Yanan Wang,
Michael S . Tsirkin, Paolo Bonzini, Richard Henderson, Eric Blake,
Markus Armbruster, Marcelo Tosatti, Alex Bennée,
Peter Maydell, Jonathan Cameron, Sia Jee Heng, Alireza Sanaee
Cc: qemu-devel, kvm, qemu-riscv, qemu-arm, Zhenyu Wang, Dapeng Mi,
Yongwei Ma, Zhao Liu
The x86 and ARM need to allow user to configure cache properties
(current only topology):
* For x86, the default cache topology model (of max/host CPU) does not
always match the Host's real physical cache topology. Performance can
increase when the configured virtual topology is closer to the
physical topology than a default topology would be.
* For ARM, QEMU can't get the cache topology information from the CPU
registers, then user configuration is necessary. Additionally, the
cache information is also needed for MPAM emulation (for TCG) to
build the right PPTT.
Define smp-cache related enumeration and properties in QAPI, so that
user could configure cache properties for SMP system through -machine in
the subsequent patch.
Cache enumeration (CacheLevelAndType) is implemented as the combination
of cache level (level 1/2/3) and cache type (data/instruction/unified).
Currently, separated L1 cache (L1 data cache and L1 instruction cache)
with unified higher-level cache (e.g., unified L2 and L3 caches), is the
most common cache architectures.
Therefore, enumerate the L1 D-cache, L1 I-cache, L2 cache and L3 cache
with smp-cache object to add the basic cache topology support. Other
kinds of caches (e.g., L1 unified or L2/L3 separated caches) can be
added directly into CacheLevelAndType if necessary.
Cache properties (SmpCacheProperties) currently only contains cache
topology information, and other cache properties can be added in it
if necessary.
Note, define cache topology based on CPU topology level with two
reasons:
1. In practice, a cache will always be bound to the CPU container
(either private in the CPU container or shared among multiple
containers), and CPU container is often expressed in terms of CPU
topology level.
2. The x86's cache-related CPUIDs encode cache topology based on APIC
ID's CPU topology layout. And the ACPI PPTT table that ARM/RISCV
relies on also requires CPU containers to help indicate the private
shared hierarchy of the cache. Therefore, for SMP systems, it is
natural to use the CPU topology hierarchy directly in QEMU to define
the cache topology.
Suggested-by: Daniel P. Berrange <berrange@redhat.com>
Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
Tested-by: Yongwei Ma <yongwei.ma@intel.com>
---
Suggested by credit:
* Referred to Daniel's suggestion to introduce cache object list.
---
Changes since Patch v1:
* Renamed SMPCacheProperty/SMPCacheProperties (QAPI structures) to
SmpCacheProperties/SmpCachePropertiesWrapper. (Markus)
* Renamed SMPCacheName (QAPI structure) to SmpCacheLevelAndType and
dropped prefix. (Markus)
* Renamed 'name' field in SmpCacheProperties to 'cache', since the
type and level of the cache in SMP system could be able to specify
all of these kinds of cache explicitly enough.
* Renamed 'topo' field in SmpCacheProperties to 'topology'. (Markus)
* Returned error information when user repeats setting cache
properties. (Markus)
* Renamed SmpCacheLevelAndType to CacheLevelAndType, since this
representation is general across SMP or hybrid system.
* Dropped handwriten smp-cache object and integrated cache pproperties
list into MachineState (in next patch). (Markus)
* Added the reason why x86 and ARM need to configure cache
information. (Markus and Jonathan)
Changes since RFC v2:
* New commit to implement cache list with JSON format instead of
multiple sub-options in -smp.
---
qapi/machine-common.json | 50 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 50 insertions(+)
diff --git a/qapi/machine-common.json b/qapi/machine-common.json
index 148a2c8dccca..f6fe1a208214 100644
--- a/qapi/machine-common.json
+++ b/qapi/machine-common.json
@@ -63,3 +63,53 @@
{ 'enum': 'CpuTopologyLevel',
'data': [ 'invalid', 'thread', 'core', 'module', 'cluster',
'die', 'socket', 'book', 'drawer', 'default' ] }
+
+##
+# @CacheLevelAndType:
+#
+# Caches a system may have. The enumeration value here is the
+# combination of cache level and cache type.
+#
+# @l1d: L1 data cache.
+#
+# @l1i: L1 instruction cache.
+#
+# @l2: L2 (unified) cache.
+#
+# @l3: L3 (unified) cache
+#
+# Since: 9.1
+##
+{ 'enum': 'CacheLevelAndType',
+ 'data': [ 'l1d', 'l1i', 'l2', 'l3' ] }
+
+##
+# @SmpCacheProperties:
+#
+# Cache information for SMP system.
+#
+# @cache: Cache name, which is the combination of cache level
+# and cache type.
+#
+# @topology: Cache topology level. It accepts the CPU topology
+# enumeration as the parameter, i.e., CPUs in the same
+# topology container share the same cache.
+#
+# Since: 9.1
+##
+{ 'struct': 'SmpCacheProperties',
+ 'data': {
+ 'cache': 'CacheLevelAndType',
+ 'topology': 'CpuTopologyLevel' } }
+
+##
+# @SmpCachePropertiesWrapper:
+#
+# List wrapper of SmpCacheProperties.
+#
+# @caches: the list of SmpCacheProperties.
+#
+# Since 9.1
+##
+{ 'struct': 'SmpCachePropertiesWrapper',
+ 'data': { 'caches': ['SmpCacheProperties'] } }
--
2.34.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v2 3/7] hw/core: Add smp cache topology for machine
2024-09-08 12:59 [PATCH v2 0/7] Introduce SMP Cache Topology Zhao Liu
2024-09-08 12:59 ` [PATCH v2 1/7] hw/core: Make CPU topology enumeration arch-agnostic Zhao Liu
2024-09-08 12:59 ` [PATCH v2 2/7] qapi/qom: Define cache enumeration and properties Zhao Liu
@ 2024-09-08 12:59 ` Zhao Liu
[not found] ` <20240917100048.00001bcf@Huawei.com>
2024-09-08 12:59 ` [PATCH v2 4/7] hw/core: Check smp cache topology support " Zhao Liu
` (5 subsequent siblings)
8 siblings, 1 reply; 18+ messages in thread
From: Zhao Liu @ 2024-09-08 12:59 UTC (permalink / raw)
To: Daniel P . Berrangé, Igor Mammedov, Eduardo Habkost,
Marcel Apfelbaum, Philippe Mathieu-Daudé, Yanan Wang,
Michael S . Tsirkin, Paolo Bonzini, Richard Henderson, Eric Blake,
Markus Armbruster, Marcelo Tosatti, Alex Bennée,
Peter Maydell, Jonathan Cameron, Sia Jee Heng, Alireza Sanaee
Cc: qemu-devel, kvm, qemu-riscv, qemu-arm, Zhenyu Wang, Dapeng Mi,
Yongwei Ma, Zhao Liu
With smp-cache object support, add smp cache topology for machine by
linking the smp-cache object.
Also add a helper to access cache topology level.
Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
Tested-by: Yongwei Ma <yongwei.ma@intel.com>
---
Changes since Patch v1:
* Integrated cache properties list into MachineState and used -machine
to configure SMP cache properties. (Markus)
Changes since RFC v2:
* Linked machine's smp_cache to smp-cache object instead of a builtin
structure. This is to get around the fact that the keyval format of
-machine can't support JSON.
* Wrapped the cache topology level access into a helper.
---
hw/core/machine-smp.c | 41 ++++++++++++++++++++++++++++++++++++++++
hw/core/machine.c | 44 +++++++++++++++++++++++++++++++++++++++++++
include/hw/boards.h | 10 ++++++++++
3 files changed, 95 insertions(+)
diff --git a/hw/core/machine-smp.c b/hw/core/machine-smp.c
index 5d8d7edcbd3f..b517c3471d1a 100644
--- a/hw/core/machine-smp.c
+++ b/hw/core/machine-smp.c
@@ -261,6 +261,41 @@ void machine_parse_smp_config(MachineState *ms,
}
}
+bool machine_parse_smp_cache(MachineState *ms,
+ const SmpCachePropertiesList *caches,
+ Error **errp)
+{
+ const SmpCachePropertiesList *node;
+ DECLARE_BITMAP(caches_bitmap, CACHE_LEVEL_AND_TYPE__MAX);
+
+ for (node = caches; node; node = node->next) {
+ /* Prohibit users from setting the cache topology level to invalid. */
+ if (node->value->topology == CPU_TOPOLOGY_LEVEL_INVALID) {
+ error_setg(errp,
+ "Invalid cache topology level: %s. "
+ "The topology should match the "
+ "valid CPU topology level",
+ CpuTopologyLevel_str(node->value->topology));
+ return false;
+ }
+
+ /* Prohibit users from repeating settings. */
+ if (test_bit(node->value->cache, caches_bitmap)) {
+ error_setg(errp,
+ "Invalid cache properties: %s. "
+ "The cache properties are duplicated",
+ CacheLevelAndType_str(node->value->cache));
+ return false;
+ } else {
+ ms->smp_cache.props[node->value->cache].topology =
+ node->value->topology;
+ set_bit(node->value->cache, caches_bitmap);
+ }
+ }
+
+ return true;
+}
+
unsigned int machine_topo_get_cores_per_socket(const MachineState *ms)
{
return ms->smp.cores * ms->smp.modules * ms->smp.clusters * ms->smp.dies;
@@ -270,3 +305,9 @@ unsigned int machine_topo_get_threads_per_socket(const MachineState *ms)
{
return ms->smp.threads * machine_topo_get_cores_per_socket(ms);
}
+
+CpuTopologyLevel machine_get_cache_topo_level(const MachineState *ms,
+ CacheLevelAndType cache)
+{
+ return ms->smp_cache.props[cache].topology;
+}
diff --git a/hw/core/machine.c b/hw/core/machine.c
index adaba17ebac1..518beb9f883a 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -932,6 +932,40 @@ static void machine_set_smp(Object *obj, Visitor *v, const char *name,
machine_parse_smp_config(ms, config, errp);
}
+static void machine_get_smp_cache(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
+{
+ MachineState *ms = MACHINE(obj);
+ SmpCache *cache = &ms->smp_cache;
+ SmpCachePropertiesList *head = NULL;
+ SmpCachePropertiesList **tail = &head;
+
+ for (int i = 0; i < CACHE_LEVEL_AND_TYPE__MAX; i++) {
+ SmpCacheProperties *node = g_new(SmpCacheProperties, 1);
+
+ node->cache = cache->props[i].cache;
+ node->topology = cache->props[i].topology;
+ QAPI_LIST_APPEND(tail, node);
+ }
+
+ visit_type_SmpCachePropertiesList(v, name, &head, errp);
+ qapi_free_SmpCachePropertiesList(head);
+}
+
+static void machine_set_smp_cache(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
+{
+ MachineState *ms = MACHINE(obj);
+ SmpCachePropertiesList *caches;
+
+ if (!visit_type_SmpCachePropertiesList(v, name, &caches, errp)) {
+ return;
+ }
+
+ machine_parse_smp_cache(ms, caches, errp);
+ qapi_free_SmpCachePropertiesList(caches);
+}
+
static void machine_get_boot(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
@@ -1057,6 +1091,11 @@ static void machine_class_init(ObjectClass *oc, void *data)
object_class_property_set_description(oc, "smp",
"CPU topology");
+ object_class_property_add(oc, "smp-cache", "SmpCachePropertiesWrapper",
+ machine_get_smp_cache, machine_set_smp_cache, NULL, NULL);
+ object_class_property_set_description(oc, "smp-cache",
+ "Cache properties list for SMP machine");
+
object_class_property_add(oc, "phandle-start", "int",
machine_get_phandle_start, machine_set_phandle_start,
NULL, NULL);
@@ -1195,6 +1234,11 @@ static void machine_initfn(Object *obj)
ms->smp.cores = 1;
ms->smp.threads = 1;
+ for (int i = 0; i < CACHE_LEVEL_AND_TYPE__MAX; i++) {
+ ms->smp_cache.props[i].cache = (CacheLevelAndType)i;
+ ms->smp_cache.props[i].topology = CPU_TOPOLOGY_LEVEL_DEFAULT;
+ }
+
machine_copy_boot_config(ms, &(BootConfiguration){ 0 });
}
diff --git a/include/hw/boards.h b/include/hw/boards.h
index 9a492770cbb9..64439dc7da2c 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -43,8 +43,13 @@ void machine_set_cpu_numa_node(MachineState *machine,
Error **errp);
void machine_parse_smp_config(MachineState *ms,
const SMPConfiguration *config, Error **errp);
+bool machine_parse_smp_cache(MachineState *ms,
+ const SmpCachePropertiesList *caches,
+ Error **errp);
unsigned int machine_topo_get_cores_per_socket(const MachineState *ms);
unsigned int machine_topo_get_threads_per_socket(const MachineState *ms);
+CpuTopologyLevel machine_get_cache_topo_level(const MachineState *ms,
+ CacheLevelAndType cache);
void machine_memory_devices_init(MachineState *ms, hwaddr base, uint64_t size);
/**
@@ -363,6 +368,10 @@ typedef struct CpuTopology {
unsigned int max_cpus;
} CpuTopology;
+typedef struct SmpCache {
+ SmpCacheProperties props[CACHE_LEVEL_AND_TYPE__MAX];
+} SmpCache;
+
/**
* MachineState:
*/
@@ -413,6 +422,7 @@ struct MachineState {
AccelState *accelerator;
CPUArchIdList *possible_cpus;
CpuTopology smp;
+ SmpCache smp_cache;
struct NVDIMMState *nvdimms_state;
struct NumaState *numa_state;
};
--
2.34.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v2 4/7] hw/core: Check smp cache topology support for machine
2024-09-08 12:59 [PATCH v2 0/7] Introduce SMP Cache Topology Zhao Liu
` (2 preceding siblings ...)
2024-09-08 12:59 ` [PATCH v2 3/7] hw/core: Add smp cache topology for machine Zhao Liu
@ 2024-09-08 12:59 ` Zhao Liu
[not found] ` <20240917095612.00007b5a@Huawei.com>
2024-09-08 12:59 ` [PATCH v2 5/7] i386/cpu: Support thread and module level cache topology Zhao Liu
` (4 subsequent siblings)
8 siblings, 1 reply; 18+ messages in thread
From: Zhao Liu @ 2024-09-08 12:59 UTC (permalink / raw)
To: Daniel P . Berrangé, Igor Mammedov, Eduardo Habkost,
Marcel Apfelbaum, Philippe Mathieu-Daudé, Yanan Wang,
Michael S . Tsirkin, Paolo Bonzini, Richard Henderson, Eric Blake,
Markus Armbruster, Marcelo Tosatti, Alex Bennée,
Peter Maydell, Jonathan Cameron, Sia Jee Heng, Alireza Sanaee
Cc: qemu-devel, kvm, qemu-riscv, qemu-arm, Zhenyu Wang, Dapeng Mi,
Yongwei Ma, Zhao Liu
Add cache_supported flags in SMPCompatProps to allow machines to
configure various caches support.
And check the compatibility of the cache properties with the
machine support in machine_parse_smp_cache().
Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
Tested-by: Yongwei Ma <yongwei.ma@intel.com>
---
Changes since Patch v1:
* Dropped machine_check_smp_cache_support() and did the check when
-machine parses smp-cache in machine_parse_smp_cache().
Changes since RFC v2:
* Split as a separate commit to just include compatibility checking and
topology checking.
* Allow setting "default" topology level even though the cache
isn't supported by machine. (Daniel)
---
hw/core/machine-smp.c | 78 +++++++++++++++++++++++++++++++++++++++++++
include/hw/boards.h | 3 ++
2 files changed, 81 insertions(+)
diff --git a/hw/core/machine-smp.c b/hw/core/machine-smp.c
index b517c3471d1a..9a281946762f 100644
--- a/hw/core/machine-smp.c
+++ b/hw/core/machine-smp.c
@@ -261,10 +261,47 @@ void machine_parse_smp_config(MachineState *ms,
}
}
+static bool machine_check_topo_support(MachineState *ms,
+ CpuTopologyLevel topo,
+ Error **errp)
+{
+ MachineClass *mc = MACHINE_GET_CLASS(ms);
+
+ if ((topo == CPU_TOPOLOGY_LEVEL_MODULE && !mc->smp_props.modules_supported) ||
+ (topo == CPU_TOPOLOGY_LEVEL_CLUSTER && !mc->smp_props.clusters_supported) ||
+ (topo == CPU_TOPOLOGY_LEVEL_DIE && !mc->smp_props.dies_supported) ||
+ (topo == CPU_TOPOLOGY_LEVEL_BOOK && !mc->smp_props.books_supported) ||
+ (topo == CPU_TOPOLOGY_LEVEL_DRAWER && !mc->smp_props.drawers_supported)) {
+ error_setg(errp,
+ "Invalid topology level: %s. "
+ "The topology level is not supported by this machine",
+ CpuTopologyLevel_str(topo));
+ return false;
+ }
+
+ return true;
+}
+
+/*
+ * When both cache1 and cache2 are configured with specific topology levels
+ * (not default level), is cache1's topology level higher than cache2?
+ */
+static bool smp_cache_topo_cmp(const SmpCache *smp_cache,
+ CacheLevelAndType cache1,
+ CacheLevelAndType cache2)
+{
+ if (smp_cache->props[cache1].topology != CPU_TOPOLOGY_LEVEL_DEFAULT &&
+ smp_cache->props[cache1].topology > smp_cache->props[cache2].topology) {
+ return true;
+ }
+ return false;
+}
+
bool machine_parse_smp_cache(MachineState *ms,
const SmpCachePropertiesList *caches,
Error **errp)
{
+ MachineClass *mc = MACHINE_GET_CLASS(ms);
const SmpCachePropertiesList *node;
DECLARE_BITMAP(caches_bitmap, CACHE_LEVEL_AND_TYPE__MAX);
@@ -293,6 +330,47 @@ bool machine_parse_smp_cache(MachineState *ms,
}
}
+ for (int i = 0; i < CACHE_LEVEL_AND_TYPE__MAX; i++) {
+ const SmpCacheProperties *props = &ms->smp_cache.props[i];
+
+ /*
+ * Allow setting "default" topology level even though the cache
+ * isn't supported by machine.
+ */
+ if (props->topology != CPU_TOPOLOGY_LEVEL_DEFAULT &&
+ !mc->smp_props.cache_supported[props->cache]) {
+ error_setg(errp,
+ "%s cache topology not supported by this machine",
+ CacheLevelAndType_str(node->value->cache));
+ return false;
+ }
+
+ if (!machine_check_topo_support(ms, props->topology, errp)) {
+ return false;
+ }
+ }
+
+ if (smp_cache_topo_cmp(&ms->smp_cache,
+ CACHE_LEVEL_AND_TYPE_L1D,
+ CACHE_LEVEL_AND_TYPE_L2) ||
+ smp_cache_topo_cmp(&ms->smp_cache,
+ CACHE_LEVEL_AND_TYPE_L1I,
+ CACHE_LEVEL_AND_TYPE_L2)) {
+ error_setg(errp,
+ "Invalid smp cache topology. "
+ "L2 cache topology level shouldn't be lower than L1 cache");
+ return false;
+ }
+
+ if (smp_cache_topo_cmp(&ms->smp_cache,
+ CACHE_LEVEL_AND_TYPE_L2,
+ CACHE_LEVEL_AND_TYPE_L3)) {
+ error_setg(errp,
+ "Invalid smp cache topology. "
+ "L3 cache topology level shouldn't be lower than L2 cache");
+ return false;
+ }
+
return true;
}
diff --git a/include/hw/boards.h b/include/hw/boards.h
index 64439dc7da2c..6c3cdfa15f50 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -150,6 +150,8 @@ typedef struct {
* @books_supported - whether books are supported by the machine
* @drawers_supported - whether drawers are supported by the machine
* @modules_supported - whether modules are supported by the machine
+ * @cache_supported - whether cache topologies (l1d, l1i, l2 and l3) are
+ * supported by the machine
*/
typedef struct {
bool prefer_sockets;
@@ -159,6 +161,7 @@ typedef struct {
bool books_supported;
bool drawers_supported;
bool modules_supported;
+ bool cache_supported[CACHE_LEVEL_AND_TYPE__MAX];
} SMPCompatProps;
/**
--
2.34.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v2 5/7] i386/cpu: Support thread and module level cache topology
2024-09-08 12:59 [PATCH v2 0/7] Introduce SMP Cache Topology Zhao Liu
` (3 preceding siblings ...)
2024-09-08 12:59 ` [PATCH v2 4/7] hw/core: Check smp cache topology support " Zhao Liu
@ 2024-09-08 12:59 ` Zhao Liu
[not found] ` <20240917100508.00001907@Huawei.com>
2024-09-08 12:59 ` [PATCH v2 6/7] i386/cpu: Update cache topology with machine's configuration Zhao Liu
` (3 subsequent siblings)
8 siblings, 1 reply; 18+ messages in thread
From: Zhao Liu @ 2024-09-08 12:59 UTC (permalink / raw)
To: Daniel P . Berrangé, Igor Mammedov, Eduardo Habkost,
Marcel Apfelbaum, Philippe Mathieu-Daudé, Yanan Wang,
Michael S . Tsirkin, Paolo Bonzini, Richard Henderson, Eric Blake,
Markus Armbruster, Marcelo Tosatti, Alex Bennée,
Peter Maydell, Jonathan Cameron, Sia Jee Heng, Alireza Sanaee
Cc: qemu-devel, kvm, qemu-riscv, qemu-arm, Zhenyu Wang, Dapeng Mi,
Yongwei Ma, Zhao Liu
Allow cache to be defined at the thread and module level. This
increases flexibility for x86 users to customize their cache topology.
Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
Tested-by: Yongwei Ma <yongwei.ma@intel.com>
---
target/i386/cpu.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index e3a81bc64922..e9f755000356 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -241,9 +241,15 @@ static uint32_t max_thread_ids_for_cache(X86CPUTopoInfo *topo_info,
uint32_t num_ids = 0;
switch (share_level) {
+ case CPU_TOPOLOGY_LEVEL_THREAD:
+ num_ids = 1;
+ break;
case CPU_TOPOLOGY_LEVEL_CORE:
num_ids = 1 << apicid_core_offset(topo_info);
break;
+ case CPU_TOPOLOGY_LEVEL_MODULE:
+ num_ids = 1 << apicid_module_offset(topo_info);
+ break;
case CPU_TOPOLOGY_LEVEL_DIE:
num_ids = 1 << apicid_die_offset(topo_info);
break;
@@ -251,10 +257,6 @@ static uint32_t max_thread_ids_for_cache(X86CPUTopoInfo *topo_info,
num_ids = 1 << apicid_pkg_offset(topo_info);
break;
default:
- /*
- * Currently there is no use case for THREAD and MODULE, so use
- * assert directly to facilitate debugging.
- */
g_assert_not_reached();
}
--
2.34.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v2 6/7] i386/cpu: Update cache topology with machine's configuration
2024-09-08 12:59 [PATCH v2 0/7] Introduce SMP Cache Topology Zhao Liu
` (4 preceding siblings ...)
2024-09-08 12:59 ` [PATCH v2 5/7] i386/cpu: Support thread and module level cache topology Zhao Liu
@ 2024-09-08 12:59 ` Zhao Liu
[not found] ` <20240911110028.00001d3d@huawei.com>
[not found] ` <20240917100641.000050a8@Huawei.com>
2024-09-08 12:59 ` [PATCH v2 7/7] i386/pc: Support cache topology in -machine for PC machine Zhao Liu
` (2 subsequent siblings)
8 siblings, 2 replies; 18+ messages in thread
From: Zhao Liu @ 2024-09-08 12:59 UTC (permalink / raw)
To: Daniel P . Berrangé, Igor Mammedov, Eduardo Habkost,
Marcel Apfelbaum, Philippe Mathieu-Daudé, Yanan Wang,
Michael S . Tsirkin, Paolo Bonzini, Richard Henderson, Eric Blake,
Markus Armbruster, Marcelo Tosatti, Alex Bennée,
Peter Maydell, Jonathan Cameron, Sia Jee Heng, Alireza Sanaee
Cc: qemu-devel, kvm, qemu-riscv, qemu-arm, Zhenyu Wang, Dapeng Mi,
Yongwei Ma, Zhao Liu
User will configure smp cache topology via -machine smp-cache.
For this case, update the x86 CPUs' cache topology with user's
configuration in MachineState.
Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
Tested-by: Yongwei Ma <yongwei.ma@intel.com>
---
Changes since RFC v2:
* Used smp_cache array to override cache topology.
* Wrapped the updating into a function.
---
target/i386/cpu.c | 39 +++++++++++++++++++++++++++++++++++++++
1 file changed, 39 insertions(+)
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index e9f755000356..6d9f7dc0872a 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -7597,6 +7597,38 @@ static void x86_cpu_hyperv_realize(X86CPU *cpu)
cpu->hyperv_limits[2] = 0;
}
+#ifndef CONFIG_USER_ONLY
+static void x86_cpu_update_smp_cache_topo(MachineState *ms, X86CPU *cpu)
+{
+ CPUX86State *env = &cpu->env;
+ CpuTopologyLevel level;
+
+ level = machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L1D);
+ if (level != CPU_TOPOLOGY_LEVEL_DEFAULT) {
+ env->cache_info_cpuid4.l1d_cache->share_level = level;
+ env->cache_info_amd.l1d_cache->share_level = level;
+ }
+
+ level = machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L1I);
+ if (level != CPU_TOPOLOGY_LEVEL_DEFAULT) {
+ env->cache_info_cpuid4.l1i_cache->share_level = level;
+ env->cache_info_amd.l1i_cache->share_level = level;
+ }
+
+ level = machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L2);
+ if (level != CPU_TOPOLOGY_LEVEL_DEFAULT) {
+ env->cache_info_cpuid4.l2_cache->share_level = level;
+ env->cache_info_amd.l2_cache->share_level = level;
+ }
+
+ level = machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L3);
+ if (level != CPU_TOPOLOGY_LEVEL_DEFAULT) {
+ env->cache_info_cpuid4.l3_cache->share_level = level;
+ env->cache_info_amd.l3_cache->share_level = level;
+ }
+}
+#endif
+
static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
{
CPUState *cs = CPU(dev);
@@ -7821,6 +7853,13 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
#ifndef CONFIG_USER_ONLY
MachineState *ms = MACHINE(qdev_get_machine());
+
+ /*
+ * TODO: Add a SMPCompatProps.has_caches flag to avoid useless Updates
+ * if user didn't set smp_cache.
+ */
+ x86_cpu_update_smp_cache_topo(ms, cpu);
+
qemu_register_reset(x86_cpu_machine_reset_cb, cpu);
if (cpu->env.features[FEAT_1_EDX] & CPUID_APIC || ms->smp.cpus > 1) {
--
2.34.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v2 7/7] i386/pc: Support cache topology in -machine for PC machine
2024-09-08 12:59 [PATCH v2 0/7] Introduce SMP Cache Topology Zhao Liu
` (5 preceding siblings ...)
2024-09-08 12:59 ` [PATCH v2 6/7] i386/cpu: Update cache topology with machine's configuration Zhao Liu
@ 2024-09-08 12:59 ` Zhao Liu
[not found] ` <20240917101631.00003dcb@Huawei.com>
2024-09-10 18:23 ` [PATCH v2 0/7] Introduce SMP Cache Topology Michael S. Tsirkin
2024-12-17 14:23 ` Alireza Sanaee via
8 siblings, 1 reply; 18+ messages in thread
From: Zhao Liu @ 2024-09-08 12:59 UTC (permalink / raw)
To: Daniel P . Berrangé, Igor Mammedov, Eduardo Habkost,
Marcel Apfelbaum, Philippe Mathieu-Daudé, Yanan Wang,
Michael S . Tsirkin, Paolo Bonzini, Richard Henderson, Eric Blake,
Markus Armbruster, Marcelo Tosatti, Alex Bennée,
Peter Maydell, Jonathan Cameron, Sia Jee Heng, Alireza Sanaee
Cc: qemu-devel, kvm, qemu-riscv, qemu-arm, Zhenyu Wang, Dapeng Mi,
Yongwei Ma, Zhao Liu
Allow user to configure l1d, l1i, l2 and l3 cache topologies for PC
machine.
Additionally, add the document of "-machine smp-cache" in
qemu-options.hx.
Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
Tested-by: Yongwei Ma <yongwei.ma@intel.com>
---
Changes since Patch v1:
* Merged document into this patch. (Markus)
Changes since RFC v2:
* Used cache_supported array.
---
hw/i386/pc.c | 4 ++++
qemu-options.hx | 28 +++++++++++++++++++++++++++-
2 files changed, 31 insertions(+), 1 deletion(-)
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index ba0ff511836c..d562fd25aad2 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1788,6 +1788,10 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
mc->nvdimm_supported = true;
mc->smp_props.dies_supported = true;
mc->smp_props.modules_supported = true;
+ mc->smp_props.cache_supported[CACHE_LEVEL_AND_TYPE_L1D] = true;
+ mc->smp_props.cache_supported[CACHE_LEVEL_AND_TYPE_L1I] = true;
+ mc->smp_props.cache_supported[CACHE_LEVEL_AND_TYPE_L2] = true;
+ mc->smp_props.cache_supported[CACHE_LEVEL_AND_TYPE_L3] = true;
mc->default_ram_id = "pc.ram";
pcmc->default_smbios_ep_type = SMBIOS_ENTRY_POINT_TYPE_AUTO;
diff --git a/qemu-options.hx b/qemu-options.hx
index d94e2cbbaeb1..3936ff3e77f9 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -39,7 +39,8 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \
" memory-encryption=@var{} memory encryption object to use (default=none)\n"
" hmat=on|off controls ACPI HMAT support (default=off)\n"
" memory-backend='backend-id' specifies explicitly provided backend for main RAM (default=none)\n"
- " cxl-fmw.0.targets.0=firsttarget,cxl-fmw.0.targets.1=secondtarget,cxl-fmw.0.size=size[,cxl-fmw.0.interleave-granularity=granularity]\n",
+ " cxl-fmw.0.targets.0=firsttarget,cxl-fmw.0.targets.1=secondtarget,cxl-fmw.0.size=size[,cxl-fmw.0.interleave-granularity=granularity]\n"
+ " smp-cache.0.cache=cachename,smp-cache.0.topology=topologylevel\n",
QEMU_ARCH_ALL)
SRST
``-machine [type=]name[,prop=value[,...]]``
@@ -159,6 +160,31 @@ SRST
::
-machine cxl-fmw.0.targets.0=cxl.0,cxl-fmw.0.targets.1=cxl.1,cxl-fmw.0.size=128G,cxl-fmw.0.interleave-granularity=512
+
+ ``smp-cache.0.cache=cachename,smp-cache.0.topology=topologylevel``
+ Define cache properties (now only the cache topology level) for SMP
+ system.
+
+ ``cache=cachename`` specifies the cache that the properties will be
+ applied on. This field is the combination of cache level and cache
+ type. Currently it supports ``l1d`` (L1 data cache), ``l1i`` (L1
+ instruction cache), ``l2`` (L2 unified cache) and ``l3`` (L3 unified
+ cache).
+
+ ``topology=topologylevel`` sets the cache topology level. It accepts
+ CPU topology levels including ``thread``, ``core``, ``module``,
+ ``cluster``, ``die``, ``socket``, ``book``, ``drawer`` and a special
+ value ``default``. If ``default`` is set, then the cache topology will
+ follow the architecture's default cache topology model. If other CPU
+ topology level is set, the cache will be shared at corresponding CPU
+ topology level. For example, ``topology=core`` makes the cache shared
+ in a core.
+
+ Example:
+
+ ::
+
+ -machine smp-cache.0.cache=l1d,smp-cache.0.topology=core,smp-cache.1.cache=l1i,smp-cache.1.topology=core
ERST
DEF("M", HAS_ARG, QEMU_OPTION_M,
--
2.34.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH v2 0/7] Introduce SMP Cache Topology
2024-09-08 12:59 [PATCH v2 0/7] Introduce SMP Cache Topology Zhao Liu
` (6 preceding siblings ...)
2024-09-08 12:59 ` [PATCH v2 7/7] i386/pc: Support cache topology in -machine for PC machine Zhao Liu
@ 2024-09-10 18:23 ` Michael S. Tsirkin
2024-12-17 14:23 ` Alireza Sanaee via
8 siblings, 0 replies; 18+ messages in thread
From: Michael S. Tsirkin @ 2024-09-10 18:23 UTC (permalink / raw)
To: Zhao Liu
Cc: Daniel P . Berrangé, Igor Mammedov, Eduardo Habkost,
Marcel Apfelbaum, Philippe Mathieu-Daudé, Yanan Wang,
Paolo Bonzini, Richard Henderson, Eric Blake, Markus Armbruster,
Marcelo Tosatti, Alex Bennée, Peter Maydell,
Jonathan Cameron, Sia Jee Heng, Alireza Sanaee, qemu-devel, kvm,
qemu-riscv, qemu-arm, Zhenyu Wang, Dapeng Mi, Yongwei Ma
On Sun, Sep 08, 2024 at 08:59:13PM +0800, Zhao Liu wrote:
> Hi all,
>
> Compared with previous Patch v1 [1], I've put the cache properties list
> into -machine, this is to meet current needs and also remain compatible
> with my future topology support (more discussion details, pls refer [2]).
>
> This series is based on the commit 1581a0bc928d ("Merge tag 'pull-ufs-
> 20240906' of https://gitlab.com/jeuk20.kim/qemu into staging ufs
> queue").
Needs review from QOM maintainers.
> Background
> ==========
>
> The x86 and ARM (RISCV) need to allow user to configure cache properties
> (current only topology):
> * For x86, the default cache topology model (of max/host CPU) does not
> always match the Host's real physical cache topology. Performance can
> increase when the configured virtual topology is closer to the
> physical topology than a default topology would be.
> * For ARM, QEMU can't get the cache topology information from the CPU
> registers, then user configuration is necessary. Additionally, the
> cache information is also needed for MPAM emulation (for TCG) to
> build the right PPTT. (Originally from Jonathan)
>
>
> About smp-cache
> ===============
>
> In this version, smp-cache is implemented as a array integrated in
> -machine. Though -machine currently can't support JSON format, this is
> the one of the directions of future.
>
> An example is as follows:
>
> smp_cache=smp-cache.0.cache=l1i,smp-cache.0.topology=core,smp-cache.1.cache=l1d,smp-cache.1.topology=core,smp-cache.2.cache=l2,smp-cache.2.topology=module,smp-cache.3.cache=l3,smp-cache.3.topology=die
>
> "cache" specifies the cache that the properties will be applied on. This
> field is the combination of cache level and cache type. Now it supports
> "l1d" (L1 data cache), "l1i" (L1 instruction cache), "l2" (L2 unified
> cache) and "l3" (L3 unified cache).
>
> "topology" field accepts CPU topology levels including "thread", "core",
> "module", "cluster", "die", "socket", "book", "drawer" and a special
> value "default".
>
> The "default" is introduced to make it easier for libvirt to set a
> default parameter value without having to care about the specific
> machine (because currently there is no proper way for machine to
> expose supported topology levels and caches).
>
> If "default" is set, then the cache topology will follow the
> architecture's default cache topology model. If other CPU topology level
> is set, the cache will be shared at corresponding CPU topology level.
>
>
> Welcome your comment!
>
>
> [1]: Patch v1: https://lore.kernel.org/qemu-devel/20240704031603.1744546-1-zhao1.liu@intel.com/
> [2]: API disscussion: https://lore.kernel.org/qemu-devel/8734ndj33j.fsf@pond.sub.org/
>
> Thanks and Best Regards,
> Zhao
> ---
> Changelog:
>
> Main changes since Patch v1:
> * Dropped handwriten smp-cache object and integrated cache properties
> list into MachineState and used -machine to configure SMP cache
> properties. (Markus)
> * Dropped prefix of CpuTopologyLevel enumeration. (Markus)
> * Rename CPU_TOPO_LEVEL_* to CPU_TOPOLOGY_LEVEL_* to match the QAPI's
> generated code. (Markus)
> * Renamed SMPCacheProperty/SMPCacheProperties (QAPI structures) to
> SmpCacheProperties/SmpCachePropertiesWrapper. (Markus)
> * Renamed SMPCacheName (QAPI structure) to SmpCacheLevelAndType and
> dropped prefix. (Markus)
> * Renamed 'name' field in SmpCacheProperties to 'cache', since the
> type and level of the cache in SMP system could be able to specify
> all of these kinds of cache explicitly enough.
> * Renamed 'topo' field in SmpCacheProperties to 'topology'. (Markus)
> * Returned error information when user repeats setting cache
> properties. (Markus)
> * Renamed SmpCacheLevelAndType to CacheLevelAndType, since this
> representation is general across SMP or hybrid system.
> * Dropped machine_check_smp_cache_support() and did the check when
> -machine parses smp-cache in machine_parse_smp_cache().
>
> Main changes since RFC v2:
> * Dropped cpu-topology.h and cpu-topology.c since QAPI has the helper
> (CpuTopologyLevel_str) to convert enum to string. (Markus)
> * Fixed text format in machine.json (CpuTopologyLevel naming, 2 spaces
> between sentences). (Markus)
> * Added a new level "default" to de-compatibilize some arch-specific
> topo settings. (Daniel)
> * Moved CpuTopologyLevel to qapi/machine-common.json, at where the
> cache enumeration and smp-cache object would be added.
> - If smp-cache object is defined in qapi/machine.json, storage-daemon
> will complain about the qmp cmds in qapi/machine.json during
> compiling.
> * Referred to Daniel's suggestion to introduce cache JSON list, though
> as a standalone object since -smp/-machine can't support JSON.
> * Linked machine's smp_cache to smp-cache object instead of a builtin
> structure. This is to get around the fact that the keyval format of
> -machine can't support JSON.
> * Wrapped the cache topology level access into a helper.
> * Split as a separate commit to just include compatibility checking and
> topology checking.
> * Allow setting "default" topology level even though the cache
> isn't supported by machine. (Daniel)
> * Rewrote the document of smp-cache object.
>
> Main changes since RFC v1:
> * Split CpuTopology renaimg out of this RFC.
> * Use QAPI to enumerate CPU topology levels.
> * Drop string_to_cpu_topo() since QAPI will help to parse the topo
> levels.
> * Set has_*_cache field in machine_get_smp(). (JeeHeng)
> * Use "*_cache=topo_level" as -smp example as the original "level"
> term for a cache has a totally different meaning. (Jonathan)
> ---
> Zhao Liu (7):
> hw/core: Make CPU topology enumeration arch-agnostic
> qapi/qom: Define cache enumeration and properties
> hw/core: Add smp cache topology for machine
> hw/core: Check smp cache topology support for machine
> i386/cpu: Support thread and module level cache topology
> i386/cpu: Update cache topology with machine's configuration
> i386/pc: Support cache topology in -machine for PC machine
>
> hw/core/machine-smp.c | 119 +++++++++++++++++++++++
> hw/core/machine.c | 44 +++++++++
> hw/i386/pc.c | 4 +
> hw/i386/x86-common.c | 4 +-
> include/hw/boards.h | 13 +++
> include/hw/i386/topology.h | 22 +----
> qapi/machine-common.json | 96 ++++++++++++++++++-
> qemu-options.hx | 28 +++++-
> target/i386/cpu.c | 191 ++++++++++++++++++++++---------------
> target/i386/cpu.h | 4 +-
> 10 files changed, 425 insertions(+), 100 deletions(-)
>
> --
> 2.34.1
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 6/7] i386/cpu: Update cache topology with machine's configuration
[not found] ` <20240911110028.00001d3d@huawei.com>
@ 2024-10-07 10:21 ` Zhao Liu
0 siblings, 0 replies; 18+ messages in thread
From: Zhao Liu @ 2024-10-07 10:21 UTC (permalink / raw)
To: Alireza Sanaee
Cc: Daniel P . Berrangé, Igor Mammedov, Eduardo Habkost,
Marcel Apfelbaum, Philippe Mathieu-Daudé, Yanan Wang,
Michael S.Tsirkin, Paolo Bonzini, Richard Henderson, Eric Blake,
Markus Armbruster, Marcelo Tosatti, Alex Bennée,
Peter Maydell, Jonathan Cameron, Sia Jee Heng, qemu-devel, kvm,
qemu-riscv, qemu-arm, Zhenyu Wang, Dapeng Mi, Yongwei Ma,
Zhao Liu
Hi Ali,
[snip]
> > +
> > + /*
> > + * TODO: Add a SMPCompatProps.has_caches flag to avoid useless
> > Updates
> > + * if user didn't set smp_cache.
> > + */
> Hi Zhao,
>
> Thanks for sending this patchset so quickly. I really appreciate the
> TODO already :)
Welcome! And I'm also sorry for a long silence. Now I'm back from the
vacation and will keep pushing this series forward.
> It also helps me avoid going through every single
> layer, especially when I want to avoid matching system registers in
> ARM, particularly when there's no description in the command line.
Great! I also noticed your patch for this "TODO" and will help you
review it soon.
Regards,
Zhao
> > + x86_cpu_update_smp_cache_topo(ms, cpu);
> > +
> > qemu_register_reset(x86_cpu_machine_reset_cb, cpu);
> >
> > if (cpu->env.features[FEAT_1_EDX] & CPUID_APIC || ms->smp.cpus >
> > 1) {
>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 2/7] qapi/qom: Define cache enumeration and properties
[not found] ` <20240917095126.000036f1@Huawei.com>
@ 2024-10-07 10:48 ` Zhao Liu
0 siblings, 0 replies; 18+ messages in thread
From: Zhao Liu @ 2024-10-07 10:48 UTC (permalink / raw)
To: Jonathan Cameron
Cc: Daniel P . Berrangé, Igor Mammedov, Eduardo Habkost,
Marcel Apfelbaum, Philippe Mathieu-Daudé, Yanan Wang,
Michael S.Tsirkin, Paolo Bonzini, Richard Henderson, Eric Blake,
Markus Armbruster, Marcelo Tosatti, Alex Bennée,
Peter Maydell, Sia Jee Heng, Alireza Sanaee, qemu-devel, kvm,
qemu-riscv, qemu-arm, Zhenyu Wang, Dapeng Mi, Yongwei Ma,
Zhao Liu
Hi Jonathan,
Thanks for your review and feedback!
[snip]
> > Note, define cache topology based on CPU topology level with two
> > reasons:
> >
> > 1. In practice, a cache will always be bound to the CPU container
> > (either private in the CPU container or shared among multiple
> > containers), and CPU container is often expressed in terms of CPU
> > topology level.
> > 2. The x86's cache-related CPUIDs encode cache topology based on APIC
> > ID's CPU topology layout. And the ACPI PPTT table that ARM/RISCV
> > relies on also requires CPU containers to help indicate the private
>
> Really trivial but CPU Containers are a different ACPI concept.
> For PPTT they are referred to as Processor Groups. Wonderfully they
> 'might match a Processor Container in the namespace' which rather implies
> they might not. In QEMU they always will because the next bit of the
> spec matters. "In that case this entry will match the value of the _UID
> method of the associated processor container. Where there is a match it must
> be represented."
>
> So having said all that, CPU container is probably fine as a description.
Thanks for the explanation!
> > shared hierarchy of the cache. Therefore, for SMP systems, it is
> > natural to use the CPU topology hierarchy directly in QEMU to define
> > the cache topology.
> >
> > Suggested-by: Daniel P. Berrange <berrange@redhat.com>
> > Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
> > Tested-by: Yongwei Ma <yongwei.ma@intel.com>
>
> Seems fine but my gut would be to combine this and next patch so we can
> see how it is used (assuming no one asked for it to be separate!)
No problem. I intended to make it easier to review the QAPI part, but
these two patches were simple enough that I was happy to combine them.
> Version numbers need an update I guess.
Ah, yes!
> Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Thanks!
> > +##
> > +# @SmpCachePropertiesWrapper:
> > +#
> > +# List wrapper of SmpCacheProperties.
> > +#
> > +# @caches: the list of SmpCacheProperties.
> > +#
> > +# Since 9.1
>
> Needs updating to 9.2 I guess.
Yes, I think so, too.
Thanks,
Zhao
> > +##
> > +{ 'struct': 'SmpCachePropertiesWrapper',
> > + 'data': { 'caches': ['SmpCacheProperties'] } }
>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 3/7] hw/core: Add smp cache topology for machine
[not found] ` <20240917100048.00001bcf@Huawei.com>
@ 2024-10-07 11:02 ` Zhao Liu
0 siblings, 0 replies; 18+ messages in thread
From: Zhao Liu @ 2024-10-07 11:02 UTC (permalink / raw)
To: Jonathan Cameron
Cc: Daniel P . Berrangé, Igor Mammedov, Eduardo Habkost,
Marcel Apfelbaum, Philippe Mathieu-Daudé, Yanan Wang,
Michael S.Tsirkin, Paolo Bonzini, Richard Henderson, Eric Blake,
Markus Armbruster, Marcelo Tosatti, Alex Bennée,
Peter Maydell, Sia Jee Heng, Alireza Sanaee, qemu-devel, kvm,
qemu-riscv, qemu-arm, Zhenyu Wang, Dapeng Mi, Yongwei Ma,
Zhao Liu
On Tue, Sep 17, 2024 at 10:00:48AM +0100, Jonathan Cameron wrote:
> Date: Tue, 17 Sep 2024 10:00:48 +0100
> From: Jonathan Cameron <Jonathan.Cameron@Huawei.com>
> Subject: Re: [PATCH v2 3/7] hw/core: Add smp cache topology for machine
> X-Mailer: Claws Mail 4.1.0 (GTK 3.24.33; x86_64-w64-mingw32)
>
> On Sun, 8 Sep 2024 20:59:16 +0800
> Zhao Liu <zhao1.liu@intel.com> wrote:
>
> > With smp-cache object support, add smp cache topology for machine by
> > linking the smp-cache object.
> >
> > Also add a helper to access cache topology level.
> >
> > Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
> > Tested-by: Yongwei Ma <yongwei.ma@intel.com>
>
> Minor stuff. The property stuff is something I seems to mostly get wrong
> so needs more eyes but fwiw looks fine to me.
Yes and thank you!
> With the tweaks suggested below.
>
> Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
>
> > ---
> > Changes since Patch v1:
> > * Integrated cache properties list into MachineState and used -machine
> > to configure SMP cache properties. (Markus)
> >
> > Changes since RFC v2:
> > * Linked machine's smp_cache to smp-cache object instead of a builtin
> > structure. This is to get around the fact that the keyval format of
> > -machine can't support JSON.
> > * Wrapped the cache topology level access into a helper.
> > ---
> > hw/core/machine-smp.c | 41 ++++++++++++++++++++++++++++++++++++++++
> > hw/core/machine.c | 44 +++++++++++++++++++++++++++++++++++++++++++
> > include/hw/boards.h | 10 ++++++++++
> > 3 files changed, 95 insertions(+)
> >
> > diff --git a/hw/core/machine-smp.c b/hw/core/machine-smp.c
> > index 5d8d7edcbd3f..b517c3471d1a 100644
> > --- a/hw/core/machine-smp.c
> > +++ b/hw/core/machine-smp.c
> > @@ -261,6 +261,41 @@ void machine_parse_smp_config(MachineState *ms,
> > }
> > }
> >
> > +bool machine_parse_smp_cache(MachineState *ms,
> > + const SmpCachePropertiesList *caches,
> > + Error **errp)
> > +{
> > + const SmpCachePropertiesList *node;
> > + DECLARE_BITMAP(caches_bitmap, CACHE_LEVEL_AND_TYPE__MAX);
> > +
> > + for (node = caches; node; node = node->next) {
> > + /* Prohibit users from setting the cache topology level to invalid. */
> > + if (node->value->topology == CPU_TOPOLOGY_LEVEL_INVALID) {
> > + error_setg(errp,
> > + "Invalid cache topology level: %s. "
> > + "The topology should match the "
> > + "valid CPU topology level",
>
> I think that's too much wrapping for an error message. Makes them hard
> to grep for.
I understand you mean the last sentence should not be on separate lines
but should be continuous in one line, right?
> > + CpuTopologyLevel_str(node->value->topology));
> > + return false;
> > + }
> > +
> > + /* Prohibit users from repeating settings. */
> > + if (test_bit(node->value->cache, caches_bitmap)) {
> > + error_setg(errp,
> > + "Invalid cache properties: %s. "
> > + "The cache properties are duplicated",
> > + CacheLevelAndType_str(node->value->cache));
> > + return false;
> > + } else {
>
> returned anyway in the above path, so can drop the else and reduce
> indent a little.
Sure.
Thanks,
Zhao
> > + ms->smp_cache.props[node->value->cache].topology =
> > + node->value->topology;
> > + set_bit(node->value->cache, caches_bitmap);
> > + }
> > + }
> > +
> > + return true;
> > +}
> > +
>
>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 4/7] hw/core: Check smp cache topology support for machine
[not found] ` <20240917095612.00007b5a@Huawei.com>
@ 2024-10-07 11:12 ` Zhao Liu
0 siblings, 0 replies; 18+ messages in thread
From: Zhao Liu @ 2024-10-07 11:12 UTC (permalink / raw)
To: Jonathan Cameron
Cc: Daniel P . Berrangé, Igor Mammedov, Eduardo Habkost,
Marcel Apfelbaum, Philippe Mathieu-Daudé, Yanan Wang,
Michael S.Tsirkin, Paolo Bonzini, Richard Henderson, Eric Blake,
Markus Armbruster, Marcelo Tosatti, Alex Bennée,
Peter Maydell, Sia Jee Heng, Alireza Sanaee, qemu-devel, kvm,
qemu-riscv, qemu-arm, Zhenyu Wang, Dapeng Mi, Yongwei Ma,
Zhao Liu
On Tue, Sep 17, 2024 at 09:56:12AM +0100, Jonathan Cameron wrote:
> Date: Tue, 17 Sep 2024 09:56:12 +0100
> From: Jonathan Cameron <Jonathan.Cameron@Huawei.com>
> Subject: Re: [PATCH v2 4/7] hw/core: Check smp cache topology support for
> machine
> X-Mailer: Claws Mail 4.1.0 (GTK 3.24.33; x86_64-w64-mingw32)
>
> On Sun, 8 Sep 2024 20:59:17 +0800
> Zhao Liu <zhao1.liu@intel.com> wrote:
>
> > Add cache_supported flags in SMPCompatProps to allow machines to
> > configure various caches support.
> >
> > And check the compatibility of the cache properties with the
> > machine support in machine_parse_smp_cache().
> >
> > Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
> > Tested-by: Yongwei Ma <yongwei.ma@intel.com>
>
> Just a few trivial comments inline.
>
> FWIW with or without those changes.
> Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Thanks!
[snip]
> > + /*
> > + * Allow setting "default" topology level even though the cache
> > + * isn't supported by machine.
> I'd flip the comment as the condition is doing the opposite.
OK, it's more intuitive.
> * Reject non "default" topology level if the cache isn't
> * supported by the machine.
> > + */
> > + if (props->topology != CPU_TOPOLOGY_LEVEL_DEFAULT &&
> > + !mc->smp_props.cache_supported[props->cache]) {
> > + error_setg(errp,
> > + "%s cache topology not supported by this machine",
> > + CacheLevelAndType_str(node->value->cache));
> > + return false;
> > + }
> > +
> > + if (!machine_check_topo_support(ms, props->topology, errp)) {
> > + return false;
> > + }
> > + }
> > +
> > + if (smp_cache_topo_cmp(&ms->smp_cache,
> > + CACHE_LEVEL_AND_TYPE_L1D,
>
> Short line wrap. Maybe combine the two lines above and similar
> cases.
Like this?
smp_cache_topo_cmp(&ms->smp_cache, CACHE_LEVEL_AND_TYPE_L1D,
CACHE_LEVEL_AND_TYPE_L2)
> Up to you though, I don't feel that strongly.
>
> > + CACHE_LEVEL_AND_TYPE_L2) ||
> > + smp_cache_topo_cmp(&ms->smp_cache,
> > + CACHE_LEVEL_AND_TYPE_L1I,
> > + CACHE_LEVEL_AND_TYPE_L2)) {
> > + error_setg(errp,
> > + "Invalid smp cache topology. "
> > + "L2 cache topology level shouldn't be lower than L1 cache");
> > + return false;
> > + }
> > +
Regards,
Zhao
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 5/7] i386/cpu: Support thread and module level cache topology
[not found] ` <20240917100508.00001907@Huawei.com>
@ 2024-10-07 11:24 ` Zhao Liu
0 siblings, 0 replies; 18+ messages in thread
From: Zhao Liu @ 2024-10-07 11:24 UTC (permalink / raw)
To: Jonathan Cameron
Cc: Daniel P . Berrangé, Igor Mammedov, Eduardo Habkost,
Marcel Apfelbaum, Philippe Mathieu-Daudé, Yanan Wang,
Michael S.Tsirkin, Paolo Bonzini, Richard Henderson, Eric Blake,
Markus Armbruster, Marcelo Tosatti, Alex Bennée,
Peter Maydell, Sia Jee Heng, Alireza Sanaee, qemu-devel, kvm,
qemu-riscv, qemu-arm, Zhenyu Wang, Dapeng Mi, Yongwei Ma,
Zhao Liu
On Tue, Sep 17, 2024 at 10:05:08AM +0100, Jonathan Cameron wrote:
> Date: Tue, 17 Sep 2024 10:05:08 +0100
> From: Jonathan Cameron <Jonathan.Cameron@Huawei.com>
> Subject: Re: [PATCH v2 5/7] i386/cpu: Support thread and module level cache
> topology
> X-Mailer: Claws Mail 4.1.0 (GTK 3.24.33; x86_64-w64-mingw32)
>
> On Sun, 8 Sep 2024 20:59:18 +0800
> Zhao Liu <zhao1.liu@intel.com> wrote:
>
> > Allow cache to be defined at the thread and module level. This
> > increases flexibility for x86 users to customize their cache topology.
> >
> > Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
> > Tested-by: Yongwei Ma <yongwei.ma@intel.com>
>
> Will be interesting to see if anyone uses the thread level, but
> no harm in supporting it.
x86 CPU has a legacy property "x-l1-cache-per-thread". This is the old
QEMU cache topology behavior, kept for compatibility. Now add thread
level and I can refactor the code for this thread level.
> I guess this would be a case of RDT
> / MPAM etc as I'm not sure I've seen an SMT processor with
> private caches. Some old papers seems to suggest that it might
> make sense for smt 8 and above.
Thanks for the hint, I'll think about whether some of the RDT / MPAM
cases can be applied here.
> Anyhow, patch is fine
> Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Thanks!
-Zhao
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 6/7] i386/cpu: Update cache topology with machine's configuration
[not found] ` <20240917100641.000050a8@Huawei.com>
@ 2024-10-07 11:25 ` Zhao Liu
0 siblings, 0 replies; 18+ messages in thread
From: Zhao Liu @ 2024-10-07 11:25 UTC (permalink / raw)
To: Jonathan Cameron
Cc: Daniel P . Berrangé, Igor Mammedov, Eduardo Habkost,
Marcel Apfelbaum, Philippe Mathieu-Daudé, Yanan Wang,
Michael S.Tsirkin, Paolo Bonzini, Richard Henderson, Eric Blake,
Markus Armbruster, Marcelo Tosatti, Alex Bennée,
Peter Maydell, Sia Jee Heng, Alireza Sanaee, qemu-devel, kvm,
qemu-riscv, qemu-arm, Zhenyu Wang, Dapeng Mi, Yongwei Ma,
Zhao Liu
On Tue, Sep 17, 2024 at 10:06:41AM +0100, Jonathan Cameron wrote:
> Date: Tue, 17 Sep 2024 10:06:41 +0100
> From: Jonathan Cameron <Jonathan.Cameron@Huawei.com>
> Subject: Re: [PATCH v2 6/7] i386/cpu: Update cache topology with machine's
> configuration
> X-Mailer: Claws Mail 4.1.0 (GTK 3.24.33; x86_64-w64-mingw32)
>
> On Sun, 8 Sep 2024 20:59:19 +0800
> Zhao Liu <zhao1.liu@intel.com> wrote:
>
> > User will configure smp cache topology via -machine smp-cache.
> >
> > For this case, update the x86 CPUs' cache topology with user's
> > configuration in MachineState.
> >
> > Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
> > Tested-by: Yongwei Ma <yongwei.ma@intel.com>
> Seems simple enough.
> Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Thanks!
-Zhao
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 7/7] i386/pc: Support cache topology in -machine for PC machine
[not found] ` <20240917101631.00003dcb@Huawei.com>
@ 2024-10-07 11:53 ` Zhao Liu
0 siblings, 0 replies; 18+ messages in thread
From: Zhao Liu @ 2024-10-07 11:53 UTC (permalink / raw)
To: Jonathan Cameron
Cc: Daniel P . Berrangé, Igor Mammedov, Eduardo Habkost,
Marcel Apfelbaum, Philippe Mathieu-Daudé, Yanan Wang,
Michael S.Tsirkin, Paolo Bonzini, Richard Henderson, Eric Blake,
Markus Armbruster, Marcelo Tosatti, Alex Bennée,
Peter Maydell, Sia Jee Heng, Alireza Sanaee, qemu-devel, kvm,
qemu-riscv, qemu-arm, Zhenyu Wang, Dapeng Mi, Yongwei Ma,
Zhao Liu
On Tue, Sep 17, 2024 at 10:16:31AM +0100, Jonathan Cameron wrote:
> Date: Tue, 17 Sep 2024 10:16:31 +0100
> From: Jonathan Cameron <Jonathan.Cameron@Huawei.com>
> Subject: Re: [PATCH v2 7/7] i386/pc: Support cache topology in -machine for
> PC machine
> X-Mailer: Claws Mail 4.1.0 (GTK 3.24.33; x86_64-w64-mingw32)
>
> On Sun, 8 Sep 2024 20:59:20 +0800
> Zhao Liu <zhao1.liu@intel.com> wrote:
>
> > Allow user to configure l1d, l1i, l2 and l3 cache topologies for PC
> > machine.
> >
> > Additionally, add the document of "-machine smp-cache" in
> > qemu-options.hx.
> >
> > Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
> > Tested-by: Yongwei Ma <yongwei.ma@intel.com>
>
> Trivial language suggestions.
> In general looks good to me.
>
> Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
>
> Hopefully QOM maintainers and others will get to this soon.
> I'd like Ali's ARM series to land this cycle as well
> as the lack of this support has been a pain point for us
> for a while.
>
> Jonathan
Thanks! I'll refresh a new version.
[snip]
> > diff --git a/qemu-options.hx b/qemu-options.hx
> > index d94e2cbbaeb1..3936ff3e77f9 100644
> > --- a/qemu-options.hx
> > +++ b/qemu-options.hx
> > @@ -39,7 +39,8 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \
> > " memory-encryption=@var{} memory encryption object to use (default=none)\n"
> > " hmat=on|off controls ACPI HMAT support (default=off)\n"
> > " memory-backend='backend-id' specifies explicitly provided backend for main RAM (default=none)\n"
> > - " cxl-fmw.0.targets.0=firsttarget,cxl-fmw.0.targets.1=secondtarget,cxl-fmw.0.size=size[,cxl-fmw.0.interleave-granularity=granularity]\n",
> > + " cxl-fmw.0.targets.0=firsttarget,cxl-fmw.0.targets.1=secondtarget,cxl-fmw.0.size=size[,cxl-fmw.0.interleave-granularity=granularity]\n"
> > + " smp-cache.0.cache=cachename,smp-cache.0.topology=topologylevel\n",
>
> Now my cxl-fmw stuff has competition for most hideous element :)
> When we add a few more properties maybe we'll get an even longer line!
May JSON support can save us :). When I have time I will consider this.
Command line's keyval format is more convenient for configuring a single
element in an array.
> > QEMU_ARCH_ALL)
> > SRST
> > ``-machine [type=]name[,prop=value[,...]]``
> > @@ -159,6 +160,31 @@ SRST
> > ::
> >
> > -machine cxl-fmw.0.targets.0=cxl.0,cxl-fmw.0.targets.1=cxl.1,cxl-fmw.0.size=128G,cxl-fmw.0.interleave-granularity=512
> > +
> > + ``smp-cache.0.cache=cachename,smp-cache.0.topology=topologylevel``
> > + Define cache properties (now only the cache topology level) for SMP
> > + system.
>
> I'd drop the 'now only' bit. Just means we have add noise updating that
> later. It's easy enough to look down and see what is available anyway give
> the parameter docs follow immediately after this.
Agree.
> > +
> > + ``cache=cachename`` specifies the cache that the properties will be
> > + applied on. This field is the combination of cache level and cache
> > + type. Currently it supports ``l1d`` (L1 data cache), ``l1i`` (L1
>
> Drop the word Currently as I don't think it adds anything to he meaning.
> We are never going to add docs that say 'previously it supported' or 'in the
> future it will support'.
>
> "Supports ...
>
Thanks! I will change to "It supports ..."
> > + instruction cache), ``l2`` (L2 unified cache) and ``l3`` (L3 unified
> > + cache).
> > +
> > + ``topology=topologylevel`` sets the cache topology level. It accepts
> > + CPU topology levels including ``thread``, ``core``, ``module``,
> > + ``cluster``, ``die``, ``socket``, ``book``, ``drawer`` and a special
> > + value ``default``. If ``default`` is set, then the cache topology will
> > + follow the architecture's default cache topology model. If other CPU
> If another topology level is set
>
> would be clearer. I briefly read this as saying the topology for another CPU
> rather than a different value here.
Ah, yes, I agree.
> > + topology level is set, the cache will be shared at corresponding CPU
> > + topology level. For example, ``topology=core`` makes the cache shared
> > + in a core.
> "by all threads within a core." perhaps?
Nice, it's more accurate.
Thanks,
Zhao
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 0/7] Introduce SMP Cache Topology
2024-09-08 12:59 [PATCH v2 0/7] Introduce SMP Cache Topology Zhao Liu
` (7 preceding siblings ...)
2024-09-10 18:23 ` [PATCH v2 0/7] Introduce SMP Cache Topology Michael S. Tsirkin
@ 2024-12-17 14:23 ` Alireza Sanaee via
2024-12-17 16:20 ` Zhao Liu
8 siblings, 1 reply; 18+ messages in thread
From: Alireza Sanaee via @ 2024-12-17 14:23 UTC (permalink / raw)
To: Zhao Liu
Cc: Daniel P . Berrangé, Igor Mammedov, Eduardo Habkost,
Marcel Apfelbaum, Philippe Mathieu-Daudé, Yanan Wang,
Michael S . Tsirkin, Paolo Bonzini, Richard Henderson, Eric Blake,
Markus Armbruster, Marcelo Tosatti, Alex Bennée,
Peter Maydell, Jonathan Cameron, Sia Jee Heng, qemu-devel, kvm,
qemu-riscv, qemu-arm, Zhenyu Wang, Dapeng Mi, Yongwei Ma
On Sun, 8 Sep 2024 20:59:13 +0800
Zhao Liu <zhao1.liu@intel.com> wrote:
> Hi all,
>
> Compared with previous Patch v1 [1], I've put the cache properties
> list into -machine, this is to meet current needs and also remain
> compatible with my future topology support (more discussion details,
> pls refer [2]).
>
> This series is based on the commit 1581a0bc928d ("Merge tag 'pull-ufs-
> 20240906' of https://gitlab.com/jeuk20.kim/qemu into staging ufs
> queue").
>
> Background
> ==========
>
> The x86 and ARM (RISCV) need to allow user to configure cache
> properties (current only topology):
> * For x86, the default cache topology model (of max/host CPU) does
> not always match the Host's real physical cache topology. Performance
> can increase when the configured virtual topology is closer to the
> physical topology than a default topology would be.
> * For ARM, QEMU can't get the cache topology information from the CPU
> registers, then user configuration is necessary. Additionally, the
> cache information is also needed for MPAM emulation (for TCG) to
> build the right PPTT. (Originally from Jonathan)
>
>
> About smp-cache
> ===============
>
> In this version, smp-cache is implemented as a array integrated in
> -machine. Though -machine currently can't support JSON format, this is
> the one of the directions of future.
>
> An example is as follows:
>
> smp_cache=smp-cache.0.cache=l1i,smp-cache.0.topology=core,smp-cache.1.cache=l1d,smp-cache.1.topology=core,smp-cache.2.cache=l2,smp-cache.2.topology=module,smp-cache.3.cache=l3,smp-cache.3.topology=die
>
> "cache" specifies the cache that the properties will be applied on.
> This field is the combination of cache level and cache type. Now it
> supports "l1d" (L1 data cache), "l1i" (L1 instruction cache), "l2"
> (L2 unified cache) and "l3" (L3 unified cache).
>
> "topology" field accepts CPU topology levels including "thread",
> "core", "module", "cluster", "die", "socket", "book", "drawer" and a
> special value "default".
>
> The "default" is introduced to make it easier for libvirt to set a
> default parameter value without having to care about the specific
> machine (because currently there is no proper way for machine to
> expose supported topology levels and caches).
>
> If "default" is set, then the cache topology will follow the
> architecture's default cache topology model. If other CPU topology
> level is set, the cache will be shared at corresponding CPU topology
> level.
>
>
> Welcome your comment!
>
>
> [1]: Patch
> v1: https://lore.kernel.org/qemu-devel/20240704031603.1744546-1-zhao1.liu@intel.com/ [2]: API disscussion: https://lore.kernel.org/qemu-devel/8734ndj33j.fsf@pond.sub.org/
>
> Thanks and Best Regards,
> Zhao
> ---
> Changelog:
>
> Main changes since Patch v1:
> * Dropped handwriten smp-cache object and integrated cache properties
> list into MachineState and used -machine to configure SMP cache
> properties. (Markus)
> * Dropped prefix of CpuTopologyLevel enumeration. (Markus)
> * Rename CPU_TOPO_LEVEL_* to CPU_TOPOLOGY_LEVEL_* to match the QAPI's
> generated code. (Markus)
> * Renamed SMPCacheProperty/SMPCacheProperties (QAPI structures) to
> SmpCacheProperties/SmpCachePropertiesWrapper. (Markus)
> * Renamed SMPCacheName (QAPI structure) to SmpCacheLevelAndType and
> dropped prefix. (Markus)
> * Renamed 'name' field in SmpCacheProperties to 'cache', since the
> type and level of the cache in SMP system could be able to specify
> all of these kinds of cache explicitly enough.
> * Renamed 'topo' field in SmpCacheProperties to 'topology'. (Markus)
> * Returned error information when user repeats setting cache
> properties. (Markus)
> * Renamed SmpCacheLevelAndType to CacheLevelAndType, since this
> representation is general across SMP or hybrid system.
> * Dropped machine_check_smp_cache_support() and did the check when
> -machine parses smp-cache in machine_parse_smp_cache().
>
> Main changes since RFC v2:
> * Dropped cpu-topology.h and cpu-topology.c since QAPI has the helper
> (CpuTopologyLevel_str) to convert enum to string. (Markus)
> * Fixed text format in machine.json (CpuTopologyLevel naming, 2
> spaces between sentences). (Markus)
> * Added a new level "default" to de-compatibilize some arch-specific
> topo settings. (Daniel)
> * Moved CpuTopologyLevel to qapi/machine-common.json, at where the
> cache enumeration and smp-cache object would be added.
> - If smp-cache object is defined in qapi/machine.json,
> storage-daemon will complain about the qmp cmds in qapi/machine.json
> during compiling.
> * Referred to Daniel's suggestion to introduce cache JSON list,
> though as a standalone object since -smp/-machine can't support JSON.
> * Linked machine's smp_cache to smp-cache object instead of a builtin
> structure. This is to get around the fact that the keyval format of
> -machine can't support JSON.
> * Wrapped the cache topology level access into a helper.
> * Split as a separate commit to just include compatibility checking
> and topology checking.
> * Allow setting "default" topology level even though the cache
> isn't supported by machine. (Daniel)
> * Rewrote the document of smp-cache object.
>
> Main changes since RFC v1:
> * Split CpuTopology renaimg out of this RFC.
> * Use QAPI to enumerate CPU topology levels.
> * Drop string_to_cpu_topo() since QAPI will help to parse the topo
> levels.
> * Set has_*_cache field in machine_get_smp(). (JeeHeng)
> * Use "*_cache=topo_level" as -smp example as the original "level"
> term for a cache has a totally different meaning. (Jonathan)
> ---
> Zhao Liu (7):
> hw/core: Make CPU topology enumeration arch-agnostic
> qapi/qom: Define cache enumeration and properties
> hw/core: Add smp cache topology for machine
> hw/core: Check smp cache topology support for machine
> i386/cpu: Support thread and module level cache topology
> i386/cpu: Update cache topology with machine's configuration
> i386/pc: Support cache topology in -machine for PC machine
>
> hw/core/machine-smp.c | 119 +++++++++++++++++++++++
> hw/core/machine.c | 44 +++++++++
> hw/i386/pc.c | 4 +
> hw/i386/x86-common.c | 4 +-
> include/hw/boards.h | 13 +++
> include/hw/i386/topology.h | 22 +----
> qapi/machine-common.json | 96 ++++++++++++++++++-
> qemu-options.hx | 28 +++++-
> target/i386/cpu.c | 191
> ++++++++++++++++++++++--------------- target/i386/cpu.h |
> 4 +- 10 files changed, 425 insertions(+), 100 deletions(-)
>
Hi Zhao,
I wonder if this patch-set requires rebase for the new cycle?
Cheers,
Alireza
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 0/7] Introduce SMP Cache Topology
2024-12-17 14:23 ` Alireza Sanaee via
@ 2024-12-17 16:20 ` Zhao Liu
0 siblings, 0 replies; 18+ messages in thread
From: Zhao Liu @ 2024-12-17 16:20 UTC (permalink / raw)
To: Alireza Sanaee
Cc: Daniel P . Berrang�, Igor Mammedov, Eduardo Habkost,
Marcel Apfelbaum, Philippe Mathieu-Daud�, Yanan Wang,
Michael S . Tsirkin, Paolo Bonzini, Richard Henderson, Eric Blake,
Markus Armbruster, Marcelo Tosatti, Alex Benn�e,
Peter Maydell, Jonathan Cameron, Sia Jee Heng, qemu-devel, kvm,
qemu-riscv, qemu-arm, Zhenyu Wang, Dapeng Mi, Yongwei Ma
> Hi Zhao,
>
> I wonder if this patch-set requires rebase for the new cycle?
>
Hi Alireza,
Yes, as some general patches are merged.
(Pls refer the v5: https://lore.kernel.org/qemu-devel/20241101083331.340178-1-zhao1.liu@intel.com/)
I'll send a new version this week, to include the remaining patches
(i386 path and your has_caches flag):
i386/cpu: Support thread and module level cache topology
i386/cpu: Update cache topology with machine's configuration
i386/pc: Support cache topology in -machine for PC machine
i386/cpu: add has_caches flag to check smp_cache configuration
Regards,
Zhao
^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2024-12-17 16:09 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-09-08 12:59 [PATCH v2 0/7] Introduce SMP Cache Topology Zhao Liu
2024-09-08 12:59 ` [PATCH v2 1/7] hw/core: Make CPU topology enumeration arch-agnostic Zhao Liu
2024-09-08 12:59 ` [PATCH v2 2/7] qapi/qom: Define cache enumeration and properties Zhao Liu
[not found] ` <20240917095126.000036f1@Huawei.com>
2024-10-07 10:48 ` Zhao Liu
2024-09-08 12:59 ` [PATCH v2 3/7] hw/core: Add smp cache topology for machine Zhao Liu
[not found] ` <20240917100048.00001bcf@Huawei.com>
2024-10-07 11:02 ` Zhao Liu
2024-09-08 12:59 ` [PATCH v2 4/7] hw/core: Check smp cache topology support " Zhao Liu
[not found] ` <20240917095612.00007b5a@Huawei.com>
2024-10-07 11:12 ` Zhao Liu
2024-09-08 12:59 ` [PATCH v2 5/7] i386/cpu: Support thread and module level cache topology Zhao Liu
[not found] ` <20240917100508.00001907@Huawei.com>
2024-10-07 11:24 ` Zhao Liu
2024-09-08 12:59 ` [PATCH v2 6/7] i386/cpu: Update cache topology with machine's configuration Zhao Liu
[not found] ` <20240911110028.00001d3d@huawei.com>
2024-10-07 10:21 ` Zhao Liu
[not found] ` <20240917100641.000050a8@Huawei.com>
2024-10-07 11:25 ` Zhao Liu
2024-09-08 12:59 ` [PATCH v2 7/7] i386/pc: Support cache topology in -machine for PC machine Zhao Liu
[not found] ` <20240917101631.00003dcb@Huawei.com>
2024-10-07 11:53 ` Zhao Liu
2024-09-10 18:23 ` [PATCH v2 0/7] Introduce SMP Cache Topology Michael S. Tsirkin
2024-12-17 14:23 ` Alireza Sanaee via
2024-12-17 16:20 ` Zhao Liu
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).