Re: [Qemu-devel] [PATCH v1] qmp/hmp: add block_set_io_throttle and enhance query_block

2011-08-04 Thread Stefan Hajnoczi
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

2011-08-04 Thread Zhi Yong Wu
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