浏览代码

qapi: introduce x-query-ramblock QMP command

This is a counterpart to the HMP "info ramblock" command. It is being
added with an "x-" prefix because this QMP command is intended as an
adhoc debugging tool and will thus not be modelled in QAPI as fully
structured data, nor will it have long term guaranteed stability.
The existing HMP command is rewritten to call the QMP command.

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Daniel P. Berrangé 4 年之前
父节点
当前提交
ca411b7c8a
共有 6 个文件被更改,包括 33 次插入16 次删除
  1. 1 1
      hmp-commands-info.hx
  2. 1 1
      include/exec/ramlist.h
  3. 0 6
      monitor/hmp-cmds.c
  4. 8 0
      monitor/qmp-cmds.c
  5. 12 0
      qapi/machine.json
  6. 11 8
      softmmu/physmem.c

+ 1 - 1
hmp-commands-info.hx

@@ -772,7 +772,7 @@ ERST
         .args_type  = "",
         .args_type  = "",
         .params     = "",
         .params     = "",
         .help       = "Display system ramblock information",
         .help       = "Display system ramblock information",
-        .cmd        = hmp_info_ramblock,
+        .cmd_info_hrt = qmp_x_query_ramblock,
     },
     },
 
 
 SRST
 SRST

+ 1 - 1
include/exec/ramlist.h

@@ -80,6 +80,6 @@ void ram_block_notify_add(void *host, size_t size, size_t max_size);
 void ram_block_notify_remove(void *host, size_t size, size_t max_size);
 void ram_block_notify_remove(void *host, size_t size, size_t max_size);
 void ram_block_notify_resize(void *host, size_t old_size, size_t new_size);
 void ram_block_notify_resize(void *host, size_t old_size, size_t new_size);
 
 
-void ram_block_dump(Monitor *mon);
+GString *ram_block_format(void);
 
 
 #endif /* RAMLIST_H */
 #endif /* RAMLIST_H */

+ 0 - 6
monitor/hmp-cmds.c

@@ -52,7 +52,6 @@
 #include "ui/console.h"
 #include "ui/console.h"
 #include "qemu/cutils.h"
 #include "qemu/cutils.h"
 #include "qemu/error-report.h"
 #include "qemu/error-report.h"
-#include "exec/ramlist.h"
 #include "hw/intc/intc.h"
 #include "hw/intc/intc.h"
 #include "migration/snapshot.h"
 #include "migration/snapshot.h"
 #include "migration/misc.h"
 #include "migration/misc.h"
@@ -2176,11 +2175,6 @@ void hmp_rocker_of_dpa_groups(Monitor *mon, const QDict *qdict)
     qapi_free_RockerOfDpaGroupList(list);
     qapi_free_RockerOfDpaGroupList(list);
 }
 }
 
 
-void hmp_info_ramblock(Monitor *mon, const QDict *qdict)
-{
-    ram_block_dump(mon);
-}
-
 void hmp_info_vm_generation_id(Monitor *mon, const QDict *qdict)
 void hmp_info_vm_generation_id(Monitor *mon, const QDict *qdict)
 {
 {
     Error *err = NULL;
     Error *err = NULL;

+ 8 - 0
monitor/qmp-cmds.c

@@ -38,6 +38,7 @@
 #include "qapi/qapi-commands-ui.h"
 #include "qapi/qapi-commands-ui.h"
 #include "qapi/type-helpers.h"
 #include "qapi/type-helpers.h"
 #include "qapi/qmp/qerror.h"
 #include "qapi/qmp/qerror.h"
+#include "exec/ramlist.h"
 #include "hw/mem/memory-device.h"
 #include "hw/mem/memory-device.h"
 #include "hw/acpi/acpi_dev_interface.h"
 #include "hw/acpi/acpi_dev_interface.h"
 #include "hw/rdma/rdma.h"
 #include "hw/rdma/rdma.h"
@@ -414,3 +415,10 @@ HumanReadableText *qmp_x_query_rdma(Error **errp)
 
 
     return human_readable_text_from_str(buf);
     return human_readable_text_from_str(buf);
 }
 }
+
+HumanReadableText *qmp_x_query_ramblock(Error **errp)
+{
+    g_autoptr(GString) buf = ram_block_format();
+
+    return human_readable_text_from_str(buf);
+}

+ 12 - 0
qapi/machine.json

@@ -1436,6 +1436,18 @@
 { 'command': 'x-query-profile',
 { 'command': 'x-query-profile',
   'returns': 'HumanReadableText' }
   'returns': 'HumanReadableText' }
 
 
+##
+# @x-query-ramblock:
+#
+# Query system ramblock information
+#
+# Returns: system ramblock information
+#
+# Since: 6.2
+##
+{ 'command': 'x-query-ramblock',
+  'returns': 'HumanReadableText' }
+
 ##
 ##
 # @x-query-rdma:
 # @x-query-rdma:
 #
 #

+ 11 - 8
softmmu/physmem.c

@@ -1296,23 +1296,26 @@ void qemu_mutex_unlock_ramlist(void)
     qemu_mutex_unlock(&ram_list.mutex);
     qemu_mutex_unlock(&ram_list.mutex);
 }
 }
 
 
-void ram_block_dump(Monitor *mon)
+GString *ram_block_format(void)
 {
 {
     RAMBlock *block;
     RAMBlock *block;
     char *psize;
     char *psize;
+    GString *buf = g_string_new("");
 
 
     RCU_READ_LOCK_GUARD();
     RCU_READ_LOCK_GUARD();
-    monitor_printf(mon, "%24s %8s  %18s %18s %18s\n",
-                   "Block Name", "PSize", "Offset", "Used", "Total");
+    g_string_append_printf(buf, "%24s %8s  %18s %18s %18s\n",
+                           "Block Name", "PSize", "Offset", "Used", "Total");
     RAMBLOCK_FOREACH(block) {
     RAMBLOCK_FOREACH(block) {
         psize = size_to_str(block->page_size);
         psize = size_to_str(block->page_size);
-        monitor_printf(mon, "%24s %8s  0x%016" PRIx64 " 0x%016" PRIx64
-                       " 0x%016" PRIx64 "\n", block->idstr, psize,
-                       (uint64_t)block->offset,
-                       (uint64_t)block->used_length,
-                       (uint64_t)block->max_length);
+        g_string_append_printf(buf, "%24s %8s  0x%016" PRIx64 " 0x%016" PRIx64
+                               " 0x%016" PRIx64 "\n", block->idstr, psize,
+                               (uint64_t)block->offset,
+                               (uint64_t)block->used_length,
+                               (uint64_t)block->max_length);
         g_free(psize);
         g_free(psize);
     }
     }
+
+    return buf;
 }
 }
 
 
 #ifdef __linux__
 #ifdef __linux__