On 09/08/22 10:03, Richard W.M. Jones wrote:
On Mon, Sep 05, 2022 at 01:25:27PM +0200, Laszlo Ersek wrote:
> + "p2v.vcpu.dense_topo" => manual_entry->new(
> + shortopt => "", # ignored for booleans
> + description => "
> +Copy the physical machine's CPU topology, densely populated, to the
> +guest. Disabled by default. If disabled, the C<p2v.vcpu.cores> setting
> +takes effect.",
I just realised I'm not completely sure what "densely populated"
means here. I think we should have a bit more explanation.
How about something like:
"p2v.vcpu.dense_topo" => manual_entry->new(
shortopt => "", # ignored for booleans
description => "
Copy the physical machine's complete CPU topology (sockets, cores and
threads) to the guest. Disabled by default. If disabled, the
C<p2v.vcpu.cores> setting takes effect.",
(Which might also imply that we rename this something like
"complete_topo" or "full_topo" but I'll leave that to you.)
By "dense", I meant to express that there are no gaps in the onlining of
the CPU topology.
Assume we have 2 sockets, 2 cores/socket, 2 theads/core. Assume CPU#1
(in socket#1) is hot-pluggable, but isn't currently plugged, only CPU#0
(in socket#0) is present -- making for 1*2*2 = 4 logical processors in
total. A physical machine may well boot like this. Then our topology is
2*2*2, but we only have 4 logical processors, so the topology is not
densely populated. The language is supposed to express that in any such
case, we'll ignore the online / plugged / etc count, and we'll just grab
the static topology, and fully / densely populate it with logical
processors.
"Complete topology" does not express this. Sticking with the above
example, the topology is already complete on the physical machine (we
have full information about the levels of the hierarchy), but it's not
densely populated.
Another example would be 1 * 4 * 2 physical (a normal low-end machine by
today's standards), where the sysadmin disables (say) cores #1 and #2
using /sys/devices/system/cpu/cpu{1,2}/online. (I think this may even be
possible on the kernel command line, for whatever reason necessary.) In
this case, during conversion, if "dense_topo" is set, we carry over not
just the topology (= the 1 * 4 * 2 hierarchy), but we also densely
populate it (producing 8 logical processors in the conversion output,
disregarding the "gaps" on the source; i.e. that only 4 logical
processors were available on the physical machine originally.)
I considered "complete", and thought it didn't express my intent.
"Full"
is so-so -- my problem is it seems to have two meanings; one is in fact
what I'm trying to say with "dense", but the other meaning is just
"complete", which I don't find good.
The choices p2v should offer are:
- Just carry over a flat VCPU count N --> this maps to a 1 socket * N
cores/socket * 1 thread / core topology, fully populated.
- Otherwise (i.e., when the dense_topo knob is enabled), convert the
original topology (S sockets * C/S cores/socket * T threads/core), *AND*
fully populate that topology (disregarding the original "online count"
on the physical machine, which may easily be less than the (S * C * T)
product.)
Thanks
Laszlo