hmp: Add "calc_dirty_rate" and "info dirty_rate" cmds
These two commands are missing when adding the QMP sister commands. Add them, so developers can play with them easier. Signed-off-by: Peter Xu <peterx@redhat.com> Signed-off-by: Hyman Huang(黄勇) <huangy81@chinatelecom.cn> Message-Id: <4cc0039fc3ad6145136770cf3b0f056c09a2910b.1623027729.git.huangy81@chinatelecom.cn> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
This commit is contained in:
parent
7afa08cd8f
commit
a4a571d978
@ -867,3 +867,16 @@ SRST
|
||||
``info replay``
|
||||
Display the record/replay information: mode and the current icount.
|
||||
ERST
|
||||
|
||||
{
|
||||
.name = "dirty_rate",
|
||||
.args_type = "",
|
||||
.params = "",
|
||||
.help = "show dirty rate information",
|
||||
.cmd = hmp_info_dirty_rate,
|
||||
},
|
||||
|
||||
SRST
|
||||
``info dirty_rate``
|
||||
Display the vcpu dirty rate information.
|
||||
ERST
|
||||
|
@ -1727,3 +1727,17 @@ ERST
|
||||
.flags = "p",
|
||||
},
|
||||
|
||||
SRST
|
||||
``calc_dirty_rate`` *second*
|
||||
Start a round of dirty rate measurement with the period specified in *second*.
|
||||
The result of the dirty rate measurement may be observed with ``info
|
||||
dirty_rate`` command.
|
||||
ERST
|
||||
|
||||
{
|
||||
.name = "calc_dirty_rate",
|
||||
.args_type = "second:l,sample_pages_per_GB:l?",
|
||||
.params = "second [sample_pages_per_GB]",
|
||||
.help = "start a round of guest dirty rate measurement",
|
||||
.cmd = hmp_calc_dirty_rate,
|
||||
},
|
||||
|
@ -129,5 +129,7 @@ void hmp_info_replay(Monitor *mon, const QDict *qdict);
|
||||
void hmp_replay_break(Monitor *mon, const QDict *qdict);
|
||||
void hmp_replay_delete_break(Monitor *mon, const QDict *qdict);
|
||||
void hmp_replay_seek(Monitor *mon, const QDict *qdict);
|
||||
void hmp_info_dirty_rate(Monitor *mon, const QDict *qdict);
|
||||
void hmp_calc_dirty_rate(Monitor *mon, const QDict *qdict);
|
||||
|
||||
#endif
|
||||
|
@ -20,6 +20,9 @@
|
||||
#include "ram.h"
|
||||
#include "trace.h"
|
||||
#include "dirtyrate.h"
|
||||
#include "monitor/hmp.h"
|
||||
#include "monitor/monitor.h"
|
||||
#include "qapi/qmp/qdict.h"
|
||||
|
||||
static int CalculatingState = DIRTY_RATE_STATUS_UNSTARTED;
|
||||
static struct DirtyRateStat DirtyStat;
|
||||
@ -447,3 +450,47 @@ struct DirtyRateInfo *qmp_query_dirty_rate(Error **errp)
|
||||
{
|
||||
return query_dirty_rate_info();
|
||||
}
|
||||
|
||||
void hmp_info_dirty_rate(Monitor *mon, const QDict *qdict)
|
||||
{
|
||||
DirtyRateInfo *info = query_dirty_rate_info();
|
||||
|
||||
monitor_printf(mon, "Status: %s\n",
|
||||
DirtyRateStatus_str(info->status));
|
||||
monitor_printf(mon, "Start Time: %"PRIi64" (ms)\n",
|
||||
info->start_time);
|
||||
monitor_printf(mon, "Sample Pages: %"PRIu64" (per GB)\n",
|
||||
info->sample_pages);
|
||||
monitor_printf(mon, "Period: %"PRIi64" (sec)\n",
|
||||
info->calc_time);
|
||||
monitor_printf(mon, "Dirty rate: ");
|
||||
if (info->has_dirty_rate) {
|
||||
monitor_printf(mon, "%"PRIi64" (MB/s)\n", info->dirty_rate);
|
||||
} else {
|
||||
monitor_printf(mon, "(not ready)\n");
|
||||
}
|
||||
g_free(info);
|
||||
}
|
||||
|
||||
void hmp_calc_dirty_rate(Monitor *mon, const QDict *qdict)
|
||||
{
|
||||
int64_t sec = qdict_get_try_int(qdict, "second", 0);
|
||||
int64_t sample_pages = qdict_get_try_int(qdict, "sample_pages_per_GB", -1);
|
||||
bool has_sample_pages = (sample_pages != -1);
|
||||
Error *err = NULL;
|
||||
|
||||
if (!sec) {
|
||||
monitor_printf(mon, "Incorrect period length specified!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
qmp_calc_dirty_rate(sec, has_sample_pages, sample_pages, &err);
|
||||
if (err) {
|
||||
hmp_handle_error(mon, err);
|
||||
return;
|
||||
}
|
||||
|
||||
monitor_printf(mon, "Starting dirty rate measurement with period %"PRIi64
|
||||
" seconds\n", sec);
|
||||
monitor_printf(mon, "[Please use 'info dirty_rate' to check results]\n");
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user