On Wed, 20 Oct 2021 16:15:29 +0200
Michal Prívozník <mprivozn(a)redhat.com> wrote:
On 10/20/21 1:18 PM, Peter Krempa wrote:
> On Wed, Oct 20, 2021 at 13:07:59 +0200, Michal Prívozník wrote:
>> On 10/6/21 3:32 PM, Igor Mammedov wrote:
>>> On Thu, 30 Sep 2021 14:08:34 +0200
>>> Peter Krempa <pkrempa(a)redhat.com> wrote:
>
> [...]
>
>> 2) In my experiments I try to mimic what libvirt does. Here's my cmd
>> line:
>>
>> qemu-system-x86_64 \
>> -S \
>> -preconfig \
>> -cpu host \
>> -smp 120,sockets=2,dies=3,cores=4,threads=5 \
>> -object
'{"qom-type":"memory-backend-memfd","id":"ram-node0","size":4294967296,"host-nodes":[0],"policy":"bind"}'
\
>> -numa node,nodeid=0,memdev=ram-node0 \
>> -no-user-config \
>> -nodefaults \
>> -no-shutdown \
>> -qmp stdio
>>
>> and here is my QMP log:
>>
>> {"QMP": {"version": {"qemu": {"micro":
50, "minor": 1, "major": 6}, "package":
"v6.1.0-1552-g362534a643"}, "capabilities": ["oob"]}}
>>
>> {"execute":"qmp_capabilities"}
>> {"return": {}}
>>
>> {"execute":"query-hotpluggable-cpus"}
>> {"return": [{"props": {"core-id": 3,
"thread-id": 4, "die-id": 2, "socket-id": 1},
"vcpus-count": 1, "type": "host-x86_64-cpu"},
{"props": {"core-id": 3, "thread-id": 3, "die-id":
2, "socket-id": 1}, "vcpus-count": 1, "type":
"host-x86_64-cpu"}, {"props": {"core-id": 3,
"thread-id": 2, "die-id": 2, "socket-id": 1},
"vcpus-count": 1, "type": "host-x86_64-cpu"},
{"props": {"core-id": 3, "thread-id": 1, "die-id":
2, "socket-id": 1}, "vcpus-count": 1, "type":
"host-x86_64-cpu"}, {"props": {"core-id": 3,
"thread-id": 0, "die-id": 2, "socket-id": 1},
"vcpus-count": 1, "type": "host-x86_64-cpu"},
{"props": {"core-id": 2, "thread-id": 4, "die-id":
2, "socket-id": 1}, "vcpus-count": 1, "type":
"host-x86_64-cpu"},
>> <snip/>
>> {"props": {"core-id": 0, "thread-id": 0,
"die-id": 0, "socket-id": 0}, "vcpus-count": 1,
"type": "host-x86_64-cpu"}]}
>>
>>
>> I can see that query-hotpluggable-cpus returns an array. Can I safely
>> assume that vCPU ID == index in the array? I mean, if I did have -numa
>
> No, this assumption would be incorrect on the aforementioned PPC
> platform where one entry in the returned array can describe multiple
> cores.
>
> qemuDomainFilterHotplugVcpuEntities is the code that cross-references
> the libvirt "index" with the data returned by query-hotpluggable cpus.
>
> The important bit is the 'vcpus-count' property. The code which deals
> with hotplug is already fetching everything that's needed.
Ah, I see. So my assumption would be correct if vcpus-count would be 1
for all entries. If it isn't then I need to account for how much
only for some
boards.
An entry in array describes an single entity that should be handled
as a single device by user (-device/plug/unplug/other mapping options)
(and the entity might have 1 or more vCPUs (threads) depending on
target arch/board).
vcpus-count is in each entity. Fair enough. But
qemuDomainFilterHotplugVcpuEntities() doesn't really do vCPU ID ->
[socket, core, thread] translation, does it?
But even if it did, I am still wondering what the purpose of this whole
exercise is. QEMU won't be able to drop ID -> [socket, core, thread]
mapping. The only thing it would be able to drop is a few lines of code
handling command line. Am I missing something obvious?
I described in other email
why QEMU is dropping cpu_idex on external
interfaces (it's possible to drop it internally too, but I don't see
much gain there vs effort such refactoring would require).
Sure thing, you can invent/maintain libvirt internal
"vCPU ID" -> [topo props]
mapping if it's necessary.
However using just a "vCPU ID" will obscure topology information
from upper layers.
Maybe providing a list of CPUs as an external interface would be better,
then user can pick up which CPUs they wish to add/delete/assign/...
using items from that list.
Michal