Skip to content

Commit 9d7950e

Browse files
berrangephilmd
authored andcommitted
hw/core: allow parameter=1 for SMP topology on any machine
This effectively reverts commit 54c4ea8 Author: Zhao Liu <[email protected]> Date: Sat Mar 9 00:01:37 2024 +0800 hw/core/machine-smp: Deprecate unsupported "parameter=1" SMP configurations but is not done as a 'git revert' since the part of the changes to the file hw/core/machine-smp.c which add 'has_XXX' checks remain desirable. Furthermore, we have to tweak the subsequently added unit test to account for differing warning message. The rationale for the original deprecation was: "Currently, it was allowed for users to specify the unsupported topology parameter as "1". For example, x86 PC machine doesn't support drawer/book/cluster topology levels, but user could specify "-smp drawers=1,books=1,clusters=1". This is meaningless and confusing, so that the support for this kind of configurations is marked deprecated since 9.0." There are varying POVs on the topic of 'unsupported' topology levels. It is common to say that on a system without hyperthreading, that there is always 1 thread. Likewise when new CPUs introduced a concept of multiple "dies', it was reasonable to say that all historical CPUs before that implicitly had 1 'die'. Likewise for the more recently introduced 'modules' and 'clusters' parameter'. From this POV, it is valid to set 'parameter=1' on the -smp command line for any machine, only a value > 1 is strictly an error condition. It doesn't cause any functional difficulty for QEMU, because internally the QEMU code is itself assuming that all "unsupported" parameters implicitly have a value of '1'. At the libvirt level, we've allowed applications to set 'parameter=1' when configuring a guest, and pass that through to QEMU. Deprecating this creates extra difficulty for because there's no info exposed from QEMU about which machine types "support" which parameters. Thus, libvirt can't know whether it is valid to pass 'parameter=1' for a given machine type, or whether it will trigger deprecation messages. Since there's no apparent functional benefit to deleting this deprecated behaviour from QEMU, and it creates problems for consumers of QEMU, remove this deprecation. Signed-off-by: Daniel P. Berrangé <[email protected]> Reviewed-by: Zhao Liu <[email protected]> Reviewed-by: Ján Tomko <[email protected]> Message-ID: <[email protected]> Signed-off-by: Philippe Mathieu-Daudé <[email protected]>
1 parent 2563be6 commit 9d7950e

File tree

2 files changed

+31
-61
lines changed

2 files changed

+31
-61
lines changed

hw/core/machine-smp.c

+27-57
Original file line numberDiff line numberDiff line change
@@ -118,76 +118,46 @@ void machine_parse_smp_config(MachineState *ms,
118118
}
119119

