qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v0] fsdev: QMP interface for throttling


From: Greg Kurz
Subject: Re: [Qemu-devel] [PATCH v0] fsdev: QMP interface for throttling
Date: Tue, 21 Mar 2017 14:38:28 +0100

On Mon, 20 Mar 2017 09:07:20 -0400
Pradeep Jagadeesh <address@hidden> wrote:

> This patchset enables qmp interfaces for the 9pfs 
> devices (fsdev).This provides two interfaces one 
> for querying all the 9pfs devices info. The second one
> to set the IO limits for the required 9pfs device.
> 
> Signed-off-by: Pradeep Jagadeesh <address@hidden>
> ---
>  Makefile                    |   2 +-
>  fsdev/qemu-fsdev-throttle.c | 103 +++++++++++++++++++++++++++
>  fsdev/qemu-fsdev-throttle.h |  14 ++++
>  fsdev/qemu-fsdev.c          |   8 ++-
>  fsdev/qemu-fsdev.h          |   3 +
>  hmp-commands-info.hx        |  14 ++++
>  hmp-commands.hx             |  28 ++++++++
>  hmp.c                       |  70 ++++++++++++++++++
>  hmp.h                       |   3 +
>  hw/9pfs/9p.c                |  39 ++++++++++
>  qapi-schema.json            |   3 +
>  qapi/9pfs.json              | 169 
> ++++++++++++++++++++++++++++++++++++++++++++
>  12 files changed, 454 insertions(+), 2 deletions(-)
>  create mode 100644 qapi/9pfs.json
> 
> diff --git a/Makefile b/Makefile
> index 73e0c12..4f387a1 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -413,7 +413,7 @@ qapi-modules = $(SRC_PATH)/qapi-schema.json 
> $(SRC_PATH)/qapi/common.json \
>                 $(SRC_PATH)/qapi/block.json $(SRC_PATH)/qapi/block-core.json \
>                 $(SRC_PATH)/qapi/event.json $(SRC_PATH)/qapi/introspect.json \
>                 $(SRC_PATH)/qapi/crypto.json $(SRC_PATH)/qapi/rocker.json \
> -               $(SRC_PATH)/qapi/trace.json
> +               $(SRC_PATH)/qapi/trace.json $(SRC_PATH)/qapi/9pfs.json
>  
>  qapi-types.c qapi-types.h :\
>  $(qapi-modules) $(SRC_PATH)/scripts/qapi-types.py $(qapi-py)
> diff --git a/fsdev/qemu-fsdev-throttle.c b/fsdev/qemu-fsdev-throttle.c
> index 7ae4e86..b18d98a 100644
> --- a/fsdev/qemu-fsdev-throttle.c
> +++ b/fsdev/qemu-fsdev-throttle.c
> @@ -29,6 +29,109 @@ static void fsdev_throttle_write_timer_cb(void *opaque)
>      qemu_co_enter_next(&fst->throttled_reqs[true]);
>  }
>  
> +void fsdev_set_io_throttle(FS9PIOThrottle *arg, FsThrottle *fst, Error 
> **errp)
> +{
> +    ThrottleConfig cfg;
> +
> +    throttle_config_init(&cfg);
> +    cfg.buckets[THROTTLE_BPS_TOTAL].avg = arg->bps;
> +    cfg.buckets[THROTTLE_BPS_READ].avg  = arg->bps_rd;
> +    cfg.buckets[THROTTLE_BPS_WRITE].avg = arg->bps_wr;
> +
> +    cfg.buckets[THROTTLE_OPS_TOTAL].avg = arg->iops;
> +    cfg.buckets[THROTTLE_OPS_READ].avg  = arg->iops_rd;
> +    cfg.buckets[THROTTLE_OPS_WRITE].avg = arg->iops_wr;
> +
> +    if (arg->has_bps_max) {
> +        cfg.buckets[THROTTLE_BPS_TOTAL].max = arg->bps_max;
> +    }
> +    if (arg->has_bps_rd_max) {
> +        cfg.buckets[THROTTLE_BPS_READ].max = arg->bps_rd_max;
> +    }
> +    if (arg->has_bps_wr_max) {
> +        cfg.buckets[THROTTLE_BPS_WRITE].max = arg->bps_wr_max;
> +    }
> +    if (arg->has_iops_max) {
> +        cfg.buckets[THROTTLE_OPS_TOTAL].max = arg->iops_max;
> +    }
> +    if (arg->has_iops_rd_max) {
> +        cfg.buckets[THROTTLE_OPS_READ].max = arg->iops_rd_max;
> +    }
> +    if (arg->has_iops_wr_max) {
> +        cfg.buckets[THROTTLE_OPS_WRITE].max = arg->iops_wr_max;
> +    }
> +
> +    if (arg->has_bps_max_length) {
> +        cfg.buckets[THROTTLE_BPS_TOTAL].burst_length = arg->bps_max_length;
> +    }
> +    if (arg->has_bps_rd_max_length) {
> +        cfg.buckets[THROTTLE_BPS_READ].burst_length = arg->bps_rd_max_length;
> +    }
> +    if (arg->has_bps_wr_max_length) {
> +        cfg.buckets[THROTTLE_BPS_WRITE].burst_length = 
> arg->bps_wr_max_length;
> +    }
> +    if (arg->has_iops_max_length) {
> +        cfg.buckets[THROTTLE_OPS_TOTAL].burst_length = arg->iops_max_length;
> +    }
> +    if (arg->has_iops_rd_max_length) {
> +        cfg.buckets[THROTTLE_OPS_READ].burst_length = 
> arg->iops_rd_max_length;
> +    }
> +    if (arg->has_iops_wr_max_length) {
> +        cfg.buckets[THROTTLE_OPS_WRITE].burst_length = 
> arg->iops_wr_max_length;
> +    }
> +
> +    if (arg->has_iops_size) {
> +        cfg.op_size = arg->iops_size;
> +    }
> +
> +    if (!throttle_is_valid(&cfg, errp)) {
> +        goto out;
> +    }
> +
> +    fst->cfg = cfg;
> +    fsdev_throttle_init(fst);
> +
> +out:
> +    return;

It looks like this could be:

    if (throttle_is_valid(&cfg, errp)) {
        fst->cfg = cfg;
        fsdev_throttle_init(fst);
    }

> +

extra empty line

> +}
> +
> +void fsdev_get_io_throttle(FsThrottle *fst, FS9PIOThrottle **fs9pcfg,
> +                           char *fsdevice, Error **errp)
> +{
> +
> +    ThrottleConfig cfg = fst->cfg;
> +    FS9PIOThrottle *fscfg = g_malloc0(sizeof(*fscfg));
> +
> +    fscfg->has_device = true;
> +    fscfg->device = g_strdup(fsdevice);
> +    fscfg->bps = cfg.buckets[THROTTLE_BPS_TOTAL].avg;
> +    fscfg->bps_rd = cfg.buckets[THROTTLE_BPS_READ].avg;
> +    fscfg->bps_wr = cfg.buckets[THROTTLE_BPS_WRITE].avg;
> +
> +    fscfg->iops = cfg.buckets[THROTTLE_OPS_TOTAL].avg;
> +    fscfg->iops_rd = cfg.buckets[THROTTLE_OPS_READ].avg;
> +    fscfg->iops_wr = cfg.buckets[THROTTLE_OPS_WRITE].avg;
> +
> +    fscfg->bps_max = cfg.buckets[THROTTLE_BPS_TOTAL].max;
> +    fscfg->bps_rd_max = cfg.buckets[THROTTLE_BPS_READ].max;
> +    fscfg->bps_wr_max = cfg.buckets[THROTTLE_BPS_WRITE].max;
> +    fscfg->bps_max = cfg.buckets[THROTTLE_OPS_TOTAL].max;
> +    fscfg->iops_rd_max = cfg.buckets[THROTTLE_OPS_READ].max;
> +    fscfg->iops_wr_max = cfg.buckets[THROTTLE_OPS_WRITE].max;
> +
> +    fscfg->bps_max_length = cfg.buckets[THROTTLE_BPS_TOTAL].burst_length;
> +    fscfg->bps_rd_max_length = cfg.buckets[THROTTLE_BPS_READ].burst_length;
> +    fscfg->bps_wr_max_length = cfg.buckets[THROTTLE_BPS_WRITE].burst_length;
> +    fscfg->iops_max_length = cfg.buckets[THROTTLE_OPS_TOTAL].burst_length;
> +    fscfg->iops_rd_max_length = cfg.buckets[THROTTLE_OPS_READ].burst_length;
> +    fscfg->iops_wr_max_length = cfg.buckets[THROTTLE_OPS_WRITE].burst_length;
> +    fscfg->iops_size = cfg.op_size;
> +
> +    *fs9pcfg = fscfg;
> +

extra empty line

> +}
> +
>  void fsdev_throttle_parse_opts(QemuOpts *opts, FsThrottle *fst, Error **errp)
>  {
>      throttle_config_init(&fst->cfg);
> diff --git a/fsdev/qemu-fsdev-throttle.h b/fsdev/qemu-fsdev-throttle.h
> index e418643..9b03f7f 100644
> --- a/fsdev/qemu-fsdev-throttle.h
> +++ b/fsdev/qemu-fsdev-throttle.h
> @@ -20,6 +20,13 @@
>  #include "qemu/coroutine.h"
>  #include "qapi/error.h"
>  #include "qemu/throttle.h"
> +#include "qapi/qmp/types.h"
> +#include "qapi-visit.h"
> +#include "qapi/qmp/qerror.h"
> +#include "qapi/qobject-output-visitor.h"
> +#include "qapi/util.h"
> +#include "qmp-commands.h"
> +
>  
>  typedef struct FsThrottle {
>      ThrottleState ts;
> @@ -28,6 +35,7 @@ typedef struct FsThrottle {
>      CoQueue      throttled_reqs[2];
>  } FsThrottle;
>  
> +

extra empty line

>  void fsdev_throttle_parse_opts(QemuOpts *, FsThrottle *, Error **);
>  
>  void fsdev_throttle_init(FsThrottle *);
> @@ -36,4 +44,10 @@ void coroutine_fn fsdev_co_throttle_request(FsThrottle *, 
> bool ,
>                                              struct iovec *, int);
>  
>  void fsdev_throttle_cleanup(FsThrottle *);
> +
> +void fsdev_set_io_throttle(FS9PIOThrottle *, FsThrottle *, Error **);
> +
> +void fsdev_get_io_throttle(FsThrottle *, FS9PIOThrottle **, char *, Error 
> **);
> +
> +

extra empty lines

>  #endif /* _FSDEV_THROTTLE_H */
> diff --git a/fsdev/qemu-fsdev.c b/fsdev/qemu-fsdev.c
> index 266e442..486b63b 100644
> --- a/fsdev/qemu-fsdev.c
> +++ b/fsdev/qemu-fsdev.c
> @@ -17,9 +17,10 @@
>  #include "qemu/config-file.h"
>  #include "qemu/error-report.h"
>  
> -static QTAILQ_HEAD(FsDriverEntry_head, FsDriverListEntry) fsdriver_entries =
> +static struct FsDriverEntry_head fsdriver_entries =
>      QTAILQ_HEAD_INITIALIZER(fsdriver_entries);
>  
> +

I believe you don't need this...

>  static FsDriverTable FsDrivers[] = {
>      { .name = "local", .ops = &local_ops},
>  #ifdef CONFIG_OPEN_BY_HANDLE
> @@ -98,3 +99,8 @@ FsDriverEntry *get_fsdev_fsentry(char *id)
>      }
>      return NULL;
>  }
> +
> +struct FsDriverEntry_head *get_fsdev_fsentryList(void)
> +{
> +  return &fsdriver_entries;
> +}

... nor this...

> diff --git a/fsdev/qemu-fsdev.h b/fsdev/qemu-fsdev.h
> index 29c9622..92f766d 100644
> --- a/fsdev/qemu-fsdev.h
> +++ b/fsdev/qemu-fsdev.h
> @@ -39,6 +39,9 @@ typedef struct FsDriverListEntry {
>      QTAILQ_ENTRY(FsDriverListEntry) next;
>  } FsDriverListEntry;
>  
> +QTAILQ_HEAD(FsDriverEntry_head, FsDriverListEntry);
> +
> +struct FsDriverEntry_head *get_fsdev_fsentryList(void);

Nor this, if you move qmp_fs9p_set_io_throttle() and 
qmp_query_9pfs_io_throttle()
from hw/9pfs/9p.c to fsdev/fdsdev.c, where they belong (see below).

>  int qemu_fsdev_add(QemuOpts *opts);
>  FsDriverEntry *get_fsdev_fsentry(char *id);
>  extern FileOperations local_ops;
> diff --git a/hmp-commands-info.hx b/hmp-commands-info.hx
> index a53f105..c5b8664 100644
> --- a/hmp-commands-info.hx
> +++ b/hmp-commands-info.hx
> @@ -85,6 +85,20 @@ Show block device statistics.
>  ETEXI
>  
>      {
> +        .name       = "9pthrottle",
> +        .args_type  = "",
> +        .params     = "",
> +        .help       = "show fsdev/9p device throttle information",
> +        .cmd        = hmp_9pfs_get_io_throttle,
> +    },
> +
> +STEXI
> address@hidden info 9p throttle
> address@hidden 9pthrottleinfo
> +Show 9p device throttleinfo.
> +ETEXI
> +
> +    {
>          .name       = "block-jobs",
>          .args_type  = "",
>          .params     = "",
> diff --git a/hmp-commands.hx b/hmp-commands.hx
> index 8819281..e4e3478 100644
> --- a/hmp-commands.hx
> +++ b/hmp-commands.hx
> @@ -1637,6 +1637,34 @@ ETEXI
>      },
>  
>  STEXI
> address@hidden 9p_passwd @var{device} @var{password}
> address@hidden 9p_passwd
> +Set the encrypted device @var{device} password to @var{password}
> +ETEXI
> +
> +    {
> +        .name       = "fs9p_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",
> +        .cmd        = hmp_9pfs_set_io_throttle,
> +    },
> +
> +STEXI
> address@hidden fs9p_set_io_throttle @var{device} @var{bps} @var{bps_rd} 
> @var{bps_wr} @var{iops} @var{iops_rd} @var{iops_wr}
> address@hidden 9pfs_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       = "set_password",
> +        .args_type  = "protocol:s,password:s,connected:s?",
> +        .params     = "protocol password action-if-connected",
> +        .help       = "set spice/vnc password",
> +        .cmd        = hmp_set_password,
> +    },
> +
> +STEXI
>  @item set_password [ vnc | spice ] password [ action-if-connected ]
>  @findex set_password
>  Change spice/vnc password.  Use zero to make the password stay valid
> diff --git a/hmp.c b/hmp.c
> index edb8970..46b8d72 100644
> --- a/hmp.c
> +++ b/hmp.c
> @@ -38,6 +38,7 @@
>  #include "qemu/cutils.h"
>  #include "qemu/error-report.h"
>  #include "hw/intc/intc.h"
> +#include "fsdev/qemu-fsdev-throttle.h"
>  

