From nobody Mon Apr 29 10:16:42 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 148611850328052.88357470690653; Fri, 3 Feb 2017 02:41:43 -0800 (PST) Received: from localhost ([::1]:33269 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cZbJE-0005AX-Ii for importer@patchew.org; Fri, 03 Feb 2017 05:41:40 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51225) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cZakS-0000vF-Q4 for qemu-devel@nongnu.org; Fri, 03 Feb 2017 05:05:50 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cZakP-0007PE-U1 for qemu-devel@nongnu.org; Fri, 03 Feb 2017 05:05:44 -0500 Received: from mail-wj0-x243.google.com ([2a00:1450:400c:c01::243]:34208) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cZakP-0007Ny-7P for qemu-devel@nongnu.org; Fri, 03 Feb 2017 05:05:41 -0500 Received: by mail-wj0-x243.google.com with SMTP id ip10so340197wjb.1 for ; Fri, 03 Feb 2017 02:05:41 -0800 (PST) Received: from localhost.localdomain.localdomain ([217.110.131.66]) by smtp.gmail.com with ESMTPSA id p7sm44093276wrc.2.2017.02.03.02.05.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 03 Feb 2017 02:05:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=78NRlvfXMSXgWHaQrJfCLqxNsizlHhxzc1g3gIIrDYM=; b=VZSeVYPQChlfnZ0B4ZtHwW8vbwkjlk39CHRxpaOmPbYAPALP0UYjbg6q+4O7ZkxUVx lM8kXDhXgSGwSeHGjAYNo4FYnjeJhoGdASYP+MJpfJlkiIC51GN91oSnU6ALTF/Lrgq3 xf/f3c8qu0+zDc5ep8NBAxkQTah6d/pxL5AON6WIOr9PoaVDGf5wgw0uUNe0y9tmxgH9 6pwUU2wub/lGDYQstojhtbaF3iKsnl0ce1djMfu4mXFtTZbHhu1sUja5bfRifzlNP5P4 bs5HAgOURJbT4XZIMuNxlPTlxJBOm0f1SPiGB9NbUl/kxThzVFZf0QYLfnsvPuEDMcUz 5FTQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=78NRlvfXMSXgWHaQrJfCLqxNsizlHhxzc1g3gIIrDYM=; b=EpEX+hAy7CFUAKj+yFDAu9v4syPScKs21Y2a/QnlzoDpxyLFQyaYJr9hFdCShYyEZH 1zzDXbKJJHMz7H0NtbU55XWDUO1dqS5/MKneB5BSo0pMser+bzM97/QwXHuul3Db7lJ5 mUP4hFuIr6TTkSJ0Ov1tiF1NghvktC1KbssBkpJ/PCfOJMr2dcZ5SI/o39Wfh2IsxYc9 qKqQEwJa4dkPziFWyGbf3IYFkgMbAbNk9OiXe3f4VmHq9h8Oq+pCeye3TyOlRFKFEdeG IDC7TB2OGM21sO6JBaAK9WD8Jcsrf8CFx2wdD1zovuMgz9a2UkfSUVeVFZ/WhSHOZ8i9 pRGg== X-Gm-Message-State: AIkVDXLuI5YtSAghesL61XjkalbXWokLuxvo3uJnkodJzslpl+SU47nRqoeF95pThU94vA== X-Received: by 10.223.147.225 with SMTP id 88mr11318246wrp.44.1486116340070; Fri, 03 Feb 2017 02:05:40 -0800 (PST) From: Pradeep Jagadeesh X-Google-Original-From: Pradeep Jagadeesh To: "Aneesh Kumar K.V" , "Greg Kurz" Date: Fri, 3 Feb 2017 05:04:57 -0500 Message-Id: <1486116298-25046-2-git-send-email-pradeep.jagadeesh@huawei.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1486116298-25046-1-git-send-email-pradeep.jagadeesh@huawei.com> References: <1486116298-25046-1-git-send-email-pradeep.jagadeesh@huawei.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a00:1450:400c:c01::243 Subject: [Qemu-devel] [PATCH 1/2 v15] 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: Alberto Garcia , Pradeep Jagadeesh , qemu-devel@nongnu.org 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" This patchset adds the io throttle support for the 9p-local driver. For now this functionality can be used only through qemu cli options. QMP interface and support to other 9p 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 --- 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 + 8 files changed, 252 insertions(+), 2 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 1b120a4..659df6e 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 a56dc84..0844a40 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 1dd8c7a..385423f0 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 0000000..feb9af3 --- /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]); + } + + 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 0000000..e418643 --- /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 845675e..828348d 100644 --- a/hw/9pfs/9p-local.c +++ b/hw/9pfs/9p-local.c @@ -1209,6 +1209,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"); @@ -1237,6 +1238,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 fa58877..920eb05 100644 --- a/hw/9pfs/9p.c +++ b/hw/9pfs/9p.c @@ -3520,6 +3520,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; @@ -3528,6 +3532,7 @@ out: if (s->ops && s->ops->cleanup && s->ctx.private) { s->ops->cleanup(&s->ctx); } + fsdev_throttle_cleanup(s->ctx.fst); g_free(s->tag); g_free(s->ctx.fs_root); v9fs_path_free(&path); diff --git a/hw/9pfs/cofile.c b/hw/9pfs/cofile.c index 120e267..88791bc 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= ); --=20 1.8.3.1 From nobody Mon Apr 29 10:16:42 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 1486118313973716.5667992582808; Fri, 3 Feb 2017 02:38:33 -0800 (PST) Received: from localhost ([::1]:33232 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cZbGB-0002hg-MQ for importer@patchew.org; Fri, 03 Feb 2017 05:38:31 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51229) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cZakS-0000vI-RF for qemu-devel@nongnu.org; Fri, 03 Feb 2017 05:05:50 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cZakQ-0007Pn-PJ for qemu-devel@nongnu.org; Fri, 03 Feb 2017 05:05:44 -0500 Received: from mail-wj0-x243.google.com ([2a00:1450:400c:c01::243]:34819) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cZakQ-0007Ow-9H for qemu-devel@nongnu.org; Fri, 03 Feb 2017 05:05:42 -0500 Received: by mail-wj0-x243.google.com with SMTP id i7so338249wjf.2 for ; Fri, 03 Feb 2017 02:05:42 -0800 (PST) Received: from localhost.localdomain.localdomain ([217.110.131.66]) by smtp.gmail.com with ESMTPSA id p7sm44093276wrc.2.2017.02.03.02.05.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 03 Feb 2017 02:05:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=gmmDkHQUBIdxj+fSevUgJWVMCQXnh/8K0x3test2iZY=; b=MJZ+RJWR5eRlfskdghi0M62qrLmQw47D8Y0YitjRIBTtyD5erjl91UD6w3YEQhJle0 HMVqpkXf7C5ig9f5ftKFqUju6FSv73qdwpqntk9y0O4nw4MYrJkTJsVBAFTJd0PLUhaq 1Rok01OZCTSrx9ZsRIvvCZyv4r8khXkfN71jEsQjgvfyCHGEJ1vYbEZUft44u9hAdqxb 3k7XdS98/+5Vr0ktxgGjvI6gPkZXtg01ohBEWQViAHZygxBey5qitzAt9PDB+zM2zRBL 49zA4/UdTL8hUTgcFB/qgEjRPz2Cao4qQR38fkEmY5o9tl5LOof4e29tnjyxZY/rXni+ Ahyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=gmmDkHQUBIdxj+fSevUgJWVMCQXnh/8K0x3test2iZY=; b=k61NUEH94Gl6o0YUbXKfM16ds67g9SnLapN2+ctr2CaTr8V/D/65qyvfQDLcEbz0yS qnFao+RLOeJXIEKmawvqJIScTd2NPcp29bFkOsa9BFdhvZb2T9dAsl/FAktvBOVUF0/+ OS5M3ipVDUcPQict+7mko55HHX7S0TIoYhXPje6/iGN1bhEfMCjDC6l7hUWbEhq4zkyg qEbbcO7idZC81zjvyvo54Qs4BP+Oe8B+/dAd0BiCA1kzaPUQc0UHH8Fwpq6GO3+bbSg5 6FBo8IKeoDT/ehDU9M0rzUox1rMkpIvkA/bPDKk1k+Lf5tw7aKiFyZNO35cOGpXyFwjL 0rOQ== X-Gm-Message-State: AIkVDXLUtP+oJmskXL8beGkqXZBa7D9/sp+oicfzDWDmCbJ7xRLv1dOTvjrfKzcQoUBI7Q== X-Received: by 10.223.177.202 with SMTP id r10mr11452997wra.94.1486116341043; Fri, 03 Feb 2017 02:05:41 -0800 (PST) From: Pradeep Jagadeesh X-Google-Original-From: Pradeep Jagadeesh To: "Aneesh Kumar K.V" , "Greg Kurz" Date: Fri, 3 Feb 2017 05:04:58 -0500 Message-Id: <1486116298-25046-3-git-send-email-pradeep.jagadeesh@huawei.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1486116298-25046-1-git-send-email-pradeep.jagadeesh@huawei.com> References: <1486116298-25046-1-git-send-email-pradeep.jagadeesh@huawei.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a00:1450:400c:c01::243 Subject: [Qemu-devel] [PATCH 2/2 v15] 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: Alberto Garcia , Pradeep Jagadeesh , qemu-devel@nongnu.org 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" 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 https://lists.gnu.org/archive/html/qemu-devel/2017-01/msg04637.html --- blockdev.c | 81 ++---------------------------------- fsdev/qemu-fsdev-opts.c | 80 ++--------------------------------- hw/9pfs/9p.c | 2 +- include/qemu/throttle-options.h | 92 +++++++++++++++++++++++++++++++++++++= ++++ 4 files changed, 101 insertions(+), 154 deletions(-) create mode 100644 include/qemu/throttle-options.h diff --git a/blockdev.c b/blockdev.c index 245e1e1..9320c8a 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); @@ -3999,83 +4000,9 @@ 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 385423f0..bf57130 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/hw/9pfs/9p.c b/hw/9pfs/9p.c index 920eb05..22a6a99 100644 --- a/hw/9pfs/9p.c +++ b/hw/9pfs/9p.c @@ -3532,7 +3532,6 @@ out: if (s->ops && s->ops->cleanup && s->ctx.private) { s->ops->cleanup(&s->ctx); } - fsdev_throttle_cleanup(s->ctx.fst); g_free(s->tag); g_free(s->ctx.fs_root); v9fs_path_free(&path); @@ -3545,6 +3544,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/include/qemu/throttle-options.h b/include/qemu/throttle-option= s.h new file mode 100644 index 0000000..3133d1c --- /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 1.8.3.1