[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH 2/2] hmp: add hmp commands dirty bitmap add/clear/re
From: |
Rudy Zhang |
Subject: |
[Qemu-block] [PATCH 2/2] hmp: add hmp commands dirty bitmap add/clear/remove' |
Date: |
Thu, 21 Jan 2016 19:22:18 +0800 |
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 <address@hidden>
---
hmp-commands.hx | 42 +++++++++++++++++++++++++++++++++++
hmp.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
hmp.h | 3 +++
3 files changed, 113 insertions(+)
diff --git a/hmp-commands.hx b/hmp-commands.hx
index 7378aaa..8f1f95b 100644
--- a/hmp-commands.hx
+++ b/hmp-commands.hx
@@ -154,6 +154,48 @@ ETEXI
},
STEXI
address@hidden block_dirty_bitmap_add
address@hidden 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
address@hidden block_dirty_bitmap_clear
address@hidden 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
address@hidden block_dirty_bitmap_remove
address@hidden 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.
diff --git a/hmp.c b/hmp.c
index f8c33cd..b5eecbc 100644
--- a/hmp.c
+++ b/hmp.c
@@ -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;
diff --git a/hmp.h b/hmp.h
index a8c5b5a..ea07116 100644
--- a/hmp.h
+++ b/hmp.h
@@ -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);
--
2.6.4