I guess all the changes in this file should have #ifdef CONFIG_VIRTFS

>  #ifdef CONFIG_SPICE
>  #include <spice/enums.h>
> @@ -1571,6 +1572,75 @@ void hmp_block_set_io_throttle(Monitor *mon, const 
> QDict *qdict)
>      hmp_handle_error(mon, &err);
>  }
>  
> +void hmp_9pfs_set_io_throttle(Monitor *mon, const QDict *qdict)
> +{
> +    Error *err = NULL;
> +    FS9PIOThrottle throttle = {
> +        .device = (char *) qdict_get_str(qdict, "device"),
> +        .bps = qdict_get_int(qdict, "bps"),
> +        .bps_rd = qdict_get_int(qdict, "bps_rd"),
> +        .bps_wr = qdict_get_int(qdict, "bps_wr"),
> +        .iops = qdict_get_int(qdict, "iops"),
> +        .iops_rd = qdict_get_int(qdict, "iops_rd"),
> +        .iops_wr = qdict_get_int(qdict, "iops_wr"),
> +    };
> +
> +    qmp_fs9p_set_io_throttle(&throttle, &err);
> +    hmp_handle_error(mon, &err);
> +}
> +
> +static void print_9pfs_throttle_config(Monitor *mon, FS9PIOThrottle *fscfg,
> +                                       Error *err)
> +{
> +    if (fscfg->bps  || fscfg->bps_rd  || fscfg->bps_wr  ||
> +        fscfg->iops || fscfg->iops_rd || fscfg->iops_wr)
> +    {
> +        monitor_printf(mon, "%s", fscfg->device);
> +        monitor_printf(mon, "    I/O throttling:"
> +                        " bps=%" PRId64
> +                        " bps_rd=%" PRId64  " bps_wr=%" PRId64
> +                        " bps_max=%" PRId64
> +                        " bps_rd_max=%" PRId64
> +                        " bps_wr_max=%" PRId64
> +                        " iops=%" PRId64 " iops_rd=%" PRId64
> +                        " iops_wr=%" PRId64
> +                        " iops_max=%" PRId64
> +                        " iops_rd_max=%" PRId64
> +                        " iops_wr_max=%" PRId64
> +                        " iops_size=%" PRId64,
> +                        fscfg->bps,
> +                        fscfg->bps_rd,
> +                        fscfg->bps_wr,
> +                        fscfg->bps_max,
> +                        fscfg->bps_rd_max,
> +                        fscfg->bps_wr_max,
> +                        fscfg->iops,
> +                        fscfg->iops_rd,
> +                        fscfg->iops_wr,
> +                        fscfg->iops_max,
> +                        fscfg->iops_rd_max,
> +                        fscfg->iops_wr_max,
> +                        fscfg->iops_size);
> +   }
> +   hmp_handle_error(mon, &err);
> +}
> +
> +void hmp_9pfs_get_io_throttle(Monitor *mon, const QDict *qdict)
> +{
> +    Error *err = NULL;
> +    FS9PIOThrottleList *fs9p_list, *info;
> +    fs9p_list = qmp_query_9pfs_io_throttle(&err);
> +
> +    for (info = fs9p_list; info; info = info->next) {
> +        if (info != fs9p_list) {
> +            monitor_printf(mon, "\n");
> +        }
> +        print_9pfs_throttle_config(mon, info->value, err);
> +        qapi_free_FS9PIOThrottle(info->value);
> +    }
> +    qapi_free_FS9PIOThrottleList(fs9p_list);
> +}
> +
>  void hmp_block_stream(Monitor *mon, const QDict *qdict)
>  {
>      Error *error = NULL;
> diff --git a/hmp.h b/hmp.h
> index 799fd37..728ef73 100644
> --- a/hmp.h
> +++ b/hmp.h
> @@ -56,6 +56,7 @@ void hmp_system_wakeup(Monitor *mon, const QDict *qdict);
>  void hmp_nmi(Monitor *mon, const QDict *qdict);
>  void hmp_set_link(Monitor *mon, const QDict *qdict);
>  void hmp_block_passwd(Monitor *mon, const QDict *qdict);
> +void hmp_9p_passwd(Monitor *mon, const QDict *qdict);
>  void hmp_balloon(Monitor *mon, const QDict *qdict);
>  void hmp_block_resize(Monitor *mon, const QDict *qdict);
>  void hmp_snapshot_blkdev(Monitor *mon, const QDict *qdict);
> @@ -77,6 +78,8 @@ void hmp_set_password(Monitor *mon, const QDict *qdict);
>  void hmp_expire_password(Monitor *mon, const QDict *qdict);
>  void hmp_eject(Monitor *mon, const QDict *qdict);
>  void hmp_change(Monitor *mon, const QDict *qdict);
> +void hmp_9pfs_set_io_throttle(Monitor *mon, const QDict *qdict);
> +void hmp_9pfs_get_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_job_set_speed(Monitor *mon, const QDict *qdict);
> diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c
> index 76c9247..46393be 100644
> --- a/hw/9pfs/9p.c
> +++ b/hw/9pfs/9p.c
> @@ -3451,6 +3451,45 @@ void pdu_submit(V9fsPDU *pdu)
>      qemu_coroutine_enter(co);
>  }
>  
> +void qmp_fs9p_set_io_throttle(FS9PIOThrottle *arg, Error **errp)
> +{
> +
> +    FsDriverEntry *fse;
> +
> +    fse = get_fsdev_fsentry(arg->has_device ? arg->device : NULL);
> +    if (!fse) {
> +        return;
> +    }
> +
> +    fsdev_set_io_throttle(arg, &fse->fst, errp);
> +}
> +
> +FS9PIOThrottleList *qmp_query_9pfs_io_throttle(Error **errp)
> +{
> +    FS9PIOThrottleList *head = NULL, **p_next = &head;
> +    struct FsDriverListEntry *fsle;
> +    struct FsDriverEntry_head *fsdev_entries;
> +    Error *local_err = NULL;
> +
> +    fsdev_entries = get_fsdev_fsentryList();
> +
> +    QTAILQ_FOREACH(fsle, fsdev_entries, next) {
> +        FS9PIOThrottleList *fscfg = g_malloc0(sizeof(*fscfg));
> +        fsdev_get_io_throttle(&fsle->fse.fst, &fscfg->value,
> +                            fsle->fse.fsdev_id, &local_err);
> +        if (local_err) {
> +            error_propagate(errp, local_err);
> +            g_free(fscfg);
> +            qapi_free_FS9PIOThrottleList(head);
> +            return NULL;
> +        }
> +
> +        *p_next = fscfg;
> +        p_next = &fscfg->next;
> +    }
> +    return head;
> +}
> +

