Loading block.c +15 −0 Original line number Diff line number Diff line Loading @@ -1978,6 +1978,21 @@ BlockInfoList *qmp_query_block(Error **errp) info->value->inserted->has_backing_file = true; info->value->inserted->backing_file = g_strdup(bs->backing_file); } if (bs->io_limits_enabled) { info->value->inserted->bps = bs->io_limits.bps[BLOCK_IO_LIMIT_TOTAL]; info->value->inserted->bps_rd = bs->io_limits.bps[BLOCK_IO_LIMIT_READ]; info->value->inserted->bps_wr = bs->io_limits.bps[BLOCK_IO_LIMIT_WRITE]; info->value->inserted->iops = bs->io_limits.iops[BLOCK_IO_LIMIT_TOTAL]; info->value->inserted->iops_rd = bs->io_limits.iops[BLOCK_IO_LIMIT_READ]; info->value->inserted->iops_wr = bs->io_limits.iops[BLOCK_IO_LIMIT_WRITE]; } } /* XXX: waiting for the qapi to support GSList */ Loading blockdev.c +59 −0 Original line number Diff line number Diff line Loading @@ -759,6 +759,65 @@ int do_change_block(Monitor *mon, const char *device, return monitor_read_bdrv_key_start(mon, bs, NULL, NULL); } /* throttling disk I/O limits */ int do_block_set_io_throttle(Monitor *mon, const QDict *qdict, QObject **ret_data) { BlockIOLimit io_limits; const char *devname = qdict_get_str(qdict, "device"); BlockDriverState *bs; io_limits.bps[BLOCK_IO_LIMIT_TOTAL] = qdict_get_try_int(qdict, "bps", -1); io_limits.bps[BLOCK_IO_LIMIT_READ] = qdict_get_try_int(qdict, "bps_rd", -1); io_limits.bps[BLOCK_IO_LIMIT_WRITE] = qdict_get_try_int(qdict, "bps_wr", -1); io_limits.iops[BLOCK_IO_LIMIT_TOTAL] = qdict_get_try_int(qdict, "iops", -1); io_limits.iops[BLOCK_IO_LIMIT_READ] = qdict_get_try_int(qdict, "iops_rd", -1); io_limits.iops[BLOCK_IO_LIMIT_WRITE] = qdict_get_try_int(qdict, "iops_wr", -1); bs = bdrv_find(devname); if (!bs) { qerror_report(QERR_DEVICE_NOT_FOUND, devname); return -1; } if ((io_limits.bps[BLOCK_IO_LIMIT_TOTAL] == -1) || (io_limits.bps[BLOCK_IO_LIMIT_READ] == -1) || (io_limits.bps[BLOCK_IO_LIMIT_WRITE] == -1) || (io_limits.iops[BLOCK_IO_LIMIT_TOTAL] == -1) || (io_limits.iops[BLOCK_IO_LIMIT_READ] == -1) || (io_limits.iops[BLOCK_IO_LIMIT_WRITE] == -1)) { qerror_report(QERR_MISSING_PARAMETER, "bps/bps_rd/bps_wr/iops/iops_rd/iops_wr"); return -1; } if (!do_check_io_limits(&io_limits)) { qerror_report(QERR_INVALID_PARAMETER_COMBINATION); return -1; } bs->io_limits = io_limits; bs->slice_time = BLOCK_IO_SLICE_TIME; if (!bs->io_limits_enabled && bdrv_io_limits_enabled(bs)) { bdrv_io_limits_enable(bs); } else if (bs->io_limits_enabled && !bdrv_io_limits_enabled(bs)) { bdrv_io_limits_disable(bs); } else { if (bs->block_timer) { qemu_mod_timer(bs->block_timer, qemu_get_clock_ns(vm_clock)); } } return 0; } int do_drive_del(Monitor *mon, const QDict *qdict, QObject **ret_data) { const char *id = qdict_get_str(qdict, "id"); Loading blockdev.h +2 −0 Original line number Diff line number Diff line Loading @@ -63,6 +63,8 @@ int do_block_set_passwd(Monitor *mon, const QDict *qdict, QObject **ret_data); int do_change_block(Monitor *mon, const char *device, const char *filename, const char *fmt); int do_drive_del(Monitor *mon, const QDict *qdict, QObject **ret_data); int do_block_set_io_throttle(Monitor *mon, const QDict *qdict, QObject **ret_data); int do_snapshot_blkdev(Monitor *mon, const QDict *qdict, QObject **ret_data); int do_block_resize(Monitor *mon, const QDict *qdict, QObject **ret_data); Loading hmp-commands.hx +15 −0 Original line number Diff line number Diff line Loading @@ -1206,6 +1206,21 @@ ETEXI .mhandler.cmd_new = do_block_set_passwd, }, STEXI @item block_set_io_throttle @var{device} @var{bps} @var{bps_rd} @var{bps_wr} @var{iops} @var{iops_rd} @var{iops_wr} @findex block_set_io_throttle Change I/O throttle limits for a block drive to @var{bps} @var{bps_rd} @var{bps_wr} @var{iops} @var{iops_rd} @var{iops_wr} ETEXI { .name = "block_set_io_throttle", .args_type = "device:B,bps:l,bps_rd:l,bps_wr:l,iops:l,iops_rd:l,iops_wr:l", .params = "device bps bps_rd bps_wr iops iops_rd iops_wr", .help = "change I/O throttle limits for a block drive", .user_print = monitor_user_noop, .mhandler.cmd_new = do_block_set_io_throttle, }, STEXI @item block_passwd @var{device} @var{password} @findex block_passwd Loading hmp.c +10 −0 Original line number Diff line number Diff line Loading @@ -216,6 +216,16 @@ void hmp_info_block(Monitor *mon) info->value->inserted->ro, info->value->inserted->drv, info->value->inserted->encrypted); monitor_printf(mon, " bps=%" PRId64 " bps_rd=%" PRId64 " bps_wr=%" PRId64 " iops=%" PRId64 " iops_rd=%" PRId64 " iops_wr=%" PRId64, info->value->inserted->bps, info->value->inserted->bps_rd, info->value->inserted->bps_wr, info->value->inserted->iops, info->value->inserted->iops_rd, info->value->inserted->iops_wr); } else { monitor_printf(mon, " [not inserted]"); } Loading Loading
block.c +15 −0 Original line number Diff line number Diff line Loading @@ -1978,6 +1978,21 @@ BlockInfoList *qmp_query_block(Error **errp) info->value->inserted->has_backing_file = true; info->value->inserted->backing_file = g_strdup(bs->backing_file); } if (bs->io_limits_enabled) { info->value->inserted->bps = bs->io_limits.bps[BLOCK_IO_LIMIT_TOTAL]; info->value->inserted->bps_rd = bs->io_limits.bps[BLOCK_IO_LIMIT_READ]; info->value->inserted->bps_wr = bs->io_limits.bps[BLOCK_IO_LIMIT_WRITE]; info->value->inserted->iops = bs->io_limits.iops[BLOCK_IO_LIMIT_TOTAL]; info->value->inserted->iops_rd = bs->io_limits.iops[BLOCK_IO_LIMIT_READ]; info->value->inserted->iops_wr = bs->io_limits.iops[BLOCK_IO_LIMIT_WRITE]; } } /* XXX: waiting for the qapi to support GSList */ Loading
blockdev.c +59 −0 Original line number Diff line number Diff line Loading @@ -759,6 +759,65 @@ int do_change_block(Monitor *mon, const char *device, return monitor_read_bdrv_key_start(mon, bs, NULL, NULL); } /* throttling disk I/O limits */ int do_block_set_io_throttle(Monitor *mon, const QDict *qdict, QObject **ret_data) { BlockIOLimit io_limits; const char *devname = qdict_get_str(qdict, "device"); BlockDriverState *bs; io_limits.bps[BLOCK_IO_LIMIT_TOTAL] = qdict_get_try_int(qdict, "bps", -1); io_limits.bps[BLOCK_IO_LIMIT_READ] = qdict_get_try_int(qdict, "bps_rd", -1); io_limits.bps[BLOCK_IO_LIMIT_WRITE] = qdict_get_try_int(qdict, "bps_wr", -1); io_limits.iops[BLOCK_IO_LIMIT_TOTAL] = qdict_get_try_int(qdict, "iops", -1); io_limits.iops[BLOCK_IO_LIMIT_READ] = qdict_get_try_int(qdict, "iops_rd", -1); io_limits.iops[BLOCK_IO_LIMIT_WRITE] = qdict_get_try_int(qdict, "iops_wr", -1); bs = bdrv_find(devname); if (!bs) { qerror_report(QERR_DEVICE_NOT_FOUND, devname); return -1; } if ((io_limits.bps[BLOCK_IO_LIMIT_TOTAL] == -1) || (io_limits.bps[BLOCK_IO_LIMIT_READ] == -1) || (io_limits.bps[BLOCK_IO_LIMIT_WRITE] == -1) || (io_limits.iops[BLOCK_IO_LIMIT_TOTAL] == -1) || (io_limits.iops[BLOCK_IO_LIMIT_READ] == -1) || (io_limits.iops[BLOCK_IO_LIMIT_WRITE] == -1)) { qerror_report(QERR_MISSING_PARAMETER, "bps/bps_rd/bps_wr/iops/iops_rd/iops_wr"); return -1; } if (!do_check_io_limits(&io_limits)) { qerror_report(QERR_INVALID_PARAMETER_COMBINATION); return -1; } bs->io_limits = io_limits; bs->slice_time = BLOCK_IO_SLICE_TIME; if (!bs->io_limits_enabled && bdrv_io_limits_enabled(bs)) { bdrv_io_limits_enable(bs); } else if (bs->io_limits_enabled && !bdrv_io_limits_enabled(bs)) { bdrv_io_limits_disable(bs); } else { if (bs->block_timer) { qemu_mod_timer(bs->block_timer, qemu_get_clock_ns(vm_clock)); } } return 0; } int do_drive_del(Monitor *mon, const QDict *qdict, QObject **ret_data) { const char *id = qdict_get_str(qdict, "id"); Loading
blockdev.h +2 −0 Original line number Diff line number Diff line Loading @@ -63,6 +63,8 @@ int do_block_set_passwd(Monitor *mon, const QDict *qdict, QObject **ret_data); int do_change_block(Monitor *mon, const char *device, const char *filename, const char *fmt); int do_drive_del(Monitor *mon, const QDict *qdict, QObject **ret_data); int do_block_set_io_throttle(Monitor *mon, const QDict *qdict, QObject **ret_data); int do_snapshot_blkdev(Monitor *mon, const QDict *qdict, QObject **ret_data); int do_block_resize(Monitor *mon, const QDict *qdict, QObject **ret_data); Loading
hmp-commands.hx +15 −0 Original line number Diff line number Diff line Loading @@ -1206,6 +1206,21 @@ ETEXI .mhandler.cmd_new = do_block_set_passwd, }, STEXI @item block_set_io_throttle @var{device} @var{bps} @var{bps_rd} @var{bps_wr} @var{iops} @var{iops_rd} @var{iops_wr} @findex block_set_io_throttle Change I/O throttle limits for a block drive to @var{bps} @var{bps_rd} @var{bps_wr} @var{iops} @var{iops_rd} @var{iops_wr} ETEXI { .name = "block_set_io_throttle", .args_type = "device:B,bps:l,bps_rd:l,bps_wr:l,iops:l,iops_rd:l,iops_wr:l", .params = "device bps bps_rd bps_wr iops iops_rd iops_wr", .help = "change I/O throttle limits for a block drive", .user_print = monitor_user_noop, .mhandler.cmd_new = do_block_set_io_throttle, }, STEXI @item block_passwd @var{device} @var{password} @findex block_passwd Loading
hmp.c +10 −0 Original line number Diff line number Diff line Loading @@ -216,6 +216,16 @@ void hmp_info_block(Monitor *mon) info->value->inserted->ro, info->value->inserted->drv, info->value->inserted->encrypted); monitor_printf(mon, " bps=%" PRId64 " bps_rd=%" PRId64 " bps_wr=%" PRId64 " iops=%" PRId64 " iops_rd=%" PRId64 " iops_wr=%" PRId64, info->value->inserted->bps, info->value->inserted->bps_rd, info->value->inserted->bps_wr, info->value->inserted->iops, info->value->inserted->iops_rd, info->value->inserted->iops_wr); } else { monitor_printf(mon, " [not inserted]"); } Loading