From: "Maciej S. Szmigiero" <maciej.szmigiero@oracle.com>
Used by the driver to report its provided memory state information.
Co-developed-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Maciej S. Szmigiero <maciej.szmigiero@oracle.com>
---
hw/core/machine-hmp-cmds.c | 15 +++++++++++++++
hw/hyperv/hv-balloon.c | 27 +++++++++++++++++++++++++-
qapi/machine.json | 39 ++++++++++++++++++++++++++++++++++++--
3 files changed, 78 insertions(+), 3 deletions(-)
diff --git a/hw/core/machine-hmp-cmds.c b/hw/core/machine-hmp-cmds.c
index c3e55ef9e9cd..7b06ed35decb 100644
--- a/hw/core/machine-hmp-cmds.c
+++ b/hw/core/machine-hmp-cmds.c
@@ -247,6 +247,7 @@ void hmp_info_memory_devices(Monitor *mon, const QDict *qdict)
MemoryDeviceInfo *value;
PCDIMMDeviceInfo *di;
SgxEPCDeviceInfo *se;
+ HvBalloonDeviceInfo *hi;
for (info = info_list; info; info = info->next) {
value = info->value;
@@ -304,6 +305,20 @@ void hmp_info_memory_devices(Monitor *mon, const QDict *qdict)
monitor_printf(mon, " node: %" PRId64 "\n", se->node);
monitor_printf(mon, " memdev: %s\n", se->memdev);
break;
+ case MEMORY_DEVICE_INFO_KIND_HV_BALLOON:
+ hi = value->u.hv_balloon.data;
+ monitor_printf(mon, "Memory device [%s]: \"%s\"\n",
+ MemoryDeviceInfoKind_str(value->type),
+ hi->id ? hi->id : "");
+ if (hi->has_memaddr) {
+ monitor_printf(mon, " memaddr: 0x%" PRIx64 "\n",
+ hi->memaddr);
+ }
+ monitor_printf(mon, " max-size: %" PRIu64 "\n", hi->max_size);
+ if (hi->memdev) {
+ monitor_printf(mon, " memdev: %s\n", hi->memdev);
+ }
+ break;
default:
g_assert_not_reached();
}
diff --git a/hw/hyperv/hv-balloon.c b/hw/hyperv/hv-balloon.c
index 4d87f99375b5..c384f23a3b5e 100644
--- a/hw/hyperv/hv-balloon.c
+++ b/hw/hyperv/hv-balloon.c
@@ -1622,6 +1622,31 @@ static MemoryRegion *hv_balloon_md_get_memory_region(MemoryDeviceState *md,
return balloon->mr;
}
+static void hv_balloon_md_fill_device_info(const MemoryDeviceState *md,
+ MemoryDeviceInfo *info)
+{
+ HvBalloonDeviceInfo *hi = g_new0(HvBalloonDeviceInfo, 1);
+ const HvBalloon *balloon = HV_BALLOON(md);
+ DeviceState *dev = DEVICE(md);
+
+ if (dev->id) {
+ hi->id = g_strdup(dev->id);
+ }
+
+ if (balloon->hostmem) {
+ hi->memdev = object_get_canonical_path(OBJECT(balloon->hostmem));
+ hi->memaddr = balloon->addr;
+ hi->has_memaddr = true;
+ hi->max_size = memory_region_size(balloon->mr);
+ /* TODO: expose current provided size or something else? */
+ } else {
+ hi->max_size = 0;
+ }
+
+ info->u.hv_balloon.data = hi;
+ info->type = MEMORY_DEVICE_INFO_KIND_HV_BALLOON;
+}
+
static void hv_balloon_decide_memslots(MemoryDeviceState *md,
unsigned int limit)
{
@@ -1709,5 +1734,5 @@ static void hv_balloon_class_init(ObjectClass *klass, void *data)
mdc->get_memory_region = hv_balloon_md_get_memory_region;
mdc->decide_memslots = hv_balloon_decide_memslots;
mdc->get_memslots = hv_balloon_get_memslots;
- /* implement fill_device_info */
+ mdc->fill_device_info = hv_balloon_md_fill_device_info;
}
diff --git a/qapi/machine.json b/qapi/machine.json
index a08b6576cac6..5ede977cf2bc 100644
--- a/qapi/machine.json
+++ b/qapi/machine.json
@@ -1265,6 +1265,29 @@
}
}
+##
+# @HvBalloonDeviceInfo:
+#
+# hv-balloon provided memory state information
+#
+# @id: device's ID
+#
+# @memaddr: physical address in memory, where device is mapped
+#
+# @max-size: the maximum size of memory that the device can provide
+#
+# @memdev: memory backend linked with device
+#
+# Since: 8.2
+##
+{ 'struct': 'HvBalloonDeviceInfo',
+ 'data': { '*id': 'str',
+ '*memaddr': 'size',
+ 'max-size': 'size',
+ '*memdev': 'str'
+ }
+}
+
##
# @MemoryDeviceInfoKind:
#
@@ -1276,10 +1299,13 @@
#
# @sgx-epc: since 6.2.
#
+# @hv-balloon: since 8.2.
+#
# Since: 2.1
##
{ 'enum': 'MemoryDeviceInfoKind',
- 'data': [ 'dimm', 'nvdimm', 'virtio-pmem', 'virtio-mem', 'sgx-epc' ] }
+ 'data': [ 'dimm', 'nvdimm', 'virtio-pmem', 'virtio-mem', 'sgx-epc',
+ 'hv-balloon' ] }
##
# @PCDIMMDeviceInfoWrapper:
@@ -1313,6 +1339,14 @@
{ 'struct': 'SgxEPCDeviceInfoWrapper',
'data': { 'data': 'SgxEPCDeviceInfo' } }
+##
+# @HvBalloonDeviceInfoWrapper:
+#
+# Since: 8.2
+##
+{ 'struct': 'HvBalloonDeviceInfoWrapper',
+ 'data': { 'data': 'HvBalloonDeviceInfo' } }
+
##
# @MemoryDeviceInfo:
#
@@ -1327,7 +1361,8 @@
'nvdimm': 'PCDIMMDeviceInfoWrapper',
'virtio-pmem': 'VirtioPMEMDeviceInfoWrapper',
'virtio-mem': 'VirtioMEMDeviceInfoWrapper',
- 'sgx-epc': 'SgxEPCDeviceInfoWrapper'
+ 'sgx-epc': 'SgxEPCDeviceInfoWrapper',
+ 'hv-balloon': 'HvBalloonDeviceInfoWrapper'
}
}
On 28.08.23 18:48, Maciej S. Szmigiero wrote:
> From: "Maciej S. Szmigiero" <maciej.szmigiero@oracle.com>
>
> Used by the driver to report its provided memory state information.
>
> Co-developed-by: David Hildenbrand <david@redhat.com>
> Signed-off-by: Maciej S. Szmigiero <maciej.szmigiero@oracle.com>
> ---
> hw/core/machine-hmp-cmds.c | 15 +++++++++++++++
> hw/hyperv/hv-balloon.c | 27 +++++++++++++++++++++++++-
> qapi/machine.json | 39 ++++++++++++++++++++++++++++++++++++--
> 3 files changed, 78 insertions(+), 3 deletions(-)
>
> diff --git a/hw/core/machine-hmp-cmds.c b/hw/core/machine-hmp-cmds.c
> index c3e55ef9e9cd..7b06ed35decb 100644
> --- a/hw/core/machine-hmp-cmds.c
> +++ b/hw/core/machine-hmp-cmds.c
> @@ -247,6 +247,7 @@ void hmp_info_memory_devices(Monitor *mon, const QDict *qdict)
> MemoryDeviceInfo *value;
> PCDIMMDeviceInfo *di;
> SgxEPCDeviceInfo *se;
> + HvBalloonDeviceInfo *hi;
>
> for (info = info_list; info; info = info->next) {
> value = info->value;
> @@ -304,6 +305,20 @@ void hmp_info_memory_devices(Monitor *mon, const QDict *qdict)
> monitor_printf(mon, " node: %" PRId64 "\n", se->node);
> monitor_printf(mon, " memdev: %s\n", se->memdev);
> break;
> + case MEMORY_DEVICE_INFO_KIND_HV_BALLOON:
> + hi = value->u.hv_balloon.data;
> + monitor_printf(mon, "Memory device [%s]: \"%s\"\n",
> + MemoryDeviceInfoKind_str(value->type),
> + hi->id ? hi->id : "");
> + if (hi->has_memaddr) {
> + monitor_printf(mon, " memaddr: 0x%" PRIx64 "\n",
> + hi->memaddr);
> + }
> + monitor_printf(mon, " max-size: %" PRIu64 "\n", hi->max_size);
> + if (hi->memdev) {
> + monitor_printf(mon, " memdev: %s\n", hi->memdev);
> + }
> + break;
> default:
> g_assert_not_reached();
> }
> diff --git a/hw/hyperv/hv-balloon.c b/hw/hyperv/hv-balloon.c
> index 4d87f99375b5..c384f23a3b5e 100644
> --- a/hw/hyperv/hv-balloon.c
> +++ b/hw/hyperv/hv-balloon.c
> @@ -1622,6 +1622,31 @@ static MemoryRegion *hv_balloon_md_get_memory_region(MemoryDeviceState *md,
> return balloon->mr;
> }
>
> +static void hv_balloon_md_fill_device_info(const MemoryDeviceState *md,
> + MemoryDeviceInfo *info)
> +{
> + HvBalloonDeviceInfo *hi = g_new0(HvBalloonDeviceInfo, 1);
> + const HvBalloon *balloon = HV_BALLOON(md);
> + DeviceState *dev = DEVICE(md);
> +
> + if (dev->id) {
> + hi->id = g_strdup(dev->id);
> + }
> +
> + if (balloon->hostmem) {
> + hi->memdev = object_get_canonical_path(OBJECT(balloon->hostmem));
> + hi->memaddr = balloon->addr;
> + hi->has_memaddr = true;
> + hi->max_size = memory_region_size(balloon->mr);
> + /* TODO: expose current provided size or something else? */
> + } else {
> + hi->max_size = 0;
> + }
> +
> + info->u.hv_balloon.data = hi;
> + info->type = MEMORY_DEVICE_INFO_KIND_HV_BALLOON;
> +}
> +
> static void hv_balloon_decide_memslots(MemoryDeviceState *md,
> unsigned int limit)
> {
> @@ -1709,5 +1734,5 @@ static void hv_balloon_class_init(ObjectClass *klass, void *data)
> mdc->get_memory_region = hv_balloon_md_get_memory_region;
> mdc->decide_memslots = hv_balloon_decide_memslots;
> mdc->get_memslots = hv_balloon_get_memslots;
> - /* implement fill_device_info */
> + mdc->fill_device_info = hv_balloon_md_fill_device_info;
> }
> diff --git a/qapi/machine.json b/qapi/machine.json
> index a08b6576cac6..5ede977cf2bc 100644
> --- a/qapi/machine.json
> +++ b/qapi/machine.json
> @@ -1265,6 +1265,29 @@
> }
> }
>
> +##
> +# @HvBalloonDeviceInfo:
> +#
> +# hv-balloon provided memory state information
> +#
> +# @id: device's ID
> +#
> +# @memaddr: physical address in memory, where device is mapped
> +#
> +# @max-size: the maximum size of memory that the device can provide
> +#
> +# @memdev: memory backend linked with device
> +#
> +# Since: 8.2
> +##
> +{ 'struct': 'HvBalloonDeviceInfo',
> + 'data': { '*id': 'str',
> + '*memaddr': 'size',
> + 'max-size': 'size',
> + '*memdev': 'str'
> + }
> +}
> +
> ##
> # @MemoryDeviceInfoKind:
> #
> @@ -1276,10 +1299,13 @@
> #
> # @sgx-epc: since 6.2.
> #
> +# @hv-balloon: since 8.2.
> +#
> # Since: 2.1
> ##
> { 'enum': 'MemoryDeviceInfoKind',
> - 'data': [ 'dimm', 'nvdimm', 'virtio-pmem', 'virtio-mem', 'sgx-epc' ] }
> + 'data': [ 'dimm', 'nvdimm', 'virtio-pmem', 'virtio-mem', 'sgx-epc',
> + 'hv-balloon' ] }
>
> ##
> # @PCDIMMDeviceInfoWrapper:
> @@ -1313,6 +1339,14 @@
> { 'struct': 'SgxEPCDeviceInfoWrapper',
> 'data': { 'data': 'SgxEPCDeviceInfo' } }
>
> +##
> +# @HvBalloonDeviceInfoWrapper:
> +#
> +# Since: 8.2
> +##
> +{ 'struct': 'HvBalloonDeviceInfoWrapper',
> + 'data': { 'data': 'HvBalloonDeviceInfo' } }
> +
> ##
> # @MemoryDeviceInfo:
> #
> @@ -1327,7 +1361,8 @@
> 'nvdimm': 'PCDIMMDeviceInfoWrapper',
> 'virtio-pmem': 'VirtioPMEMDeviceInfoWrapper',
> 'virtio-mem': 'VirtioMEMDeviceInfoWrapper',
> - 'sgx-epc': 'SgxEPCDeviceInfoWrapper'
> + 'sgx-epc': 'SgxEPCDeviceInfoWrapper',
> + 'hv-balloon': 'HvBalloonDeviceInfoWrapper'
> }
> }
>
>
Reviewed-by: David Hildenbrand <david@redhat.com>
--
Cheers,
David / dhildenb
"Maciej S. Szmigiero" <mail@maciej.szmigiero.name> writes:
> From: "Maciej S. Szmigiero" <maciej.szmigiero@oracle.com>
>
> Used by the driver to report its provided memory state information.
>
> Co-developed-by: David Hildenbrand <david@redhat.com>
> Signed-off-by: Maciej S. Szmigiero <maciej.szmigiero@oracle.com>
[...]
> diff --git a/qapi/machine.json b/qapi/machine.json
> index a08b6576cac6..5ede977cf2bc 100644
> --- a/qapi/machine.json
> +++ b/qapi/machine.json
> @@ -1265,6 +1265,29 @@
> }
> }
>
> +##
> +# @HvBalloonDeviceInfo:
> +#
> +# hv-balloon provided memory state information
> +#
> +# @id: device's ID
> +#
> +# @memaddr: physical address in memory, where device is mapped
> +#
> +# @max-size: the maximum size of memory that the device can provide
> +#
> +# @memdev: memory backend linked with device
> +#
> +# Since: 8.2
> +##
> +{ 'struct': 'HvBalloonDeviceInfo',
> + 'data': { '*id': 'str',
> + '*memaddr': 'size',
> + 'max-size': 'size',
> + '*memdev': 'str'
> + }
> +}
> +
> ##
> # @MemoryDeviceInfoKind:
> #
> @@ -1276,10 +1299,13 @@
> #
> # @sgx-epc: since 6.2.
> #
> +# @hv-balloon: since 8.2.
> +#
Not this patch's fault: documentation linking enum values and device
types would be nice.
> # Since: 2.1
> ##
> { 'enum': 'MemoryDeviceInfoKind',
> - 'data': [ 'dimm', 'nvdimm', 'virtio-pmem', 'virtio-mem', 'sgx-epc' ] }
> + 'data': [ 'dimm', 'nvdimm', 'virtio-pmem', 'virtio-mem', 'sgx-epc',
> + 'hv-balloon' ] }
>
> ##
> # @PCDIMMDeviceInfoWrapper:
> @@ -1313,6 +1339,14 @@
> { 'struct': 'SgxEPCDeviceInfoWrapper',
> 'data': { 'data': 'SgxEPCDeviceInfo' } }
>
> +##
> +# @HvBalloonDeviceInfoWrapper:
> +#
> +# Since: 8.2
> +##
> +{ 'struct': 'HvBalloonDeviceInfoWrapper',
> + 'data': { 'data': 'HvBalloonDeviceInfo' } }
> +
> ##
> # @MemoryDeviceInfo:
> #
> @@ -1327,7 +1361,8 @@
> 'nvdimm': 'PCDIMMDeviceInfoWrapper',
> 'virtio-pmem': 'VirtioPMEMDeviceInfoWrapper',
> 'virtio-mem': 'VirtioMEMDeviceInfoWrapper',
> - 'sgx-epc': 'SgxEPCDeviceInfoWrapper'
> + 'sgx-epc': 'SgxEPCDeviceInfoWrapper',
> + 'hv-balloon': 'HvBalloonDeviceInfoWrapper'
> }
> }
>
Acked-by: Markus Armbruster <armbru@redhat.com>
© 2016 - 2026 Red Hat, Inc.