From nobody Fri May 3 08:21:45 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1488275312169364.2330639417886; Tue, 28 Feb 2017 01:48:32 -0800 (PST) Received: from localhost ([::1]:59747 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cieOU-0005WC-RR for importer@patchew.org; Tue, 28 Feb 2017 04:48:30 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53615) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cieMd-0004NV-Ag for qemu-devel@nongnu.org; Tue, 28 Feb 2017 04:46:36 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cieMY-0005vt-J7 for qemu-devel@nongnu.org; Tue, 28 Feb 2017 04:46:35 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:41105 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cieMY-0005vh-DP for qemu-devel@nongnu.org; Tue, 28 Feb 2017 04:46:30 -0500 Received: from pps.filterd (m0098417.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.20/8.16.0.20) with SMTP id v1S9hofO111903 for ; Tue, 28 Feb 2017 04:46:29 -0500 Received: from e06smtp15.uk.ibm.com (e06smtp15.uk.ibm.com [195.75.94.111]) by mx0a-001b2d01.pphosted.com with ESMTP id 28vyqf1mra-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Tue, 28 Feb 2017 04:46:29 -0500 Received: from localhost by e06smtp15.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 28 Feb 2017 09:46:27 -0000 Received: from d06dlp01.portsmouth.uk.ibm.com (9.149.20.13) by e06smtp15.uk.ibm.com (192.168.101.145) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Tue, 28 Feb 2017 09:46:24 -0000 Received: from b06cxnps3075.portsmouth.uk.ibm.com (d06relay10.portsmouth.uk.ibm.com [9.149.109.195]) by d06dlp01.portsmouth.uk.ibm.com (Postfix) with ESMTP id 753B117D805F; Tue, 28 Feb 2017 09:49:37 +0000 (GMT) Received: from d06av22.portsmouth.uk.ibm.com (d06av22.portsmouth.uk.ibm.com [9.149.105.58]) by b06cxnps3075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id v1S9kOEB7864732; Tue, 28 Feb 2017 09:46:24 GMT Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id DE5A34C05A; Tue, 28 Feb 2017 09:46:10 +0000 (GMT) Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id CD5244C059; Tue, 28 Feb 2017 09:46:10 +0000 (GMT) Received: from smtp.lab.toulouse-stg.fr.ibm.com (unknown [9.101.4.1]) by d06av22.portsmouth.uk.ibm.com (Postfix) with ESMTP; Tue, 28 Feb 2017 09:46:10 +0000 (GMT) Received: from localhost.localdomain (icon-9-164-183-34.megacenter.de.ibm.com [9.164.183.34]) by smtp.lab.toulouse-stg.fr.ibm.com (Postfix) with ESMTP id ABF08220748; Tue, 28 Feb 2017 10:46:22 +0100 (CET) From: Greg Kurz To: qemu-devel@nongnu.org Date: Tue, 28 Feb 2017 10:46:14 +0100 X-Mailer: git-send-email 2.7.4 In-Reply-To: <1488275176-16613-1-git-send-email-groug@kaod.org> References: <1488275176-16613-1-git-send-email-groug@kaod.org> X-TM-AS-GCONF: 00 X-Content-Scanned: Fidelis XPS MAILER x-cbid: 17022809-0020-0000-0000-000003104A72 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17022809-0021-0000-0000-0000408E1171 Message-Id: <1488275176-16613-2-git-send-email-groug@kaod.org> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2017-02-28_07:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=13 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1612050000 definitions=main-1702280090 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [generic] [fuzzy] X-Received-From: 148.163.158.5 Subject: [Qemu-devel] [PULL 1/3] 9pfs: fix v9fs_lock error case X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Maydell , Paolo Bonzini , "Aneesh Kumar K.V" , Greg Kurz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Paolo Bonzini In this case, we are marshaling an error status instead of the errno value. Reorganize the out and out_nofid labels to look like all the other cases. Coverity reports this because the "err =3D -ENOENT" and "err =3D -EINVAL" assignments above are dead, overwritten by the call to pdu_marshal. (Coverity issues CID1348512 and CID1348513) Signed-off-by: Paolo Bonzini (also open-coded the success path since locking is a nop for us, Greg Kurz) Signed-off-by: Greg Kurz --- hw/9pfs/9p.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c index 3af1c93dc87d..d99abc46025e 100644 --- a/hw/9pfs/9p.c +++ b/hw/9pfs/9p.c @@ -3010,7 +3010,6 @@ out_nofid: */ static void coroutine_fn v9fs_lock(void *opaque) { - int8_t status; V9fsFlock flock; size_t offset =3D 7; struct stat stbuf; @@ -3018,7 +3017,6 @@ static void coroutine_fn v9fs_lock(void *opaque) int32_t fid, err =3D 0; V9fsPDU *pdu =3D opaque; =20 - status =3D P9_LOCK_ERROR; v9fs_string_init(&flock.client_id); err =3D pdu_unmarshal(pdu, offset, "dbdqqds", &fid, &flock.type, &flock.flags, &flock.start, &flock.length, @@ -3044,15 +3042,15 @@ static void coroutine_fn v9fs_lock(void *opaque) if (err < 0) { goto out; } - status =3D P9_LOCK_SUCCESS; + err =3D pdu_marshal(pdu, offset, "b", P9_LOCK_SUCCESS); + if (err < 0) { + goto out; + } + err +=3D offset; + trace_v9fs_lock_return(pdu->tag, pdu->id, P9_LOCK_SUCCESS); out: put_fid(pdu, fidp); out_nofid: - err =3D pdu_marshal(pdu, offset, "b", status); - if (err > 0) { - err +=3D offset; - } - trace_v9fs_lock_return(pdu->tag, pdu->id, status); pdu_complete(pdu, err); v9fs_string_free(&flock.client_id); } --=20 2.7.4 From nobody Fri May 3 08:21:45 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1488275496077656.0277443080802; Tue, 28 Feb 2017 01:51:36 -0800 (PST) Received: from localhost ([::1]:59763 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cieRS-0007fc-MJ for importer@patchew.org; Tue, 28 Feb 2017 04:51:34 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53639) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cieMh-0004Oj-HB for qemu-devel@nongnu.org; Tue, 28 Feb 2017 04:46:41 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cieMc-0005wR-BP for qemu-devel@nongnu.org; Tue, 28 Feb 2017 04:46:39 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:39916) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cieMb-0005wJ-WA for qemu-devel@nongnu.org; Tue, 28 Feb 2017 04:46:34 -0500 Received: from pps.filterd (m0098396.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.20/8.16.0.20) with SMTP id v1S9i0aO018111 for ; Tue, 28 Feb 2017 04:46:32 -0500 Received: from e06smtp14.uk.ibm.com (e06smtp14.uk.ibm.com [195.75.94.110]) by mx0a-001b2d01.pphosted.com with ESMTP id 28vm1wtegp-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Tue, 28 Feb 2017 04:46:32 -0500 Received: from localhost by e06smtp14.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 28 Feb 2017 09:46:29 -0000 Received: from d06dlp02.portsmouth.uk.ibm.com (9.149.20.14) by e06smtp14.uk.ibm.com (192.168.101.144) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Tue, 28 Feb 2017 09:46:26 -0000 Received: from b06cxnps3075.portsmouth.uk.ibm.com (d06relay10.portsmouth.uk.ibm.com [9.149.109.195]) by d06dlp02.portsmouth.uk.ibm.com (Postfix) with ESMTP id 8D49B2190019; Tue, 28 Feb 2017 09:45:26 +0000 (GMT) Received: from d06av24.portsmouth.uk.ibm.com (mk.ibm.com [9.149.105.60]) by b06cxnps3075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id v1S9kPmO60489774; Tue, 28 Feb 2017 09:46:25 GMT Received: from d06av24.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4F4614204B; Tue, 28 Feb 2017 09:46:20 +0000 (GMT) Received: from d06av24.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 113E142041; Tue, 28 Feb 2017 09:46:20 +0000 (GMT) Received: from smtp.lab.toulouse-stg.fr.ibm.com (unknown [9.101.4.1]) by d06av24.portsmouth.uk.ibm.com (Postfix) with ESMTP; Tue, 28 Feb 2017 09:46:20 +0000 (GMT) Received: from localhost.localdomain (icon-9-164-183-34.megacenter.de.ibm.com [9.164.183.34]) by smtp.lab.toulouse-stg.fr.ibm.com (Postfix) with ESMTP id 0A53A220020; Tue, 28 Feb 2017 10:46:23 +0100 (CET) From: Greg Kurz To: qemu-devel@nongnu.org Date: Tue, 28 Feb 2017 10:46:15 +0100 X-Mailer: git-send-email 2.7.4 In-Reply-To: <1488275176-16613-1-git-send-email-groug@kaod.org> References: <1488275176-16613-1-git-send-email-groug@kaod.org> X-TM-AS-GCONF: 00 X-Content-Scanned: Fidelis XPS MAILER x-cbid: 17022809-0016-0000-0000-000004474385 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17022809-0017-0000-0000-000026995DEA Message-Id: <1488275176-16613-3-git-send-email-groug@kaod.org> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2017-02-28_07:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=13 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1612050000 definitions=main-1702280090 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [generic] [fuzzy] X-Received-From: 148.163.156.1 Subject: [Qemu-devel] [PULL 2/3] fsdev: add IO throttle support to fsdev devices X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Pradeep Jagadeesh , Peter Maydell , "Aneesh Kumar K.V" , Greg Kurz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Pradeep Jagadeesh This patchset adds the throttle support for the 9p-local driver. For now this functionality can be enabled only through qemu cli options. QMP interface and support to other drivers need further extensions. To make it simple for other 9p drivers, the throttle code has been put in separate files. Signed-off-by: Pradeep Jagadeesh Reviewed-by: Alberto Garcia (pass extra NULL CoMutex * argument to qemu_co_queue_wait(), added options to qemu-options.hx, Greg Kurz) Signed-off-by: Greg Kurz --- fsdev/Makefile.objs | 2 +- fsdev/file-op-9p.h | 3 ++ fsdev/qemu-fsdev-opts.c | 77 ++++++++++++++++++++++++++++- fsdev/qemu-fsdev-throttle.c | 118 ++++++++++++++++++++++++++++++++++++++++= ++++ fsdev/qemu-fsdev-throttle.h | 39 +++++++++++++++ hw/9pfs/9p-local.c | 8 +++ hw/9pfs/9p.c | 5 ++ hw/9pfs/cofile.c | 2 + qemu-options.hx | 7 ++- 9 files changed, 258 insertions(+), 3 deletions(-) create mode 100644 fsdev/qemu-fsdev-throttle.c create mode 100644 fsdev/qemu-fsdev-throttle.h diff --git a/fsdev/Makefile.objs b/fsdev/Makefile.objs index 1b120a4a7d47..659df6e18767 100644 --- a/fsdev/Makefile.objs +++ b/fsdev/Makefile.objs @@ -5,7 +5,7 @@ common-obj-y =3D qemu-fsdev.o 9p-marshal.o 9p-iov-marshal.o else common-obj-y =3D qemu-fsdev-dummy.o endif -common-obj-y +=3D qemu-fsdev-opts.o +common-obj-y +=3D qemu-fsdev-opts.o qemu-fsdev-throttle.o =20 # Toplevel always builds this; targets without virtio will put it in # common-obj-y diff --git a/fsdev/file-op-9p.h b/fsdev/file-op-9p.h index a56dc8488dfc..0844a403dcd4 100644 --- a/fsdev/file-op-9p.h +++ b/fsdev/file-op-9p.h @@ -17,6 +17,7 @@ #include #include #include +#include "qemu-fsdev-throttle.h" =20 #define SM_LOCAL_MODE_BITS 0600 #define SM_LOCAL_DIR_MODE_BITS 0700 @@ -74,6 +75,7 @@ typedef struct FsDriverEntry { char *path; int export_flags; FileOperations *ops; + FsThrottle fst; } FsDriverEntry; =20 typedef struct FsContext @@ -83,6 +85,7 @@ typedef struct FsContext int export_flags; struct xattr_operations **xops; struct extended_ops exops; + FsThrottle *fst; /* fs driver specific data */ void *private; } FsContext; diff --git a/fsdev/qemu-fsdev-opts.c b/fsdev/qemu-fsdev-opts.c index 1dd8c7a24c9c..385423f02db6 100644 --- a/fsdev/qemu-fsdev-opts.c +++ b/fsdev/qemu-fsdev-opts.c @@ -37,8 +37,83 @@ static QemuOptsList qemu_fsdev_opts =3D { }, { .name =3D "sock_fd", .type =3D QEMU_OPT_NUMBER, + }, { + .name =3D "throttling.iops-total", + .type =3D QEMU_OPT_NUMBER, + .help =3D "limit total I/O operations per second", + }, { + .name =3D "throttling.iops-read", + .type =3D QEMU_OPT_NUMBER, + .help =3D "limit read operations per second", + }, { + .name =3D "throttling.iops-write", + .type =3D QEMU_OPT_NUMBER, + .help =3D "limit write operations per second", + }, { + .name =3D "throttling.bps-total", + .type =3D QEMU_OPT_NUMBER, + .help =3D "limit total bytes per second", + }, { + .name =3D "throttling.bps-read", + .type =3D QEMU_OPT_NUMBER, + .help =3D "limit read bytes per second", + }, { + .name =3D "throttling.bps-write", + .type =3D QEMU_OPT_NUMBER, + .help =3D "limit write bytes per second", + }, { + .name =3D "throttling.iops-total-max", + .type =3D QEMU_OPT_NUMBER, + .help =3D "I/O operations burst", + }, { + .name =3D "throttling.iops-read-max", + .type =3D QEMU_OPT_NUMBER, + .help =3D "I/O operations read burst", + }, { + .name =3D "throttling.iops-write-max", + .type =3D QEMU_OPT_NUMBER, + .help =3D "I/O operations write burst", + }, { + .name =3D "throttling.bps-total-max", + .type =3D QEMU_OPT_NUMBER, + .help =3D "total bytes burst", + }, { + .name =3D "throttling.bps-read-max", + .type =3D QEMU_OPT_NUMBER, + .help =3D "total bytes read burst", + }, { + .name =3D "throttling.bps-write-max", + .type =3D QEMU_OPT_NUMBER, + .help =3D "total bytes write burst", + }, { + .name =3D "throttling.iops-total-max-length", + .type =3D QEMU_OPT_NUMBER, + .help =3D "length of the iops-total-max burst period, in secon= ds", + }, { + .name =3D "throttling.iops-read-max-length", + .type =3D QEMU_OPT_NUMBER, + .help =3D "length of the iops-read-max burst period, in second= s", + }, { + .name =3D "throttling.iops-write-max-length", + .type =3D QEMU_OPT_NUMBER, + .help =3D "length of the iops-write-max burst period, in secon= ds", + }, { + .name =3D "throttling.bps-total-max-length", + .type =3D QEMU_OPT_NUMBER, + .help =3D "length of the bps-total-max burst period, in second= s", + }, { + .name =3D "throttling.bps-read-max-length", + .type =3D QEMU_OPT_NUMBER, + .help =3D "length of the bps-read-max burst period, in seconds= ", + }, { + .name =3D "throttling.bps-write-max-length", + .type =3D QEMU_OPT_NUMBER, + .help =3D "length of the bps-write-max burst period, in second= s", + }, { + .name =3D "throttling.iops-size", + .type =3D QEMU_OPT_NUMBER, + .help =3D "when limiting by iops max size of an I/O in bytes", }, - { /*End of list */ } }, }; diff --git a/fsdev/qemu-fsdev-throttle.c b/fsdev/qemu-fsdev-throttle.c new file mode 100644 index 000000000000..7ae4e866461b --- /dev/null +++ b/fsdev/qemu-fsdev-throttle.c @@ -0,0 +1,118 @@ +/* + * Fsdev Throttle + * + * Copyright (C) 2016 Huawei Technologies Duesseldorf GmbH + * + * Author: Pradeep Jagadeesh + * + * This work is licensed under the terms of the GNU GPL, version 2 or + * (at your option) any later version. + * + * See the COPYING file in the top-level directory for details. + * + */ + +#include "qemu/osdep.h" +#include "qemu/error-report.h" +#include "qemu-fsdev-throttle.h" +#include "qemu/iov.h" + +static void fsdev_throttle_read_timer_cb(void *opaque) +{ + FsThrottle *fst =3D opaque; + qemu_co_enter_next(&fst->throttled_reqs[false]); +} + +static void fsdev_throttle_write_timer_cb(void *opaque) +{ + FsThrottle *fst =3D opaque; + qemu_co_enter_next(&fst->throttled_reqs[true]); +} + +void fsdev_throttle_parse_opts(QemuOpts *opts, FsThrottle *fst, Error **er= rp) +{ + throttle_config_init(&fst->cfg); + fst->cfg.buckets[THROTTLE_BPS_TOTAL].avg =3D + qemu_opt_get_number(opts, "throttling.bps-total", 0); + fst->cfg.buckets[THROTTLE_BPS_READ].avg =3D + qemu_opt_get_number(opts, "throttling.bps-read", 0); + fst->cfg.buckets[THROTTLE_BPS_WRITE].avg =3D + qemu_opt_get_number(opts, "throttling.bps-write", 0); + fst->cfg.buckets[THROTTLE_OPS_TOTAL].avg =3D + qemu_opt_get_number(opts, "throttling.iops-total", 0); + fst->cfg.buckets[THROTTLE_OPS_READ].avg =3D + qemu_opt_get_number(opts, "throttling.iops-read", 0); + fst->cfg.buckets[THROTTLE_OPS_WRITE].avg =3D + qemu_opt_get_number(opts, "throttling.iops-write", 0); + + fst->cfg.buckets[THROTTLE_BPS_TOTAL].max =3D + qemu_opt_get_number(opts, "throttling.bps-total-max", 0); + fst->cfg.buckets[THROTTLE_BPS_READ].max =3D + qemu_opt_get_number(opts, "throttling.bps-read-max", 0); + fst->cfg.buckets[THROTTLE_BPS_WRITE].max =3D + qemu_opt_get_number(opts, "throttling.bps-write-max", 0); + fst->cfg.buckets[THROTTLE_OPS_TOTAL].max =3D + qemu_opt_get_number(opts, "throttling.iops-total-max", 0); + fst->cfg.buckets[THROTTLE_OPS_READ].max =3D + qemu_opt_get_number(opts, "throttling.iops-read-max", 0); + fst->cfg.buckets[THROTTLE_OPS_WRITE].max =3D + qemu_opt_get_number(opts, "throttling.iops-write-max", 0); + + fst->cfg.buckets[THROTTLE_BPS_TOTAL].burst_length =3D + qemu_opt_get_number(opts, "throttling.bps-total-max-length", 1); + fst->cfg.buckets[THROTTLE_BPS_READ].burst_length =3D + qemu_opt_get_number(opts, "throttling.bps-read-max-length", 1); + fst->cfg.buckets[THROTTLE_BPS_WRITE].burst_length =3D + qemu_opt_get_number(opts, "throttling.bps-write-max-length", 1); + fst->cfg.buckets[THROTTLE_OPS_TOTAL].burst_length =3D + qemu_opt_get_number(opts, "throttling.iops-total-max-length", 1); + fst->cfg.buckets[THROTTLE_OPS_READ].burst_length =3D + qemu_opt_get_number(opts, "throttling.iops-read-max-length", 1); + fst->cfg.buckets[THROTTLE_OPS_WRITE].burst_length =3D + qemu_opt_get_number(opts, "throttling.iops-write-max-length", 1); + fst->cfg.op_size =3D + qemu_opt_get_number(opts, "throttling.iops-size", 0); + + throttle_is_valid(&fst->cfg, errp); +} + +void fsdev_throttle_init(FsThrottle *fst) +{ + if (throttle_enabled(&fst->cfg)) { + throttle_init(&fst->ts); + throttle_timers_init(&fst->tt, + qemu_get_aio_context(), + QEMU_CLOCK_REALTIME, + fsdev_throttle_read_timer_cb, + fsdev_throttle_write_timer_cb, + fst); + throttle_config(&fst->ts, &fst->tt, &fst->cfg); + qemu_co_queue_init(&fst->throttled_reqs[0]); + qemu_co_queue_init(&fst->throttled_reqs[1]); + } +} + +void coroutine_fn fsdev_co_throttle_request(FsThrottle *fst, bool is_write, + struct iovec *iov, int iovcnt) +{ + if (throttle_enabled(&fst->cfg)) { + if (throttle_schedule_timer(&fst->ts, &fst->tt, is_write) || + !qemu_co_queue_empty(&fst->throttled_reqs[is_write])) { + qemu_co_queue_wait(&fst->throttled_reqs[is_write], NULL); + } + + throttle_account(&fst->ts, is_write, iov_size(iov, iovcnt)); + + if (!qemu_co_queue_empty(&fst->throttled_reqs[is_write]) && + !throttle_schedule_timer(&fst->ts, &fst->tt, is_write)) { + qemu_co_queue_next(&fst->throttled_reqs[is_write]); + } + } +} + +void fsdev_throttle_cleanup(FsThrottle *fst) +{ + if (throttle_enabled(&fst->cfg)) { + throttle_timers_destroy(&fst->tt); + } +} diff --git a/fsdev/qemu-fsdev-throttle.h b/fsdev/qemu-fsdev-throttle.h new file mode 100644 index 000000000000..e418643ccbea --- /dev/null +++ b/fsdev/qemu-fsdev-throttle.h @@ -0,0 +1,39 @@ +/* + * Fsdev Throttle + * + * Copyright (C) 2016 Huawei Technologies Duesseldorf GmbH + * + * Author: Pradeep Jagadeesh + * + * This work is licensed under the terms of the GNU GPL, version 2 or + * (at your option) any later version. + * + * See the COPYING file in the top-level directory for details. + * + */ + +#ifndef _FSDEV_THROTTLE_H +#define _FSDEV_THROTTLE_H + +#include "block/aio.h" +#include "qemu/main-loop.h" +#include "qemu/coroutine.h" +#include "qapi/error.h" +#include "qemu/throttle.h" + +typedef struct FsThrottle { + ThrottleState ts; + ThrottleTimers tt; + ThrottleConfig cfg; + CoQueue throttled_reqs[2]; +} FsThrottle; + +void fsdev_throttle_parse_opts(QemuOpts *, FsThrottle *, Error **); + +void fsdev_throttle_init(FsThrottle *); + +void coroutine_fn fsdev_co_throttle_request(FsThrottle *, bool , + struct iovec *, int); + +void fsdev_throttle_cleanup(FsThrottle *); +#endif /* _FSDEV_THROTTLE_H */ diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c index 7de07e1ba67f..2369b918aa3f 100644 --- a/hw/9pfs/9p-local.c +++ b/hw/9pfs/9p-local.c @@ -1208,6 +1208,7 @@ static int local_parse_opts(QemuOpts *opts, struct Fs= DriverEntry *fse) { const char *sec_model =3D qemu_opt_get(opts, "security_model"); const char *path =3D qemu_opt_get(opts, "path"); + Error *err =3D NULL; =20 if (!sec_model) { error_report("Security model not specified, local fs needs securit= y model"); @@ -1236,6 +1237,13 @@ static int local_parse_opts(QemuOpts *opts, struct F= sDriverEntry *fse) error_report("fsdev: No path specified"); return -1; } + + fsdev_throttle_parse_opts(opts, &fse->fst, &err); + if (err) { + error_reportf_err(err, "Throttle configuration is not valid: "); + return -1; + } + fse->path =3D g_strdup(path); =20 return 0; diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c index d99abc46025e..76c9247c777d 100644 --- a/hw/9pfs/9p.c +++ b/hw/9pfs/9p.c @@ -3529,6 +3529,10 @@ int v9fs_device_realize_common(V9fsState *s, Error *= *errp) error_setg(errp, "share path %s is not a directory", fse->path); goto out; } + + s->ctx.fst =3D &fse->fst; + fsdev_throttle_init(s->ctx.fst); + v9fs_path_free(&path); =20 rc =3D 0; @@ -3549,6 +3553,7 @@ void v9fs_device_unrealize_common(V9fsState *s, Error= **errp) if (s->ops->cleanup) { s->ops->cleanup(&s->ctx); } + fsdev_throttle_cleanup(s->ctx.fst); g_free(s->tag); g_free(s->ctx.fs_root); } diff --git a/hw/9pfs/cofile.c b/hw/9pfs/cofile.c index 120e2671080b..88791bc327ac 100644 --- a/hw/9pfs/cofile.c +++ b/hw/9pfs/cofile.c @@ -247,6 +247,7 @@ int coroutine_fn v9fs_co_pwritev(V9fsPDU *pdu, V9fsFidS= tate *fidp, if (v9fs_request_cancelled(pdu)) { return -EINTR; } + fsdev_co_throttle_request(s->ctx.fst, true, iov, iovcnt); v9fs_co_run_in_worker( { err =3D s->ops->pwritev(&s->ctx, &fidp->fs, iov, iovcnt, offse= t); @@ -266,6 +267,7 @@ int coroutine_fn v9fs_co_preadv(V9fsPDU *pdu, V9fsFidSt= ate *fidp, if (v9fs_request_cancelled(pdu)) { return -EINTR; } + fsdev_co_throttle_request(s->ctx.fst, false, iov, iovcnt); v9fs_co_run_in_worker( { err =3D s->ops->preadv(&s->ctx, &fidp->fs, iov, iovcnt, offset= ); diff --git a/qemu-options.hx b/qemu-options.hx index bf458f83c32d..82528804c3cc 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -744,7 +744,12 @@ ETEXI =20 DEF("fsdev", HAS_ARG, QEMU_OPTION_fsdev, "-fsdev fsdriver,id=3Did[,path=3Dpath,][security_model=3D{mapped-xattr= |mapped-file|passthrough|none}]\n" - " [,writeout=3Dimmediate][,readonly][,socket=3Dsocket|sock_fd=3Dsock_f= d]\n", + " [,writeout=3Dimmediate][,readonly][,socket=3Dsocket|sock_fd=3Dsock_f= d]\n" + " [[,throttling.bps-total=3Db]|[[,throttling.bps-read=3Dr][,throttling= .bps-write=3Dw]]]\n" + " [[,throttling.iops-total=3Di]|[[,throttling.iops-read=3Dr][,throttli= ng.iops-write=3Dw]]]\n" + " [[,throttling.bps-total-max=3Dbm]|[[,throttling.bps-read-max=3Drm][,= throttling.bps-write-max=3Dwm]]]\n" + " [[,throttling.iops-total-max=3Dim]|[[,throttling.iops-read-max=3Dirm= ][,throttling.iops-write-max=3Diwm]]]\n" + " [[,throttling.iops-size=3Dis]]\n", QEMU_ARCH_ALL) =20 STEXI --=20 2.7.4 From nobody Fri May 3 08:21:45 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1488275500757799.9842397934007; Tue, 28 Feb 2017 01:51:40 -0800 (PST) Received: from localhost ([::1]:59764 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cieRX-0007jA-Cb for importer@patchew.org; Tue, 28 Feb 2017 04:51:39 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53629) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cieMe-0004Ne-EE for qemu-devel@nongnu.org; Tue, 28 Feb 2017 04:46:38 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cieMa-0005wC-32 for qemu-devel@nongnu.org; Tue, 28 Feb 2017 04:46:36 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:40706 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cieMZ-0005w3-SH for qemu-devel@nongnu.org; Tue, 28 Feb 2017 04:46:32 -0500 Received: from pps.filterd (m0098414.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.0.20/8.16.0.20) with SMTP id v1S9hqjF025974 for ; Tue, 28 Feb 2017 04:46:31 -0500 Received: from e06smtp10.uk.ibm.com (e06smtp10.uk.ibm.com [195.75.94.106]) by mx0b-001b2d01.pphosted.com with ESMTP id 28w29fccgv-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Tue, 28 Feb 2017 04:46:30 -0500 Received: from localhost by e06smtp10.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 28 Feb 2017 09:46:28 -0000 Received: from d06dlp01.portsmouth.uk.ibm.com (9.149.20.13) by e06smtp10.uk.ibm.com (192.168.101.140) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Tue, 28 Feb 2017 09:46:27 -0000 Received: from b06cxnps4075.portsmouth.uk.ibm.com (d06relay12.portsmouth.uk.ibm.com [9.149.109.197]) by d06dlp01.portsmouth.uk.ibm.com (Postfix) with ESMTP id 84BD117D8067; Tue, 28 Feb 2017 09:49:39 +0000 (GMT) Received: from d06av22.portsmouth.uk.ibm.com (d06av22.portsmouth.uk.ibm.com [9.149.105.58]) by b06cxnps4075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id v1S9kQwP5505440; Tue, 28 Feb 2017 09:46:26 GMT Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0135F4C04E; Tue, 28 Feb 2017 09:46:13 +0000 (GMT) Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id BBD9A4C040; Tue, 28 Feb 2017 09:46:12 +0000 (GMT) Received: from smtp.lab.toulouse-stg.fr.ibm.com (unknown [9.101.4.1]) by d06av22.portsmouth.uk.ibm.com (Postfix) with ESMTP; Tue, 28 Feb 2017 09:46:12 +0000 (GMT) Received: from localhost.localdomain (icon-9-164-183-34.megacenter.de.ibm.com [9.164.183.34]) by smtp.lab.toulouse-stg.fr.ibm.com (Postfix) with ESMTP id 11219220748; Tue, 28 Feb 2017 10:46:24 +0100 (CET) From: Greg Kurz To: qemu-devel@nongnu.org Date: Tue, 28 Feb 2017 10:46:16 +0100 X-Mailer: git-send-email 2.7.4 In-Reply-To: <1488275176-16613-1-git-send-email-groug@kaod.org> References: <1488275176-16613-1-git-send-email-groug@kaod.org> X-TM-AS-GCONF: 00 X-Content-Scanned: Fidelis XPS MAILER x-cbid: 17022809-0040-0000-0000-00000333C57A X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17022809-0041-0000-0000-000024507CCF Message-Id: <1488275176-16613-4-git-send-email-groug@kaod.org> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2017-02-28_07:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=4 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1612050000 definitions=main-1702280090 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [generic] [fuzzy] X-Received-From: 148.163.158.5 Subject: [Qemu-devel] [PULL 3/3] throttle: factor out duplicate code X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Pradeep Jagadeesh , Peter Maydell , "Aneesh Kumar K.V" , Greg Kurz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Pradeep Jagadeesh This patch removes the redundant throttle code that was present in block and fsdev device files. Now the common code is moved to a single file. Signed-off-by: Pradeep Jagadeesh Reviewed-by: Stefan Hajnoczi Reviewed-by: Alberto Garcia (fix indent nit, Greg Kurz) Signed-off-by: Greg Kurz --- blockdev.c | 83 +++---------------------------------- fsdev/qemu-fsdev-opts.c | 80 ++--------------------------------- include/qemu/throttle-options.h | 92 +++++++++++++++++++++++++++++++++++++= ++++ 3 files changed, 102 insertions(+), 153 deletions(-) create mode 100644 include/qemu/throttle-options.h diff --git a/blockdev.c b/blockdev.c index 2b2f6ceef036..8682bd81d889 100644 --- a/blockdev.c +++ b/blockdev.c @@ -52,6 +52,7 @@ #include "sysemu/arch_init.h" #include "qemu/cutils.h" #include "qemu/help_option.h" +#include "qemu/throttle-options.h" =20 static QTAILQ_HEAD(, BlockDriverState) monitor_bdrv_states =3D QTAILQ_HEAD_INITIALIZER(monitor_bdrv_states); @@ -4007,83 +4008,11 @@ QemuOptsList qemu_common_drive_opts =3D { .name =3D BDRV_OPT_READ_ONLY, .type =3D QEMU_OPT_BOOL, .help =3D "open drive file as read-only", - },{ - .name =3D "throttling.iops-total", - .type =3D QEMU_OPT_NUMBER, - .help =3D "limit total I/O operations per second", - },{ - .name =3D "throttling.iops-read", - .type =3D QEMU_OPT_NUMBER, - .help =3D "limit read operations per second", - },{ - .name =3D "throttling.iops-write", - .type =3D QEMU_OPT_NUMBER, - .help =3D "limit write operations per second", - },{ - .name =3D "throttling.bps-total", - .type =3D QEMU_OPT_NUMBER, - .help =3D "limit total bytes per second", - },{ - .name =3D "throttling.bps-read", - .type =3D QEMU_OPT_NUMBER, - .help =3D "limit read bytes per second", - },{ - .name =3D "throttling.bps-write", - .type =3D QEMU_OPT_NUMBER, - .help =3D "limit write bytes per second", - },{ - .name =3D "throttling.iops-total-max", - .type =3D QEMU_OPT_NUMBER, - .help =3D "I/O operations burst", - },{ - .name =3D "throttling.iops-read-max", - .type =3D QEMU_OPT_NUMBER, - .help =3D "I/O operations read burst", - },{ - .name =3D "throttling.iops-write-max", - .type =3D QEMU_OPT_NUMBER, - .help =3D "I/O operations write burst", - },{ - .name =3D "throttling.bps-total-max", - .type =3D QEMU_OPT_NUMBER, - .help =3D "total bytes burst", - },{ - .name =3D "throttling.bps-read-max", - .type =3D QEMU_OPT_NUMBER, - .help =3D "total bytes read burst", - },{ - .name =3D "throttling.bps-write-max", - .type =3D QEMU_OPT_NUMBER, - .help =3D "total bytes write burst", - },{ - .name =3D "throttling.iops-total-max-length", - .type =3D QEMU_OPT_NUMBER, - .help =3D "length of the iops-total-max burst period, in secon= ds", - },{ - .name =3D "throttling.iops-read-max-length", - .type =3D QEMU_OPT_NUMBER, - .help =3D "length of the iops-read-max burst period, in second= s", - },{ - .name =3D "throttling.iops-write-max-length", - .type =3D QEMU_OPT_NUMBER, - .help =3D "length of the iops-write-max burst period, in secon= ds", - },{ - .name =3D "throttling.bps-total-max-length", - .type =3D QEMU_OPT_NUMBER, - .help =3D "length of the bps-total-max burst period, in second= s", - },{ - .name =3D "throttling.bps-read-max-length", - .type =3D QEMU_OPT_NUMBER, - .help =3D "length of the bps-read-max burst period, in seconds= ", - },{ - .name =3D "throttling.bps-write-max-length", - .type =3D QEMU_OPT_NUMBER, - .help =3D "length of the bps-write-max burst period, in second= s", - },{ - .name =3D "throttling.iops-size", - .type =3D QEMU_OPT_NUMBER, - .help =3D "when limiting by iops max size of an I/O in bytes", - },{ + }, + + THROTTLE_OPTS, + + { .name =3D "throttling.group", .type =3D QEMU_OPT_STRING, .help =3D "name of the block throttling group", diff --git a/fsdev/qemu-fsdev-opts.c b/fsdev/qemu-fsdev-opts.c index 385423f02db6..bf5713008a1b 100644 --- a/fsdev/qemu-fsdev-opts.c +++ b/fsdev/qemu-fsdev-opts.c @@ -9,6 +9,7 @@ #include "qemu/config-file.h" #include "qemu/option.h" #include "qemu/module.h" +#include "qemu/throttle-options.h" =20 static QemuOptsList qemu_fsdev_opts =3D { .name =3D "fsdev", @@ -37,83 +38,10 @@ static QemuOptsList qemu_fsdev_opts =3D { }, { .name =3D "sock_fd", .type =3D QEMU_OPT_NUMBER, - }, { - .name =3D "throttling.iops-total", - .type =3D QEMU_OPT_NUMBER, - .help =3D "limit total I/O operations per second", - }, { - .name =3D "throttling.iops-read", - .type =3D QEMU_OPT_NUMBER, - .help =3D "limit read operations per second", - }, { - .name =3D "throttling.iops-write", - .type =3D QEMU_OPT_NUMBER, - .help =3D "limit write operations per second", - }, { - .name =3D "throttling.bps-total", - .type =3D QEMU_OPT_NUMBER, - .help =3D "limit total bytes per second", - }, { - .name =3D "throttling.bps-read", - .type =3D QEMU_OPT_NUMBER, - .help =3D "limit read bytes per second", - }, { - .name =3D "throttling.bps-write", - .type =3D QEMU_OPT_NUMBER, - .help =3D "limit write bytes per second", - }, { - .name =3D "throttling.iops-total-max", - .type =3D QEMU_OPT_NUMBER, - .help =3D "I/O operations burst", - }, { - .name =3D "throttling.iops-read-max", - .type =3D QEMU_OPT_NUMBER, - .help =3D "I/O operations read burst", - }, { - .name =3D "throttling.iops-write-max", - .type =3D QEMU_OPT_NUMBER, - .help =3D "I/O operations write burst", - }, { - .name =3D "throttling.bps-total-max", - .type =3D QEMU_OPT_NUMBER, - .help =3D "total bytes burst", - }, { - .name =3D "throttling.bps-read-max", - .type =3D QEMU_OPT_NUMBER, - .help =3D "total bytes read burst", - }, { - .name =3D "throttling.bps-write-max", - .type =3D QEMU_OPT_NUMBER, - .help =3D "total bytes write burst", - }, { - .name =3D "throttling.iops-total-max-length", - .type =3D QEMU_OPT_NUMBER, - .help =3D "length of the iops-total-max burst period, in secon= ds", - }, { - .name =3D "throttling.iops-read-max-length", - .type =3D QEMU_OPT_NUMBER, - .help =3D "length of the iops-read-max burst period, in second= s", - }, { - .name =3D "throttling.iops-write-max-length", - .type =3D QEMU_OPT_NUMBER, - .help =3D "length of the iops-write-max burst period, in secon= ds", - }, { - .name =3D "throttling.bps-total-max-length", - .type =3D QEMU_OPT_NUMBER, - .help =3D "length of the bps-total-max burst period, in second= s", - }, { - .name =3D "throttling.bps-read-max-length", - .type =3D QEMU_OPT_NUMBER, - .help =3D "length of the bps-read-max burst period, in seconds= ", - }, { - .name =3D "throttling.bps-write-max-length", - .type =3D QEMU_OPT_NUMBER, - .help =3D "length of the bps-write-max burst period, in second= s", - }, { - .name =3D "throttling.iops-size", - .type =3D QEMU_OPT_NUMBER, - .help =3D "when limiting by iops max size of an I/O in bytes", }, + + THROTTLE_OPTS, + { /*End of list */ } }, }; diff --git a/include/qemu/throttle-options.h b/include/qemu/throttle-option= s.h new file mode 100644 index 000000000000..3133d1ca4022 --- /dev/null +++ b/include/qemu/throttle-options.h @@ -0,0 +1,92 @@ +/* + * QEMU throttling command line options + * + * This work is licensed under the terms of the GNU GPL, version 2 or + * (at your option) any later version. + * + * See the COPYING file in the top-level directory for details. + * + */ +#ifndef THROTTLE_OPTIONS_H +#define THROTTLE_OPTIONS_H + +#define THROTTLE_OPTS \ + { \ + .name =3D "throttling.iops-total",\ + .type =3D QEMU_OPT_NUMBER,\ + .help =3D "limit total I/O operations per second",\ + },{ \ + .name =3D "throttling.iops-read",\ + .type =3D QEMU_OPT_NUMBER,\ + .help =3D "limit read operations per second",\ + },{ \ + .name =3D "throttling.iops-write",\ + .type =3D QEMU_OPT_NUMBER,\ + .help =3D "limit write operations per second",\ + },{ \ + .name =3D "throttling.bps-total",\ + .type =3D QEMU_OPT_NUMBER,\ + .help =3D "limit total bytes per second",\ + },{ \ + .name =3D "throttling.bps-read",\ + .type =3D QEMU_OPT_NUMBER,\ + .help =3D "limit read bytes per second",\ + },{ \ + .name =3D "throttling.bps-write",\ + .type =3D QEMU_OPT_NUMBER,\ + .help =3D "limit write bytes per second",\ + },{ \ + .name =3D "throttling.iops-total-max",\ + .type =3D QEMU_OPT_NUMBER,\ + .help =3D "I/O operations burst",\ + },{ \ + .name =3D "throttling.iops-read-max",\ + .type =3D QEMU_OPT_NUMBER,\ + .help =3D "I/O operations read burst",\ + },{ \ + .name =3D "throttling.iops-write-max",\ + .type =3D QEMU_OPT_NUMBER,\ + .help =3D "I/O operations write burst",\ + },{ \ + .name =3D "throttling.bps-total-max",\ + .type =3D QEMU_OPT_NUMBER,\ + .help =3D "total bytes burst",\ + },{ \ + .name =3D "throttling.bps-read-max",\ + .type =3D QEMU_OPT_NUMBER,\ + .help =3D "total bytes read burst",\ + },{ \ + .name =3D "throttling.bps-write-max",\ + .type =3D QEMU_OPT_NUMBER,\ + .help =3D "total bytes write burst",\ + },{ \ + .name =3D "throttling.iops-total-max-length",\ + .type =3D QEMU_OPT_NUMBER,\ + .help =3D "length of the iops-total-max burst period, in secon= ds",\ + },{ \ + .name =3D "throttling.iops-read-max-length",\ + .type =3D QEMU_OPT_NUMBER,\ + .help =3D "length of the iops-read-max burst period, in second= s",\ + },{ \ + .name =3D "throttling.iops-write-max-length",\ + .type =3D QEMU_OPT_NUMBER,\ + .help =3D "length of the iops-write-max burst period, in secon= ds",\ + },{ \ + .name =3D "throttling.bps-total-max-length",\ + .type =3D QEMU_OPT_NUMBER,\ + .help =3D "length of the bps-total-max burst period, in second= s",\ + },{ \ + .name =3D "throttling.bps-read-max-length",\ + .type =3D QEMU_OPT_NUMBER,\ + .help =3D "length of the bps-read-max burst period, in seconds= ",\ + },{ \ + .name =3D "throttling.bps-write-max-length",\ + .type =3D QEMU_OPT_NUMBER,\ + .help =3D "length of the bps-write-max burst period, in second= s",\ + },{ \ + .name =3D "throttling.iops-size",\ + .type =3D QEMU_OPT_NUMBER,\ + .help =3D "when limiting by iops max size of an I/O in bytes",\ + } + +#endif --=20 2.7.4