These two functions only deal with fsdev: they shouldn't sit in the 9p code,
but rather in fsdev/qemu-fsdev.c... and then you don't need to export fsdev
internals as suggested above.

>  /* Returns 0 on success, 1 on failure. */
>  int v9fs_device_realize_common(V9fsState *s, Error **errp)
>  {
> diff --git a/qapi-schema.json b/qapi-schema.json
> index 68a4327..b7cb84a 100644
> --- a/qapi-schema.json
> +++ b/qapi-schema.json
> @@ -81,6 +81,9 @@
>  # QAPI block definitions
>  { 'include': 'qapi/block.json' }
>  
> +# QAPI 9pfs definitions
> +{ 'include': 'qapi/9pfs.json' }
> +
>  # QAPI event definitions
>  { 'include': 'qapi/event.json' }
>  
> diff --git a/qapi/9pfs.json b/qapi/9pfs.json
> new file mode 100644
> index 0000000..c068474
> --- /dev/null
> +++ b/qapi/9pfs.json
> @@ -0,0 +1,169 @@
> +# -*- Mode: Python -*-
> +
> +##
> +# == QAPI 9p definitions
> +##
> +
> +# QAPI common definitions
> +{ 'include': 'common.json' }
> +
> +##
> +# @fs9p_set_io_throttle:
> +#
> +# Change I/O limits for a 9p/fsdev device.
> +#
> +# Since QEMU 2.9, I/0 limits can be enabled on each  fsdev(9pfs) device
> +#
> +# I/O limits can be disabled by setting all of them to 0.
> +#
> +# Returns: Nothing on success
> +#          If @device is not a valid 9p device, DeviceNotFound
> +#
> +# Since: 2:10
> +#
> +# Example:
> +#
> +# -> { "execute": "fs9p_set_io_throttle",
> +#      "arguments": { "device": "ide0-1-0",
> +#                     "bps": 1000000,
> +#                     "bps_rd": 0,
> +#                     "bps_wr": 0,
> +#                     "iops": 0,
> +#                     "iops_rd": 0,
> +#                     "iops_wr": 0,
> +#                     "bps_max": 8000000,
> +#                     "bps_rd_max": 0,
> +#                     "bps_wr_max": 0,
> +#                     "iops_max": 0,
> +#                     "iops_rd_max": 0,
> +#                     "iops_wr_max": 0,
> +#                     "bps_max_length": 60,
> +#                     "iops_size": 0 } }
> +# <- { "returns": {} }
> +##
> +{ 'command': 'fs9p_set_io_throttle', 'boxed': true,
> +  'data': 'FS9PIOThrottle' }
> +##
> +# @FS9PIOThrottle:
> +#
> +# A set of parameters describing block
> +#
> +# @device: Block device name
> +#
> +# @bps: total throughput limit in bytes per second
> +#
> +# @bps_rd: read throughput limit in bytes per second
> +#
> +# @bps_wr: write throughput limit in bytes per second
> +#
> +# @iops: total I/O operations per second
> +#
> +# @iops_rd: read I/O operations per second
> +#
> +# @iops_wr: write I/O operations per second
> +#
> +# @bps_max: total throughput limit during bursts,
> +#                     in bytes (Since 1.7)
> +#
> +# @bps_rd_max: read throughput limit during bursts,
> +#                        in bytes (Since 1.7)
> +#
> +# @bps_wr_max: write throughput limit during bursts,
> +#                        in bytes (Since 1.7)
> +#
> +# @iops_max: total I/O operations per second during bursts,
> +#                      in bytes (Since 1.7)
> +#
> +# @iops_rd_max: read I/O operations per second during bursts,
> +#                         in bytes (Since 1.7)
> +#
> +# @iops_wr_max: write I/O operations per second during bursts,
> +#                         in bytes (Since 1.7)
> +#
> +# @bps_max_length: maximum length of the @bps_max burst
> +#                            period, in seconds. It must only
> +#                            be set if @bps_max is set as well.
> +#                            Defaults to 1. (Since 2.6)
> +#
> +# @bps_rd_max_length: maximum length of the @bps_rd_max
> +#                               burst period, in seconds. It must only
> +#                               be set if @bps_rd_max is set as well.
> +#                               Defaults to 1. (Since 2.6)
> +#
> +# @bps_wr_max_length: maximum length of the @bps_wr_max
> +#                               burst period, in seconds. It must only
> +#                               be set if @bps_wr_max is set as well.
> +#                               Defaults to 1. (Since 2.6)
> +#
> +# @iops_max_length: maximum length of the @iops burst
> +#                             period, in seconds. It must only
> +#                             be set if @iops_max is set as well.
> +#                             Defaults to 1. (Since 2.6)
> +#
> +# @iops_rd_max_length: maximum length of the @iops_rd_max
> +#                                burst period, in seconds. It must only
> +#                                be set if @iops_rd_max is set as well.
> +#                                Defaults to 1. (Since 2.6)
> +#
> +# @iops_wr_max_length: maximum length of the @iops_wr_max
> +#                                burst period, in seconds. It must only
> +#                                be set if @iops_wr_max is set as well.
> +#                                Defaults to 1. (Since 2.6)
> +#
> +# @iops_size: an I/O size in bytes (Since 1.7)
> +#
> +#
> +# Since: 2.10
> +##
> +{ 'struct': 'FS9PIOThrottle',
> +  'data': { '*device': 'str', 'bps': 'int', 'bps_rd': 'int',
> +            'bps_wr': 'int', 'iops': 'int', 'iops_rd': 'int', 'iops_wr': 
> 'int',
> +            '*bps_max': 'int', '*bps_rd_max': 'int',
> +            '*bps_wr_max': 'int', '*iops_max': 'int',
> +            '*iops_rd_max': 'int', '*iops_wr_max': 'int',
> +            '*bps_max_length': 'int', '*bps_rd_max_length': 'int',
> +            '*bps_wr_max_length': 'int', '*iops_max_length': 'int',
> +            '*iops_rd_max_length': 'int', '*iops_wr_max_length': 'int',
> +            '*iops_size': 'int' } }
> +
> +##
> +# @query-9pfs-io-throttle:
> +#
> +# Return a list of information about each iothread
> +#
> +# Returns: @FS9PIOIOThrottle
> +#
> +# Since: 2.10
> +#
> +# Example:
> +#
> +# -> { "Execute": "query-9pfs-io-throttle" }
> +# <- { "returns" : [
> +#          {
> +#             "device": "ide0-hd0",
> +#              "bps":1000000,
> +#              "bps_rd":0,
> +#              "bps_wr":0,
> +#              "iops":1000000,
> +#              "iops_rd":0,
> +#              "iops_wr":0,
> +#              "bps_max": 8000000,
> +#              "bps_rd_max": 0,
> +#              "bps_wr_max": 0,
> +#              "iops_max": 0,
> +#              "iops_rd_max": 0,
> +#              "iops_wr_max": 0,
> +#              "bps_max_length": 0,
> +#              "bps_rd_max_length": 0,
> +#              "bps_wr_max_length": 0,
> +#              "iops_max_length": 0,
> +#              "iops_rd_max_length": 0,
> +#              "iops_wr_max_length": 0,
> +#              "iops_size": 0,
> +#            }
> +#          ]
> +#      }
> +#
> +##
> +{ 'command': 'query-9pfs-io-throttle', 'returns': [ 'FS9PIOThrottle' ] }
> +

Attachment: pgpRL6xKCPXs_.pgp
Description: OpenPGP digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]