@@ -154,6 +154,48 @@ ETEXI
},
STEXI
+@item block_dirty_bitmap_add
+@findex block_dirty_bitmap_add
+Add the block dirty bitmap.
+ETEXI
+
+ {
+ .name = "block_dirty_bitmap_add",
+ .args_type = "node:B,bitmap:s,granularity:o?",
+ .params = "device bitmap [granularity]",
+ .help = "Add dirty bitmap for 'device'",
+ .mhandler.cmd = hmp_block_dirty_bitmap_add,
+ },
+
+STEXI
+@item block_dirty_bitmap_clear
+@findex block_dirty_bitmap_clear
+Clear the block dirty bitmap.
+ETEXI
+
+ {
+ .name = "block_dirty_bitmap_clear",
+ .args_type = "node:B,bitmap:s",
+ .params = "device bitmap",
+ .help = "Clear dirty bitmap for 'device'",
+ .mhandler.cmd = hmp_block_dirty_bitmap_clear,
+ },
+
+STEXI
+@item block_dirty_bitmap_remove
+@findex block_dirty_bitmap_remove
+Remove the block dirty bitmap.
+ETEXI
+
+ {
+ .name = "block_dirty_bitmap_remove",
+ .args_type = "node:B,bitmap:s",
+ .params = "device bitmap",
+ .help = "Remove dirty bitmap for 'device'",
+ .mhandler.cmd = hmp_block_dirty_bitmap_remove,
+ },
+
+STEXI
@item block_job_resume
@findex block_job_resume
Resume a paused block streaming operation.
@@ -1495,6 +1495,74 @@ void hmp_block_job_complete(Monitor *mon, const QDict *qdict)
hmp_handle_error(mon, &error);
}
+void hmp_block_dirty_bitmap_add(Monitor *mon, const QDict *qdict)
+{
+ Error *error = NULL;
+ const char *node = qdict_get_str(qdict, "node");
+ const char *bitmap = qdict_get_str(qdict, "bitmap");
+ uint32_t granularity = qdict_get_try_int(qdict, "granularity", 0);
+
+ if (!node) {
+ error_setg(&error, QERR_MISSING_PARAMETER, "node");
+ hmp_handle_error(mon, &error);
+ return;
+ }
+
+ if (!bitmap) {
+ error_setg(&error, QERR_MISSING_PARAMETER, "bitmap");
+ hmp_handle_error(mon, &error);
+ return;
+ }
+
+ qmp_block_dirty_bitmap_add(node, bitmap,
+ !!granularity, granularity, &error);
+ hmp_handle_error(mon, &error);
+}
+
+void hmp_block_dirty_bitmap_clear(Monitor *mon, const QDict *qdict)
+{
+ Error *error = NULL;
+ const char *node = qdict_get_str(qdict, "node");
+ const char *bitmap = qdict_get_str(qdict, "bitmap");
+
+ if (!node) {
+ error_setg(&error, QERR_MISSING_PARAMETER, "node");
+ hmp_handle_error(mon, &error);
+ return;
+ }
+
+ if (!bitmap) {
+ error_setg(&error, QERR_MISSING_PARAMETER, "bitmap");
+ hmp_handle_error(mon, &error);
+ return;
+ }
+
+ qmp_block_dirty_bitmap_clear(node, bitmap, &error);
+ hmp_handle_error(mon, &error);
+}
+
+void hmp_block_dirty_bitmap_remove(Monitor *mon, const QDict *qdict)
+{
+ Error *error = NULL;
+ const char *node = qdict_get_str(qdict, "node");
+ const char *bitmap = qdict_get_str(qdict, "bitmap");
+
+ if (!node) {
+ error_setg(&error, QERR_MISSING_PARAMETER, "node");
+ hmp_handle_error(mon, &error);
+ return;
+ }
+
+ if (!bitmap) {
+ error_setg(&error, QERR_MISSING_PARAMETER, "bitmap");
+ hmp_handle_error(mon, &error);
+ return;
+ }
+
+ qmp_block_dirty_bitmap_remove(node, bitmap, &error);
+ hmp_handle_error(mon, &error);
+}
+
typedef struct HMPMigrationStatus
{
QEMUTimer *timer;
@@ -81,6 +81,9 @@ void hmp_block_job_cancel(Monitor *mon, const QDict *qdict);
void hmp_block_job_pause(Monitor *mon, const QDict *qdict);
void hmp_block_job_resume(Monitor *mon, const QDict *qdict);
void hmp_block_job_complete(Monitor *mon, const QDict *qdict);
+void hmp_block_dirty_bitmap_add(Monitor *mon, const QDict *qdict);
+void hmp_block_dirty_bitmap_clear(Monitor *mon, const QDict *qdict);
+void hmp_block_dirty_bitmap_remove(Monitor *mon, const QDict *qdict);
void hmp_migrate(Monitor *mon, const QDict *qdict);
void hmp_device_add(Monitor *mon, const QDict *qdict);
void hmp_device_del(Monitor *mon, const QDict *qdict);
Add several hmp commands: 'block_dirty_bitmap_add', 'block_dirty_bitmap_clear', 'block_dirty_bitmap_remove'. The bitmap is used for incremental backup to trace io. Usage: block_dirty_bitmap_add device bitmap [granularity] -- Add dirty bitmap for 'device' block_dirty_bitmap_clear device bitmap -- Clear dirty bitmap for 'device' block_dirty_bitmap_remove device bitmap -- Remove dirty bitmap for 'device' Signed-off-by: Rudy Zhang <rudyflyzhang@gmail.com> --- hmp-commands.hx | 42 +++++++++++++++++++++++++++++++++++ hmp.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ hmp.h | 3 +++ 3 files changed, 113 insertions(+)