mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-10-14 15:02:54 +00:00
qmp: add block_job_set_speed command
Add block_job_set_speed, which sets the maximum speed for a background block operation. Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com> Acked-by: Luiz Capitulino <lcapitulino@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
12bd451fe0
commit
2d47c6e9aa
25
blockdev.c
25
blockdev.c
|
@ -964,3 +964,28 @@ void qmp_block_stream(const char *device, bool has_base,
|
||||||
|
|
||||||
trace_qmp_block_stream(bs, bs->job);
|
trace_qmp_block_stream(bs, bs->job);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BlockJob *find_block_job(const char *device)
|
||||||
|
{
|
||||||
|
BlockDriverState *bs;
|
||||||
|
|
||||||
|
bs = bdrv_find(device);
|
||||||
|
if (!bs || !bs->job) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return bs->job;
|
||||||
|
}
|
||||||
|
|
||||||
|
void qmp_block_job_set_speed(const char *device, int64_t value, Error **errp)
|
||||||
|
{
|
||||||
|
BlockJob *job = find_block_job(device);
|
||||||
|
|
||||||
|
if (!job) {
|
||||||
|
error_set(errp, QERR_DEVICE_NOT_ACTIVE, device);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (block_job_set_speed(job, value) < 0) {
|
||||||
|
error_set(errp, QERR_NOT_SUPPORTED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -81,6 +81,20 @@ STEXI
|
||||||
@item block_stream
|
@item block_stream
|
||||||
@findex block_stream
|
@findex block_stream
|
||||||
Copy data from a backing file into a block device.
|
Copy data from a backing file into a block device.
|
||||||
|
ETEXI
|
||||||
|
|
||||||
|
{
|
||||||
|
.name = "block_job_set_speed",
|
||||||
|
.args_type = "device:B,value:o",
|
||||||
|
.params = "device value",
|
||||||
|
.help = "set maximum speed for a background block operation",
|
||||||
|
.mhandler.cmd = hmp_block_job_set_speed,
|
||||||
|
},
|
||||||
|
|
||||||
|
STEXI
|
||||||
|
@item block_job_set_stream
|
||||||
|
@findex block_job_set_stream
|
||||||
|
Set maximum speed for a background block operation.
|
||||||
ETEXI
|
ETEXI
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
11
hmp.c
11
hmp.c
|
@ -794,3 +794,14 @@ void hmp_block_stream(Monitor *mon, const QDict *qdict)
|
||||||
|
|
||||||
hmp_handle_error(mon, &error);
|
hmp_handle_error(mon, &error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void hmp_block_job_set_speed(Monitor *mon, const QDict *qdict)
|
||||||
|
{
|
||||||
|
Error *error = NULL;
|
||||||
|
const char *device = qdict_get_str(qdict, "device");
|
||||||
|
int64_t value = qdict_get_int(qdict, "value");
|
||||||
|
|
||||||
|
qmp_block_job_set_speed(device, value, &error);
|
||||||
|
|
||||||
|
hmp_handle_error(mon, &error);
|
||||||
|
}
|
||||||
|
|
1
hmp.h
1
hmp.h
|
@ -55,5 +55,6 @@ void hmp_eject(Monitor *mon, const QDict *qdict);
|
||||||
void hmp_change(Monitor *mon, const QDict *qdict);
|
void hmp_change(Monitor *mon, const QDict *qdict);
|
||||||
void hmp_block_set_io_throttle(Monitor *mon, const QDict *qdict);
|
void hmp_block_set_io_throttle(Monitor *mon, const QDict *qdict);
|
||||||
void hmp_block_stream(Monitor *mon, const QDict *qdict);
|
void hmp_block_stream(Monitor *mon, const QDict *qdict);
|
||||||
|
void hmp_block_job_set_speed(Monitor *mon, const QDict *qdict);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1465,3 +1465,25 @@
|
||||||
# Since: 1.1
|
# Since: 1.1
|
||||||
##
|
##
|
||||||
{ 'command': 'block_stream', 'data': { 'device': 'str', '*base': 'str' } }
|
{ 'command': 'block_stream', 'data': { 'device': 'str', '*base': 'str' } }
|
||||||
|
|
||||||
|
##
|
||||||
|
# @block_job_set_speed:
|
||||||
|
#
|
||||||
|
# Set maximum speed for a background block operation.
|
||||||
|
#
|
||||||
|
# This command can only be issued when there is an active block job.
|
||||||
|
#
|
||||||
|
# Throttling can be disabled by setting the speed to 0.
|
||||||
|
#
|
||||||
|
# @device: the device name
|
||||||
|
#
|
||||||
|
# @value: the maximum speed, in bytes per second
|
||||||
|
#
|
||||||
|
# Returns: Nothing on success
|
||||||
|
# If the job type does not support throttling, NotSupported
|
||||||
|
# If streaming is not active on this device, DeviceNotActive
|
||||||
|
#
|
||||||
|
# Since: 1.1
|
||||||
|
##
|
||||||
|
{ 'command': 'block_job_set_speed',
|
||||||
|
'data': { 'device': 'str', 'value': 'int' } }
|
||||||
|
|
|
@ -654,6 +654,12 @@ EQMP
|
||||||
.mhandler.cmd_new = qmp_marshal_input_block_stream,
|
.mhandler.cmd_new = qmp_marshal_input_block_stream,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
.name = "block_job_set_speed",
|
||||||
|
.args_type = "device:B,value:o",
|
||||||
|
.mhandler.cmd_new = qmp_marshal_input_block_job_set_speed,
|
||||||
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
.name = "blockdev-snapshot-sync",
|
.name = "blockdev-snapshot-sync",
|
||||||
.args_type = "device:B,snapshot-file:s,format:s?",
|
.args_type = "device:B,snapshot-file:s,format:s?",
|
||||||
|
|
Loading…
Reference in a new issue