120120
/*
121-
* If not supported by the machine, a topology parameter must be
122-
* omitted.
121+
* If not supported by the machine, a topology parameter must
122+
* not be set to a value greater than 1.
123123
*/
124-
if (!mc->smp_props.modules_supported && config->has_modules) {
125-
if (config->modules > 1) {
126-
error_setg(errp, "modules not supported by this "
127-
"machine's CPU topology");
128-
return;
129-
} else {
130-
/* Here modules only equals 1 since we've checked zero case. */
131-
warn_report("Deprecated CPU topology (considered invalid): "
132-
"Unsupported modules parameter mustn't be "
133-
"specified as 1");
134-
}
124+
if (!mc->smp_props.modules_supported &&
125+
config->has_modules && config->modules > 1) {
126+
error_setg(errp,
127+
"modules > 1 not supported by this machine's CPU topology");
128+
return;
135129
}
136130
modules = modules > 0 ? modules : 1;
137131

138-
if (!mc->smp_props.clusters_supported && config->has_clusters) {
139-
if (config->clusters > 1) {
140-
error_setg(errp, "clusters not supported by this "
141-
"machine's CPU topology");
142-
return;
143-
} else {
144-
/* Here clusters only equals 1 since we've checked zero case. */
145-
warn_report("Deprecated CPU topology (considered invalid): "
146-
"Unsupported clusters parameter mustn't be "
147-
"specified as 1");
148-
}
132+
if (!mc->smp_props.clusters_supported &&
133+
config->has_clusters && config->clusters > 1) {
134+
error_setg(errp,
135+
"clusters > 1 not supported by this machine's CPU topology");
136+
return;
149137
}
150138
clusters = clusters > 0 ? clusters : 1;
151139

152-
if (!mc->smp_props.dies_supported && config->has_dies) {
153-
if (config->dies > 1) {
154-
error_setg(errp, "dies not supported by this "
155-
"machine's CPU topology");
156-
return;
157-
} else {
158-
/* Here dies only equals 1 since we've checked zero case. */
159-
warn_report("Deprecated CPU topology (considered invalid): "
160-
"Unsupported dies parameter mustn't be "
161-
"specified as 1");
162-
}
140+
if (!mc->smp_props.dies_supported &&
141+
config->has_dies && config->dies > 1) {
142+
error_setg(errp,
143+
"dies > 1 not supported by this machine's CPU topology");
144+
return;
163145
}
164146
dies = dies > 0 ? dies : 1;
165147

166-
if (!mc->smp_props.books_supported && config->has_books) {
167-
if (config->books > 1) {
168-
error_setg(errp, "books not supported by this "
169-
"machine's CPU topology");
170-
return;
171-
} else {
172-
/* Here books only equals 1 since we've checked zero case. */
173-
warn_report("Deprecated CPU topology (considered invalid): "
174-
"Unsupported books parameter mustn't be "
175-
"specified as 1");
176-
}
148+
if (!mc->smp_props.books_supported &&
149+
config->has_books && config->books > 1) {
150+
error_setg(errp,
151+
"books > 1 not supported by this machine's CPU topology");
152+
return;
177153
}
178154
books = books > 0 ? books : 1;
179155

180-
if (!mc->smp_props.drawers_supported && config->has_drawers) {
181-
if (config->drawers > 1) {
182-
error_setg(errp, "drawers not supported by this "
183-
"machine's CPU topology");
184-
return;
185-
} else {
186-
/* Here drawers only equals 1 since we've checked zero case. */
187-
warn_report("Deprecated CPU topology (considered invalid): "
188-
"Unsupported drawers parameter mustn't be "
189-
"specified as 1");
190-
}
156+
if (!mc->smp_props.drawers_supported &&
157+
config->has_drawers && config->drawers > 1) {
158+
error_setg(errp,
159+
"drawers > 1 not supported by this machine's CPU topology");
160+
return;
191161
}
192162
drawers = drawers > 0 ? drawers : 1;
193163

tests/unit/test-smp-parse.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -337,21 +337,21 @@ static const struct SMPTestData data_generic_invalid[] = {
337337
{
338338
/* config: -smp 2,dies=2 */
339339
.config = SMP_CONFIG_WITH_DIES(T, 2, F, 0, T, 2, F, 0, F, 0, F, 0),
340-
.expect_error = "dies not supported by this machine's CPU topology",
340+
.expect_error = "dies > 1 not supported by this machine's CPU topology",
341341
}, {
342342
/* config: -smp 2,clusters=2 */
343343
.config = SMP_CONFIG_WITH_CLUSTERS(T, 2, F, 0, T, 2, F, 0, F, 0, F, 0),
344-
.expect_error = "clusters not supported by this machine's CPU topology",
344+
.expect_error = "clusters > 1 not supported by this machine's CPU topology",
345345
}, {
346346
/* config: -smp 2,books=2 */
347347
.config = SMP_CONFIG_WITH_BOOKS_DRAWERS(T, 2, F, 0, T, 2, F,
348348
0, F, 0, F, 0, F, 0),
349-
.expect_error = "books not supported by this machine's CPU topology",
349+
.expect_error = "books > 1 not supported by this machine's CPU topology",
350350
}, {
351351
/* config: -smp 2,drawers=2 */
352352
.config = SMP_CONFIG_WITH_BOOKS_DRAWERS(T, 2, T, 2, F, 0, F,
353353
0, F, 0, F, 0, F, 0),
354-
.expect_error = "drawers not supported by this machine's CPU topology",
354+
.expect_error = "drawers > 1 not supported by this machine's CPU topology",
355355
}, {
356356
/* config: -smp 8,sockets=2,cores=4,threads=2,maxcpus=8 */
357357
.config = SMP_CONFIG_GENERIC(T, 8, T, 2, T, 4, T, 2, T, 8),

0 commit comments

Comments
 (0)