@samitouri / QOSamiQemu / commits / 839c0a2bd8

qapi, hmp: introspection for the sp-mem device

Add a SpMemDeviceInfo variant to MemoryDeviceInfo so `query-memory-devices` reports each sp-mem instance (id, addr, size, node, memdev), and print it from HMP `info memory-devices`. Signed-off-by: FangSheng Huang <FangSheng.Huang@amd.com> Reviewed-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: David Hildenbrand (Arm) <david@kernel.org> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Message-ID: <20260623075051.3797975-3-FangSheng.Huang@amd.com>

fanhuang committed Jun 23, 2026 at 15:50 UTC 839c0a2bd8132cdef2faab952d7c3f49b9fa984c
3 files changed +71 -2
hw/core/machine-hmp-cmds.c
+11
@@ -279,6 +279,7 @@ void hmp_info_memory_devices(Monitor *mon, const QDict *qdict)
279 PCDIMMDeviceInfo *di;
280 SgxEPCDeviceInfo *se;
281 HvBalloonDeviceInfo *hi;
282 + SpMemDeviceInfo *spmi;
283
284 for (info = info_list; info; info = info->next) {
285 value = info->value;
@@ -350,6 +351,16 @@ void hmp_info_memory_devices(Monitor *mon, const QDict *qdict)
351 monitor_printf(mon, " memdev: %s\n", hi->memdev);
352 }
353 break;
354 + case MEMORY_DEVICE_INFO_KIND_SP_MEM:
355 + spmi = value->u.sp_mem.data;
356 + monitor_printf(mon, "Memory device [%s]: \"%s\"\n",
357 + MemoryDeviceInfoKind_str(value->type),
358 + spmi->id ? spmi->id : "");
359 + monitor_printf(mon, " addr: 0x%" PRIx64 "\n", spmi->addr);
360 + monitor_printf(mon, " node: %" PRId64 "\n", spmi->node);
361 + monitor_printf(mon, " size: %" PRIu64 "\n", spmi->size);
362 + monitor_printf(mon, " memdev: %s\n", spmi->memdev);
363 + break;
364 default:
365 g_assert_not_reached();
366 }
hw/mem/sp-mem.c
+19
@@ -53,6 +53,24 @@ static MemoryRegion *sp_mem_get_memory_region(MemoryDeviceState *md,
53 return host_memory_backend_get_memory(spm->hostmem);
54 }
55
56 +static void sp_mem_fill_device_info(const MemoryDeviceState *md,
57 + MemoryDeviceInfo *info)
58 +{
59 + SpMemDeviceInfo *di = g_new0(SpMemDeviceInfo, 1);
60 + SpMemDevice *spm = SP_MEM(md);
61 + DeviceState *dev = DEVICE(md);
62 +
63 + di->id = dev->id ? g_strdup(dev->id) : NULL;
64 + di->addr = spm->addr;
65 + di->size = memory_region_size(
66 + host_memory_backend_get_memory(spm->hostmem));
67 + di->node = spm->node;
68 + di->memdev = object_get_canonical_path(OBJECT(spm->hostmem));
69 +
70 + info->u.sp_mem.data = di;
71 + info->type = MEMORY_DEVICE_INFO_KIND_SP_MEM;
72 +}
73 +
74 static void sp_mem_realize(DeviceState *dev, Error **errp)
75 {
76 SpMemDevice *spm = SP_MEM(dev);
@@ -91,6 +109,7 @@ static void sp_mem_class_init(ObjectClass *oc, const void *data)
109 mdc->set_addr = sp_mem_set_addr;
110 mdc->get_memory_region = sp_mem_get_memory_region;
111 mdc->get_plugged_size = memory_device_get_region_size;
112 + mdc->fill_device_info = sp_mem_fill_device_info;
113 }
114
115 static const TypeInfo sp_mem_types[] = {
qapi/machine.json
+41 -2
@@ -1413,6 +1413,32 @@
1413 }
1414 }
1415
1416 +##
1417 +# @SpMemDeviceInfo:
1418 +#
1419 +# sp-mem device state information
1420 +#
1421 +# @id: device's ID
1422 +#
1423 +# @addr: physical address, where device is mapped
1424 +#
1425 +# @size: size of memory that the device provides, in bytes
1426 +#
1427 +# @node: NUMA proximity domain to which the device is assigned
1428 +#
1429 +# @memdev: memory backend linked with device
1430 +#
1431 +# Since: 11.1
1432 +##
1433 +{ 'struct': 'SpMemDeviceInfo',
1434 + 'data': { '*id': 'str',
1435 + 'addr': 'size',
1436 + 'size': 'size',
1437 + 'node': 'int',
1438 + 'memdev': 'str'
1439 + }
1440 +}
1441 +
1442 ##
1443 # @MemoryDeviceInfoKind:
1444 #
@@ -1426,11 +1452,13 @@
1452 #
1453 # @hv-balloon: since 8.2.
1454 #
1455 +# @sp-mem: since 11.1.
1456 +#
1457 # Since: 2.1
1458 ##
1459 { 'enum': 'MemoryDeviceInfoKind',
1460 'data': [ 'dimm', 'nvdimm', 'virtio-pmem', 'virtio-mem', 'sgx-epc',
1433 - 'hv-balloon' ] }
1461 + 'hv-balloon', 'sp-mem' ] }
1462
1463 ##
1464 # @PCDIMMDeviceInfoWrapper:
@@ -1482,6 +1510,16 @@
1510 { 'struct': 'HvBalloonDeviceInfoWrapper',
1511 'data': { 'data': 'HvBalloonDeviceInfo' } }
1512
1513 +##
1514 +# @SpMemDeviceInfoWrapper:
1515 +#
1516 +# @data: sp-mem device state information
1517 +#
1518 +# Since: 11.1
1519 +##
1520 +{ 'struct': 'SpMemDeviceInfoWrapper',
1521 + 'data': { 'data': 'SpMemDeviceInfo' } }
1522 +
1523 ##
1524 # @MemoryDeviceInfo:
1525 #
@@ -1499,7 +1537,8 @@
1537 'virtio-pmem': 'VirtioPMEMDeviceInfoWrapper',
1538 'virtio-mem': 'VirtioMEMDeviceInfoWrapper',
1539 'sgx-epc': 'SgxEPCDeviceInfoWrapper',
1502 - 'hv-balloon': 'HvBalloonDeviceInfoWrapper'
1540 + 'hv-balloon': 'HvBalloonDeviceInfoWrapper',
1541 + 'sp-mem': 'SpMemDeviceInfoWrapper'
1542 }
1543 }
1544