|
@@ -261,10 +261,32 @@ 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;
|
|
|
+}
|
|
|
+
|
|
|
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);
|
|
|
|
|
@@ -283,6 +305,25 @@ bool machine_parse_smp_cache(MachineState *ms,
|
|
|
set_bit(node->value->cache, caches_bitmap);
|
|
|
}
|
|
|
|
|
|
+ for (int i = 0; i < CACHE_LEVEL_AND_TYPE__MAX; i++) {
|
|
|
+ const SmpCacheProperties *props = &ms->smp_cache.props[i];
|
|
|
+
|
|
|
+ /*
|
|
|
+ * 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;
|
|
|
+ }
|
|
|
+ }
|
|
|
return true;
|
|
|
}
|
|
|
|