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