Commit 727f005e authored by Zhi Yong Wu's avatar Zhi Yong Wu Committed by Kevin Wolf
Browse files

hmp/qmp: add block_set_io_throttle

parent 98f90dba
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -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 */
+59 −0
Original line number Diff line number Diff line
@@ -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");
+2 −0
Original line number Diff line number Diff line
@@ -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);

+15 −0
Original line number Diff line number Diff line
@@ -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
+10 −0
Original line number Diff line number Diff line
@@ -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