Re: [Qemu-devel] [PATCH v1] qmp/hmp: add block_set_io_throttle and enhance query_block
On Thu, Aug 4, 2011 at 5:34 AM, Zhi Yong Wu wu...@linux.vnet.ibm.com wrote: @@ -1387,6 +1422,11 @@ void bdrv_set_io_limits(BlockDriverState *bs, { memset(bs-io_limits, 0, sizeof(BlockIOLimit)); bs-io_limits = *io_limits; + if (bdrv_io_limits_enabled(bs)) { + bs-io_limits_enabled = true; + } else { + bs-io_limits_enabled = false; + } Or in one line: bs-io_limits_enabled = bdrv_io_limits_enabled(bs); } /* Recognize floppy formats */ @@ -1621,6 +1661,7 @@ BlockDriverState *bdrv_find(const char *name) return NULL; } +/* disk I/O throttling */ Looks like this should not be here. BlockDriverState *bdrv_next(BlockDriverState *bs) { if (!bs) { @@ -1784,6 +1825,16 @@ static void bdrv_print_dict(QObject *obj, void *opaque) qdict_get_bool(qdict, ro), qdict_get_str(qdict, drv), qdict_get_bool(qdict, encrypted)); + + monitor_printf(mon, bps=% PRId64 bps_rd=% PRId64 + bps_wr=% PRId64 iops=% PRId64 + iops_rd=% PRId64 iops_wr=% PRId64, + qdict_get_int(qdict, bps), + qdict_get_int(qdict, bps_rd), + qdict_get_int(qdict, bps_wr), + qdict_get_int(qdict, iops), + qdict_get_int(qdict, iops_rd), + qdict_get_int(qdict, iops_wr)); } else { monitor_printf(mon, [not inserted]); } @@ -1816,10 +1867,22 @@ void bdrv_info(Monitor *mon, QObject **ret_data) QDict *bs_dict = qobject_to_qdict(bs_obj); obj = qobject_from_jsonf({ 'file': %s, 'ro': %i, 'drv': %s, - 'encrypted': %i }, + 'encrypted': %i, + 'bps': % PRId64 , + 'bps_rd': % PRId64 , + 'bps_wr': % PRId64 , + 'iops': % PRId64 , + 'iops_rd': % PRId64 , + 'iops_wr': % PRId64 }, bs-filename, bs-read_only, bs-drv-format_name, - bdrv_is_encrypted(bs)); + bdrv_is_encrypted(bs), + bs-io_limits.bps[2], + bs-io_limits.bps[0], + bs-io_limits.bps[1], + bs-io_limits.iops[2], + bs-io_limits.iops[0], + bs-io_limits.iops[1]); if (bs-backing_file[0] != '\0') { QDict *qdict = qobject_to_qdict(obj); qdict_put(qdict, backing_file, @@ -2307,7 +2370,7 @@ static bool bdrv_exceed_io_limits(BlockDriverState *bs, int nb_sectors, } /* If a limit was exceeded, immediately queue this request */ - if ((bs-req_from_queue == false) + if (!bs-req_from_queue !QTAILQ_EMPTY(bs-block_queue-requests)) { if (bs-io_limits.bps[BLOCK_IO_LIMIT_TOTAL] || bs-io_limits.bps[is_write] || bs-io_limits.iops[is_write] @@ -2362,14 +2425,14 @@ BlockDriverAIOCB *bdrv_aio_readv(BlockDriverState *bs, int64_t sector_num, trace_bdrv_aio_readv(bs, sector_num, nb_sectors, opaque); if (!drv || bdrv_check_request(bs, sector_num, nb_sectors)) { - if (bdrv_io_limits_enable(bs-io_limits)) { + if (bs-io_limits_enabled) { bs-req_from_queue = false; } return NULL; } /* throttling disk read I/O */ - if (bdrv_io_limits_enable(bs-io_limits)) { + if (bs-io_limits_enabled) { if (bdrv_exceed_io_limits(bs, nb_sectors, false, wait_time)) { ret = qemu_block_queue_enqueue(bs-block_queue, bs, bdrv_aio_readv, sector_num, qiov, nb_sectors, cb, opaque); @@ -2388,14 +2451,14 @@ BlockDriverAIOCB *bdrv_aio_readv(BlockDriverState *bs, int64_t sector_num, bs-rd_bytes += (unsigned) nb_sectors * BDRV_SECTOR_SIZE; bs-rd_ops ++; - if (bdrv_io_limits_enable(bs-io_limits)) { + if (bs-io_limits_enabled) { bs-io_disps.bytes[BLOCK_IO_LIMIT_READ] += (unsigned) nb_sectors * BDRV_SECTOR_SIZE; bs-io_disps.ios[BLOCK_IO_LIMIT_READ]++; } } - if (bdrv_io_limits_enable(bs-io_limits)) { + if (bs-io_limits_enabled) { bs-req_from_queue = false; } @@ -2451,7 +2514,7 @@ BlockDriverAIOCB *bdrv_aio_writev(BlockDriverState *bs, int64_t sector_num, if (!drv || bs-read_only || bdrv_check_request(bs, sector_num, nb_sectors))
Re: [Qemu-devel] [PATCH v1] qmp/hmp: add block_set_io_throttle and enhance query_block
On Thu, Aug 4, 2011 at 9:07 PM, Stefan Hajnoczi stefa...@gmail.com wrote: On Thu, Aug 4, 2011 at 5:34 AM, Zhi Yong Wu wu...@linux.vnet.ibm.com wrote: @@ -1387,6 +1422,11 @@ void bdrv_set_io_limits(BlockDriverState *bs, { memset(bs-io_limits, 0, sizeof(BlockIOLimit)); bs-io_limits = *io_limits; + if (bdrv_io_limits_enabled(bs)) { + bs-io_limits_enabled = true; + } else { + bs-io_limits_enabled = false; + } Or in one line: bs-io_limits_enabled = bdrv_io_limits_enabled(bs); nice. } /* Recognize floppy formats */ @@ -1621,6 +1661,7 @@ BlockDriverState *bdrv_find(const char *name) return NULL; } +/* disk I/O throttling */ Looks like this should not be here.\ Let me check when i will go to office next week. BlockDriverState *bdrv_next(BlockDriverState *bs) { if (!bs) { @@ -1784,6 +1825,16 @@ static void bdrv_print_dict(QObject *obj, void *opaque) qdict_get_bool(qdict, ro), qdict_get_str(qdict, drv), qdict_get_bool(qdict, encrypted)); + + monitor_printf(mon, bps=% PRId64 bps_rd=% PRId64 + bps_wr=% PRId64 iops=% PRId64 + iops_rd=% PRId64 iops_wr=% PRId64, + qdict_get_int(qdict, bps), + qdict_get_int(qdict, bps_rd), + qdict_get_int(qdict, bps_wr), + qdict_get_int(qdict, iops), + qdict_get_int(qdict, iops_rd), + qdict_get_int(qdict, iops_wr)); } else { monitor_printf(mon, [not inserted]); } @@ -1816,10 +1867,22 @@ void bdrv_info(Monitor *mon, QObject **ret_data) QDict *bs_dict = qobject_to_qdict(bs_obj); obj = qobject_from_jsonf({ 'file': %s, 'ro': %i, 'drv': %s, - 'encrypted': %i }, + 'encrypted': %i, + 'bps': % PRId64 , + 'bps_rd': % PRId64 , + 'bps_wr': % PRId64 , + 'iops': % PRId64 , + 'iops_rd': % PRId64 , + 'iops_wr': % PRId64 }, bs-filename, bs-read_only, bs-drv-format_name, - bdrv_is_encrypted(bs)); + bdrv_is_encrypted(bs), + bs-io_limits.bps[2], + bs-io_limits.bps[0], + bs-io_limits.bps[1], + bs-io_limits.iops[2], + bs-io_limits.iops[0], + bs-io_limits.iops[1]); if (bs-backing_file[0] != '\0') { QDict *qdict = qobject_to_qdict(obj); qdict_put(qdict, backing_file, @@ -2307,7 +2370,7 @@ static bool bdrv_exceed_io_limits(BlockDriverState *bs, int nb_sectors, } /* If a limit was exceeded, immediately queue this request */ - if ((bs-req_from_queue == false) + if (!bs-req_from_queue !QTAILQ_EMPTY(bs-block_queue-requests)) { if (bs-io_limits.bps[BLOCK_IO_LIMIT_TOTAL] || bs-io_limits.bps[is_write] || bs-io_limits.iops[is_write] @@ -2362,14 +2425,14 @@ BlockDriverAIOCB *bdrv_aio_readv(BlockDriverState *bs, int64_t sector_num, trace_bdrv_aio_readv(bs, sector_num, nb_sectors, opaque); if (!drv || bdrv_check_request(bs, sector_num, nb_sectors)) { - if (bdrv_io_limits_enable(bs-io_limits)) { + if (bs-io_limits_enabled) { bs-req_from_queue = false; } return NULL; } /* throttling disk read I/O */ - if (bdrv_io_limits_enable(bs-io_limits)) { + if (bs-io_limits_enabled) { if (bdrv_exceed_io_limits(bs, nb_sectors, false, wait_time)) { ret = qemu_block_queue_enqueue(bs-block_queue, bs, bdrv_aio_readv, sector_num, qiov, nb_sectors, cb, opaque); @@ -2388,14 +2451,14 @@ BlockDriverAIOCB *bdrv_aio_readv(BlockDriverState *bs, int64_t sector_num, bs-rd_bytes += (unsigned) nb_sectors * BDRV_SECTOR_SIZE; bs-rd_ops ++; - if (bdrv_io_limits_enable(bs-io_limits)) { + if (bs-io_limits_enabled) { bs-io_disps.bytes[BLOCK_IO_LIMIT_READ] += (unsigned) nb_sectors * BDRV_SECTOR_SIZE; bs-io_disps.ios[BLOCK_IO_LIMIT_READ]++; } } - if (bdrv_io_limits_enable(bs-io_limits)) { + if (bs-io_limits_enabled) { bs-req_from_queue = false; } @@ -2451,7 +2514,7 @@ BlockDriverAIOCB