From nobody Fri May 3 12:20:26 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.zohomail.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 1502287644577463.79393125943864; Wed, 9 Aug 2017 07:07:24 -0700 (PDT) Received: from localhost ([::1]:47700 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dfRdr-0005ta-8E for importer@patchew.org; Wed, 09 Aug 2017 10:07:23 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49955) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dfRaw-0003Xi-II for qemu-devel@nongnu.org; Wed, 09 Aug 2017 10:04:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dfRap-0003ch-Vv for qemu-devel@nongnu.org; Wed, 09 Aug 2017 10:04:22 -0400 Received: from smtp1.ntua.gr ([2001:648:2000:de::183]:49068) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dfRal-0003Vy-PN; Wed, 09 Aug 2017 10:04:12 -0400 Received: from mail.ntua.gr ([IPv6:2a02:587:8030:4e00:989e:98bf:1f16:f20b]) (authenticated bits=0) by smtp1.ntua.gr (8.15.2/8.15.2) with ESMTPSA id v79E3S3L083073 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 9 Aug 2017 17:03:28 +0300 (EEST) (envelope-from el13635@mail.ntua.gr) X-Authentication-Warning: smtp1.ntua.gr: Host [IPv6:2a02:587:8030:4e00:989e:98bf:1f16:f20b] claimed to be mail.ntua.gr From: Manos Pitsidianakis To: qemu-devel Date: Wed, 9 Aug 2017 17:02:51 +0300 Message-Id: <20170809140256.25584-2-el13635@mail.ntua.gr> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170809140256.25584-1-el13635@mail.ntua.gr> References: <20170809140256.25584-1-el13635@mail.ntua.gr> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2001:648:2000:de::183 Subject: [Qemu-devel] [PATCH v2 1/6] block: skip implicit nodes in snapshots, blockjobs 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: Kevin Wolf , Alberto Garcia , Stefan Hajnoczi , qemu-block 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" Implicit filter nodes added at the top of nodes can interfere with block jobs. This is not a problem when they are added by other jobs since adding another job will issue a QERR_DEVICE_IN_USE, but it can happen in the next commit which introduces an implicitly created throttle filter node below BlockBackend, which we want to be skipped during automatic operations on the graph since the user does not necessarily know about their existence. Signed-off-by: Manos Pitsidianakis --- block.c | 10 ++++++++++ block/qapi.c | 14 +++++--------- blockdev.c | 34 ++++++++++++++++++++++++++++++++++ include/block/block_int.h | 9 +++++++++ 4 files changed, 58 insertions(+), 9 deletions(-) diff --git a/block.c b/block.c index 3615a6809e..e35d546c08 100644 --- a/block.c +++ b/block.c @@ -4945,3 +4945,13 @@ bool bdrv_can_store_new_dirty_bitmap(BlockDriverStat= e *bs, const char *name, =20 return drv->bdrv_can_store_new_dirty_bitmap(bs, name, granularity, err= p); } + +/* Get first explicit node down a bs chain. */ +BlockDriverState *bdrv_get_first_explicit(BlockDriverState *bs) +{ + while (bs && bs->drv && bs->implicit) { + bs =3D child_bs(bs); + assert(bs); + } + return bs; +} diff --git a/block/qapi.c b/block/qapi.c index 7fa2437923..847b044d13 100644 --- a/block/qapi.c +++ b/block/qapi.c @@ -147,9 +147,8 @@ BlockDeviceInfo *bdrv_block_device_info(BlockBackend *b= lk, =20 /* Skip automatically inserted nodes that the user isn't aware of = for * query-block (blk !=3D NULL), but not for query-named-block-node= s */ - while (blk && bs0->drv && bs0->implicit) { - bs0 =3D backing_bs(bs0); - assert(bs0); + if (blk) { + bs0 =3D bdrv_get_first_explicit(bs0); } } =20 @@ -336,9 +335,7 @@ static void bdrv_query_info(BlockBackend *blk, BlockInf= o **p_info, char *qdev; =20 /* Skip automatically inserted nodes that the user isn't aware of */ - while (bs && bs->drv && bs->implicit) { - bs =3D backing_bs(bs); - } + bs =3D bdrv_get_first_explicit(bs); =20 info->device =3D g_strdup(blk_name(blk)); info->type =3D g_strdup("unknown"); @@ -465,9 +462,8 @@ static BlockStats *bdrv_query_bds_stats(BlockDriverStat= e *bs, /* Skip automatically inserted nodes that the user isn't aware of in * a BlockBackend-level command. Stay at the exact node for a node-lev= el * command. */ - while (blk_level && bs->drv && bs->implicit) { - bs =3D backing_bs(bs); - assert(bs); + if (blk_level) { + bs =3D bdrv_get_first_explicit(bs); } =20 if (bdrv_get_node_name(bs)[0]) { diff --git a/blockdev.c b/blockdev.c index 23475abb72..fc7b65c3f0 100644 --- a/blockdev.c +++ b/blockdev.c @@ -1300,6 +1300,10 @@ SnapshotInfo *qmp_blockdev_snapshot_delete_internal_= sync(const char *device, if (!bs) { return NULL; } + + /* Skip implicit filter nodes */ + bs =3D bdrv_get_first_explicit(bs); + aio_context =3D bdrv_get_aio_context(bs); aio_context_acquire(aio_context); =20 @@ -1508,6 +1512,9 @@ static void internal_snapshot_prepare(BlkActionState = *common, return; } =20 + /* Skip implicit filter nodes */ + bs =3D bdrv_get_first_explicit(bs); + /* AioContext is released in .clean() */ state->aio_context =3D bdrv_get_aio_context(bs); aio_context_acquire(state->aio_context); @@ -1664,6 +1671,9 @@ static void external_snapshot_prepare(BlkActionState = *common, return; } =20 + /* Skip implicit filter nodes */ + state->old_bs =3D bdrv_get_first_explicit(state->old_bs); + /* Acquire AioContext now so any threads operating on old_bs stop */ state->aio_context =3D bdrv_get_aio_context(state->old_bs); aio_context_acquire(state->aio_context); @@ -1844,6 +1854,9 @@ static void drive_backup_prepare(BlkActionState *comm= on, Error **errp) return; } =20 + /* Skip implicit filter nodes */ + bs =3D bdrv_get_first_explicit(bs); + /* AioContext is released in .clean() */ state->aio_context =3D bdrv_get_aio_context(bs); aio_context_acquire(state->aio_context); @@ -1908,6 +1921,9 @@ static void blockdev_backup_prepare(BlkActionState *c= ommon, Error **errp) return; } =20 + /* Skip implicit filter nodes */ + bs =3D bdrv_get_first_explicit(bs); + target =3D bdrv_lookup_bs(backup->target, backup->target, errp); if (!target) { return; @@ -2988,6 +3004,9 @@ void qmp_block_stream(bool has_job_id, const char *jo= b_id, const char *device, return; } =20 + /* Skip implicit filter nodes */ + bs =3D bdrv_get_first_explicit(bs); + aio_context =3D bdrv_get_aio_context(bs); aio_context_acquire(aio_context); =20 @@ -3095,6 +3114,9 @@ void qmp_block_commit(bool has_job_id, const char *jo= b_id, const char *device, return; } =20 + /* Skip implicit filter nodes */ + bs =3D bdrv_get_first_explicit(bs); + aio_context =3D bdrv_get_aio_context(bs); aio_context_acquire(aio_context); =20 @@ -3209,6 +3231,9 @@ static BlockJob *do_drive_backup(DriveBackup *backup,= BlockJobTxn *txn, return NULL; } =20 + /* Skip implicit filter nodes */ + bs =3D bdrv_get_first_explicit(bs); + aio_context =3D bdrv_get_aio_context(bs); aio_context_acquire(aio_context); =20 @@ -3484,6 +3509,9 @@ void qmp_drive_mirror(DriveMirror *arg, Error **errp) return; } =20 + /* Skip implicit filter nodes */ + bs =3D bdrv_get_first_explicit(bs); + aio_context =3D bdrv_get_aio_context(bs); aio_context_acquire(aio_context); =20 @@ -3638,6 +3666,9 @@ void qmp_blockdev_mirror(bool has_job_id, const char = *job_id, return; } =20 + /* Skip implicit filter nodes */ + bs =3D bdrv_get_first_explicit(bs); + target_bs =3D bdrv_lookup_bs(target, target, errp); if (!target_bs) { return; @@ -3786,6 +3817,9 @@ void qmp_change_backing_file(const char *device, return; } =20 + /* Skip implicit filter nodes */ + bs =3D bdrv_get_first_explicit(bs); + aio_context =3D bdrv_get_aio_context(bs); aio_context_acquire(aio_context); =20 diff --git a/include/block/block_int.h b/include/block/block_int.h index 7571c0aaaf..8353b83e86 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -699,6 +699,13 @@ static inline BlockDriverState *backing_bs(BlockDriver= State *bs) return bs->backing ? bs->backing->bs : NULL; } =20 +static inline BlockDriverState *child_bs(BlockDriverState *bs) +{ + BdrvChild *child =3D QLIST_FIRST(&bs->children); + assert(child && !QLIST_NEXT(child, next)); + return child->bs; +} + =20 /* Essential block drivers which must always be statically linked into qem= u, and * which therefore can be accessed without using bdrv_find_format() */ @@ -980,4 +987,6 @@ void bdrv_dec_in_flight(BlockDriverState *bs); =20 void blockdev_close_all_bdrv_states(void); =20 +BlockDriverState *bdrv_get_first_explicit(BlockDriverState *bs); + #endif /* BLOCK_INT_H */ --=20 2.11.0 From nobody Fri May 3 12:20:26 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.zohomail.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 1502287590929827.9644603375642; Wed, 9 Aug 2017 07:06:30 -0700 (PDT) Received: from localhost ([::1]:47697 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dfRcz-000519-Je for importer@patchew.org; Wed, 09 Aug 2017 10:06:29 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49984) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dfRay-0003Zi-5A for qemu-devel@nongnu.org; Wed, 09 Aug 2017 10:04:25 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dfRat-0003fW-Oa for qemu-devel@nongnu.org; Wed, 09 Aug 2017 10:04:24 -0400 Received: from smtp1.ntua.gr ([2001:648:2000:de::183]:49066) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dfRal-0003W0-P7; Wed, 09 Aug 2017 10:04:12 -0400 Received: from mail.ntua.gr ([IPv6:2a02:587:8030:4e00:989e:98bf:1f16:f20b]) (authenticated bits=0) by smtp1.ntua.gr (8.15.2/8.15.2) with ESMTPSA id v79E3TBc083100 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 9 Aug 2017 17:03:29 +0300 (EEST) (envelope-from el13635@mail.ntua.gr) X-Authentication-Warning: smtp1.ntua.gr: Host [IPv6:2a02:587:8030:4e00:989e:98bf:1f16:f20b] claimed to be mail.ntua.gr From: Manos Pitsidianakis To: qemu-devel Date: Wed, 9 Aug 2017 17:02:52 +0300 Message-Id: <20170809140256.25584-3-el13635@mail.ntua.gr> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170809140256.25584-1-el13635@mail.ntua.gr> References: <20170809140256.25584-1-el13635@mail.ntua.gr> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2001:648:2000:de::183 Subject: [Qemu-devel] [PATCH v2 2/6] block: add options parameter to bdrv_new_open_driver() 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: Kevin Wolf , Alberto Garcia , Stefan Hajnoczi , qemu-block 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" Allow passing a QDict *options parameter to bdrv_new_open_driver() so that it can be used if a driver needs it upon creation. The previous behaviour (empty bs->options and bs->explicit_options) remains when options is NULL. Signed-off-by: Manos Pitsidianakis Reviewed-by: Alberto Garcia --- block.c | 16 +++++++++++++--- block/commit.c | 4 ++-- block/mirror.c | 2 +- block/vvfat.c | 2 +- include/block/block.h | 2 +- 5 files changed, 18 insertions(+), 8 deletions(-) diff --git a/block.c b/block.c index e35d546c08..2de1c29eb3 100644 --- a/block.c +++ b/block.c @@ -1153,16 +1153,26 @@ open_failed: return ret; } =20 +/* + * If options is not NULL, its ownership is transferred to the block layer= . The + * caller must use QINCREF() if they wish to keep ownership. + */ BlockDriverState *bdrv_new_open_driver(BlockDriver *drv, const char *node_= name, - int flags, Error **errp) + int flags, QDict *options, Error **= errp) { BlockDriverState *bs; int ret; =20 bs =3D bdrv_new(); bs->open_flags =3D flags; - bs->explicit_options =3D qdict_new(); - bs->options =3D qdict_new(); + if (options) { + bs->explicit_options =3D qdict_clone_shallow(options); + bs->options =3D qdict_clone_shallow(options); + QDECREF(options); + } else { + bs->explicit_options =3D qdict_new(); + bs->options =3D qdict_new(); + } bs->opaque =3D NULL; =20 update_options_from_flags(bs->options, flags); diff --git a/block/commit.c b/block/commit.c index c7857c3321..539e23c3f8 100644 --- a/block/commit.c +++ b/block/commit.c @@ -342,7 +342,7 @@ void commit_start(const char *job_id, BlockDriverState = *bs, /* Insert commit_top block node above top, so we can block consistent = read * on the backing chain below it */ commit_top_bs =3D bdrv_new_open_driver(&bdrv_commit_top, filter_node_n= ame, 0, - errp); + NULL, errp); if (commit_top_bs =3D=3D NULL) { goto fail; } @@ -494,7 +494,7 @@ int bdrv_commit(BlockDriverState *bs) backing_file_bs =3D backing_bs(bs); =20 commit_top_bs =3D bdrv_new_open_driver(&bdrv_commit_top, NULL, BDRV_O_= RDWR, - &local_err); + NULL, &local_err); if (commit_top_bs =3D=3D NULL) { error_report_err(local_err); goto ro_cleanup; diff --git a/block/mirror.c b/block/mirror.c index c9a6a3ca86..e1a160e6ea 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -1164,7 +1164,7 @@ static void mirror_start_job(const char *job_id, Bloc= kDriverState *bs, * reads on the top, while disabling it in the intermediate nodes, and= make * the backing chain writable. */ mirror_top_bs =3D bdrv_new_open_driver(&bdrv_mirror_top, filter_node_n= ame, - BDRV_O_RDWR, errp); + BDRV_O_RDWR, NULL, errp); if (mirror_top_bs =3D=3D NULL) { return; } diff --git a/block/vvfat.c b/block/vvfat.c index a9e207f7f0..6c59473baf 100644 --- a/block/vvfat.c +++ b/block/vvfat.c @@ -3194,7 +3194,7 @@ static int enable_write_target(BlockDriverState *bs, = Error **errp) #endif =20 backing =3D bdrv_new_open_driver(&vvfat_write_target, NULL, BDRV_O_ALL= OW_RDWR, - &error_abort); + NULL, &error_abort); *(void**) backing->opaque =3D s; =20 bdrv_set_backing_hd(s->bs, backing, &error_abort); diff --git a/include/block/block.h b/include/block/block.h index ab80195378..d1f03cb48b 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -263,7 +263,7 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict = *parent_options, BlockDriverState *bdrv_open(const char *filename, const char *reference, QDict *options, int flags, Error **errp); BlockDriverState *bdrv_new_open_driver(BlockDriver *drv, const char *node_= name, - int flags, Error **errp); + int flags, QDict *options, Error **= errp); BlockReopenQueue *bdrv_reopen_queue(BlockReopenQueue *bs_queue, BlockDriverState *bs, QDict *options, int flags); --=20 2.11.0 From nobody Fri May 3 12:20:26 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.zohomail.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 1502287764337589.0994809369394; Wed, 9 Aug 2017 07:09:24 -0700 (PDT) Received: from localhost ([::1]:47707 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dfRfm-0007ew-2P for importer@patchew.org; Wed, 09 Aug 2017 10:09:22 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49954) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dfRaw-0003Xe-I8 for qemu-devel@nongnu.org; Wed, 09 Aug 2017 10:04:29 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dfRau-0003gf-RW for qemu-devel@nongnu.org; Wed, 09 Aug 2017 10:04:22 -0400 Received: from smtp1.ntua.gr ([2001:648:2000:de::183]:49067) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dfRal-0003Vz-PM; Wed, 09 Aug 2017 10:04:12 -0400 Received: from mail.ntua.gr ([IPv6:2a02:587:8030:4e00:989e:98bf:1f16:f20b]) (authenticated bits=0) by smtp1.ntua.gr (8.15.2/8.15.2) with ESMTPSA id v79E3TcO083121 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 9 Aug 2017 17:03:29 +0300 (EEST) (envelope-from el13635@mail.ntua.gr) X-Authentication-Warning: smtp1.ntua.gr: Host [IPv6:2a02:587:8030:4e00:989e:98bf:1f16:f20b] claimed to be mail.ntua.gr From: Manos Pitsidianakis To: qemu-devel Date: Wed, 9 Aug 2017 17:02:53 +0300 Message-Id: <20170809140256.25584-4-el13635@mail.ntua.gr> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170809140256.25584-1-el13635@mail.ntua.gr> References: <20170809140256.25584-1-el13635@mail.ntua.gr> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2001:648:2000:de::183 Subject: [Qemu-devel] [PATCH v2 3/6] block: require job-id when device is a node name 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: Kevin Wolf , Alberto Garcia , Stefan Hajnoczi , qemu-block 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" With implicit filter nodes on the top of the graph it is not possible to generate job-ids with the name of the device in block_job_create() anymore, since the job's bs will not be a child_root. Instead we can require that job-id is not NULL in block_job_create(), and check that a job-id has been set in the callers of block_job_create() in blockdev.c. It is more consistent to require an explicit job-id when the device parameter in the job creation command, eg { "execute": "drive-backup", "arguments": { "device": "drive0", "sync": "full", "target": "backup.img" } } is not a BlockBackend name, instead of automatically getting it from the root BS if device is a node name. That information is lost after calling block_job_create(), so we can do it in its caller instead. Signed-off-by: Manos Pitsidianakis --- blockdev.c | 65 +++++++++++++++++++++++++++++++++++++++-= ---- blockjob.c | 16 ++++------- include/block/blockjob_int.h | 3 +- tests/test-blockjob.c | 10 ++----- 4 files changed, 67 insertions(+), 27 deletions(-) diff --git a/blockdev.c b/blockdev.c index fc7b65c3f0..6ffa5b0b04 100644 --- a/blockdev.c +++ b/blockdev.c @@ -3004,6 +3004,16 @@ void qmp_block_stream(bool has_job_id, const char *j= ob_id, const char *device, return; } =20 + /* Always require a job-id when device is a node name */ + if (!has_job_id) { + if (blk_by_name(device)) { + job_id =3D device; + } else { + error_setg(errp, "An explicit job ID is required for this node= "); + return; + } + } + /* Skip implicit filter nodes */ bs =3D bdrv_get_first_explicit(bs); =20 @@ -3058,7 +3068,7 @@ void qmp_block_stream(bool has_job_id, const char *jo= b_id, const char *device, /* backing_file string overrides base bs filename */ base_name =3D has_backing_file ? backing_file : base_name; =20 - stream_start(has_job_id ? job_id : NULL, bs, base_bs, base_name, + stream_start(job_id, bs, base_bs, base_name, has_speed ? speed : 0, on_error, &local_err); if (local_err) { error_propagate(errp, local_err); @@ -3117,6 +3127,16 @@ void qmp_block_commit(bool has_job_id, const char *j= ob_id, const char *device, /* Skip implicit filter nodes */ bs =3D bdrv_get_first_explicit(bs); =20 + /* Always require a job-id when device is a node name */ + if (!has_job_id) { + if (blk_by_name(device)) { + job_id =3D device; + } else { + error_setg(errp, "An explicit job ID is required for this node= "); + return; + } + } + aio_context =3D bdrv_get_aio_context(bs); aio_context_acquire(aio_context); =20 @@ -3171,7 +3191,7 @@ void qmp_block_commit(bool has_job_id, const char *jo= b_id, const char *device, " but 'top' is the active layer"); goto out; } - commit_active_start(has_job_id ? job_id : NULL, bs, base_bs, + commit_active_start(job_id, bs, base_bs, BLOCK_JOB_DEFAULT, speed, on_error, filter_node_name, NULL, NULL, false, &local_er= r); } else { @@ -3179,7 +3199,7 @@ void qmp_block_commit(bool has_job_id, const char *jo= b_id, const char *device, if (bdrv_op_is_blocked(overlay_bs, BLOCK_OP_TYPE_COMMIT_TARGET, er= rp)) { goto out; } - commit_start(has_job_id ? job_id : NULL, bs, base_bs, top_bs, spee= d, + commit_start(job_id, bs, base_bs, top_bs, speed, on_error, has_backing_file ? backing_file : NULL, filter_node_name, &local_err); } @@ -3220,7 +3240,13 @@ static BlockJob *do_drive_backup(DriveBackup *backup= , BlockJobTxn *txn, backup->mode =3D NEW_IMAGE_MODE_ABSOLUTE_PATHS; } if (!backup->has_job_id) { - backup->job_id =3D NULL; + /* Always require a job-id when device is a node name */ + if (blk_by_name(backup->device)) { + backup->job_id =3D backup->device; + } else { + error_setg(errp, "An explicit job ID is required for this node= "); + return NULL; + } } if (!backup->has_compress) { backup->compress =3D false; @@ -3366,7 +3392,13 @@ BlockJob *do_blockdev_backup(BlockdevBackup *backup,= BlockJobTxn *txn, backup->on_target_error =3D BLOCKDEV_ON_ERROR_REPORT; } if (!backup->has_job_id) { - backup->job_id =3D NULL; + /* Always require a job-id when device is a node name */ + if (blk_by_name(backup->device)) { + backup->job_id =3D backup->device; + } else { + error_setg(errp, "An explicit job ID is required for this node= "); + return NULL; + } } if (!backup->has_compress) { backup->compress =3D false; @@ -3509,6 +3541,16 @@ void qmp_drive_mirror(DriveMirror *arg, Error **errp) return; } =20 + /* Always require a job-id when device is a node name */ + if (!arg->has_job_id) { + if (blk_by_name(arg->device)) { + arg->job_id =3D arg->device; + } else { + error_setg(errp, "An explicit job ID is required for this node= "); + return; + } + } + /* Skip implicit filter nodes */ bs =3D bdrv_get_first_explicit(bs); =20 @@ -3624,7 +3666,7 @@ void qmp_drive_mirror(DriveMirror *arg, Error **errp) =20 bdrv_set_aio_context(target_bs, aio_context); =20 - blockdev_mirror_common(arg->has_job_id ? arg->job_id : NULL, bs, targe= t_bs, + blockdev_mirror_common(arg->job_id, bs, target_bs, arg->has_replaces, arg->replaces, arg->sync, backing_mode, arg->has_speed, arg->speed, arg->has_granularity, arg->granularity, @@ -3674,12 +3716,21 @@ void qmp_blockdev_mirror(bool has_job_id, const cha= r *job_id, return; } =20 + /* Always require a job-id when device is a node name */ + if (!has_job_id) { + if (blk_by_name(device)) { + job_id =3D device; + } else { + error_setg(errp, "An explicit job ID is required for this node= "); + return; + } + } aio_context =3D bdrv_get_aio_context(bs); aio_context_acquire(aio_context); =20 bdrv_set_aio_context(target_bs, aio_context); =20 - blockdev_mirror_common(has_job_id ? job_id : NULL, bs, target_bs, + blockdev_mirror_common(job_id, bs, target_bs, has_replaces, replaces, sync, backing_mode, has_speed, speed, has_granularity, granularity, diff --git a/blockjob.c b/blockjob.c index 70a78188b7..ba26890ae9 100644 --- a/blockjob.c +++ b/blockjob.c @@ -622,20 +622,14 @@ void *block_job_create(const char *job_id, const Bloc= kJobDriver *driver, return NULL; } =20 - if (job_id =3D=3D NULL && !(flags & BLOCK_JOB_INTERNAL)) { - job_id =3D bdrv_get_device_name(bs); - if (!*job_id) { - error_setg(errp, "An explicit job ID is required for this node= "); - return NULL; - } - } - - if (job_id) { - if (flags & BLOCK_JOB_INTERNAL) { + if (flags & BLOCK_JOB_INTERNAL) { + if (job_id) { error_setg(errp, "Cannot specify job ID for internal block job= "); return NULL; } - + } else { + /* Require job-id. */ + assert(job_id); if (!id_wellformed(job_id)) { error_setg(errp, "Invalid job ID '%s'", job_id); return NULL; diff --git a/include/block/blockjob_int.h b/include/block/blockjob_int.h index f13ad05c0d..ff906808a6 100644 --- a/include/block/blockjob_int.h +++ b/include/block/blockjob_int.h @@ -112,8 +112,7 @@ struct BlockJobDriver { =20 /** * block_job_create: - * @job_id: The id of the newly-created job, or %NULL to have one - * generated automatically. + * @job_id: The id of the newly-created job, must be non %NULL. * @job_type: The class object for the newly-created job. * @bs: The block * @perm, @shared_perm: Permissions to request for @bs diff --git a/tests/test-blockjob.c b/tests/test-blockjob.c index 23bdf1a932..83ce5f63c7 100644 --- a/tests/test-blockjob.c +++ b/tests/test-blockjob.c @@ -93,9 +93,6 @@ static void test_job_ids(void) blk[1] =3D create_blk("drive1"); blk[2] =3D create_blk("drive2"); =20 - /* No job ID provided and the block backend has no name */ - job[0] =3D do_test_id(blk[0], NULL, false); - /* These are all invalid job IDs */ job[0] =3D do_test_id(blk[0], "0id", false); job[0] =3D do_test_id(blk[0], "", false); @@ -119,16 +116,15 @@ static void test_job_ids(void) block_job_early_fail(job[0]); job[1] =3D do_test_id(blk[1], "id0", true); =20 - /* No job ID specified, defaults to the backend name ('drive1') */ block_job_early_fail(job[1]); - job[1] =3D do_test_id(blk[1], NULL, true); + job[1] =3D do_test_id(blk[1], "drive1", true); =20 /* Duplicate job ID */ job[2] =3D do_test_id(blk[2], "drive1", false); =20 - /* The ID of job[2] would default to 'drive2' but it is already in use= */ + /* The ID of job[2] is already in use */ job[0] =3D do_test_id(blk[0], "drive2", true); - job[2] =3D do_test_id(blk[2], NULL, false); + job[2] =3D do_test_id(blk[2], "drive2", false); =20 /* This one is valid */ job[2] =3D do_test_id(blk[2], "id_2", true); --=20 2.11.0 From nobody Fri May 3 12:20:26 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.zohomail.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 1502287881992106.19139469200843; Wed, 9 Aug 2017 07:11:21 -0700 (PDT) Received: from localhost ([::1]:47719 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dfRhg-00012F-GX for importer@patchew.org; Wed, 09 Aug 2017 10:11:20 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49867) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dfRat-0003US-CC for qemu-devel@nongnu.org; Wed, 09 Aug 2017 10:04:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dfRar-0003dR-5C for qemu-devel@nongnu.org; Wed, 09 Aug 2017 10:04:19 -0400 Received: from smtp1.ntua.gr ([2001:648:2000:de::183]:49072) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dfRal-0003Wk-P3; Wed, 09 Aug 2017 10:04:12 -0400 Received: from mail.ntua.gr ([IPv6:2a02:587:8030:4e00:989e:98bf:1f16:f20b]) (authenticated bits=0) by smtp1.ntua.gr (8.15.2/8.15.2) with ESMTPSA id v79E3U66083141 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 9 Aug 2017 17:03:30 +0300 (EEST) (envelope-from el13635@mail.ntua.gr) X-Authentication-Warning: smtp1.ntua.gr: Host [IPv6:2a02:587:8030:4e00:989e:98bf:1f16:f20b] claimed to be mail.ntua.gr From: Manos Pitsidianakis To: qemu-devel Date: Wed, 9 Aug 2017 17:02:54 +0300 Message-Id: <20170809140256.25584-5-el13635@mail.ntua.gr> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170809140256.25584-1-el13635@mail.ntua.gr> References: <20170809140256.25584-1-el13635@mail.ntua.gr> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2001:648:2000:de::183 Subject: [Qemu-devel] [PATCH v2 4/6] block: remove legacy I/O throttling 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: Kevin Wolf , Alberto Garcia , Stefan Hajnoczi , qemu-block 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 commit removes all I/O throttling from block/block-backend.c. In order to support the existing interface, it is changed to use the block/throttle.c filter driver. The throttle filter node that is created by the legacy interface is stored in a 'throttle_node' field in the BlockBackendPublic of the device. The legacy throttle node is managed by the legacy interface completely. More advanced configurations with the filter drive are possible using the QMP API, but these will be ignored by the legacy interface. Signed-off-by: Manos Pitsidianakis --- block/block-backend.c | 133 ++++++++++++++++++++++++------------= ---- block/qapi.c | 10 +-- block/throttle.c | 8 +++ blockdev.c | 49 +++++++++++---- include/block/throttle-groups.h | 1 + include/sysemu/block-backend.h | 6 +- tests/test-throttle.c | 19 +++--- 7 files changed, 146 insertions(+), 80 deletions(-) diff --git a/block/block-backend.c b/block/block-backend.c index df0200fc49..61983b7393 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -15,6 +15,7 @@ #include "block/block_int.h" #include "block/blockjob.h" #include "block/throttle-groups.h" +#include "qemu/throttle-options.h" #include "sysemu/blockdev.h" #include "sysemu/sysemu.h" #include "qapi-event.h" @@ -282,7 +283,7 @@ static void blk_delete(BlockBackend *blk) assert(!blk->refcnt); assert(!blk->name); assert(!blk->dev); - if (blk->public.throttle_group_member.throttle_state) { + if (blk->public.throttle_node) { blk_io_limits_disable(blk); } if (blk->root) { @@ -593,13 +594,7 @@ BlockBackend *blk_by_public(BlockBackendPublic *public) */ void blk_remove_bs(BlockBackend *blk) { - ThrottleTimers *tt; - notifier_list_notify(&blk->remove_bs_notifiers, blk); - if (blk->public.throttle_group_member.throttle_state) { - tt =3D &blk->public.throttle_group_member.throttle_timers; - throttle_timers_detach_aio_context(tt); - } =20 blk_update_root_state(blk); =20 @@ -620,12 +615,6 @@ int blk_insert_bs(BlockBackend *blk, BlockDriverState = *bs, Error **errp) bdrv_ref(bs); =20 notifier_list_notify(&blk->insert_bs_notifiers, blk); - if (blk->public.throttle_group_member.throttle_state) { - throttle_timers_attach_aio_context( - &blk->public.throttle_group_member.throttle_timers, - bdrv_get_aio_context(bs)); - } - return 0; } =20 @@ -983,13 +972,6 @@ int coroutine_fn blk_co_preadv(BlockBackend *blk, int6= 4_t offset, } =20 bdrv_inc_in_flight(bs); - - /* throttling disk I/O */ - if (blk->public.throttle_group_member.throttle_state) { - throttle_group_co_io_limits_intercept(&blk->public.throttle_group_= member, - bytes, false); - } - ret =3D bdrv_co_preadv(blk->root, offset, bytes, qiov, flags); bdrv_dec_in_flight(bs); return ret; @@ -1010,11 +992,6 @@ int coroutine_fn blk_co_pwritev(BlockBackend *blk, in= t64_t offset, } =20 bdrv_inc_in_flight(bs); - /* throttling disk I/O */ - if (blk->public.throttle_group_member.throttle_state) { - throttle_group_co_io_limits_intercept(&blk->public.throttle_group_= member, - bytes, true); - } =20 if (!blk->enable_write_cache) { flags |=3D BDRV_REQ_FUA; @@ -1682,16 +1659,9 @@ static AioContext *blk_aiocb_get_aio_context(BlockAI= OCB *acb) void blk_set_aio_context(BlockBackend *blk, AioContext *new_context) { BlockDriverState *bs =3D blk_bs(blk); - ThrottleGroupMember *tgm =3D &blk->public.throttle_group_member; =20 if (bs) { - if (tgm->throttle_state) { - throttle_group_detach_aio_context(tgm); - } bdrv_set_aio_context(bs, new_context); - if (tgm->throttle_state) { - throttle_group_attach_aio_context(tgm, new_context); - } } } =20 @@ -1909,45 +1879,98 @@ int blk_commit_all(void) /* throttling disk I/O limits */ void blk_set_io_limits(BlockBackend *blk, ThrottleConfig *cfg) { - throttle_group_config(&blk->public.throttle_group_member, cfg); + assert(blk->public.throttle_node); + throttle_group_config(throttle_get_tgm(blk->public.throttle_node), cfg= ); } =20 void blk_io_limits_disable(BlockBackend *blk) { - assert(blk->public.throttle_group_member.throttle_state); - bdrv_drained_begin(blk_bs(blk)); - throttle_group_unregister_tgm(&blk->public.throttle_group_member); - bdrv_drained_end(blk_bs(blk)); + BlockDriverState *bs, *throttle_node; + + throttle_node =3D blk_get_public(blk)->throttle_node; + + assert(throttle_node); + + bs =3D throttle_node->file->bs; + bdrv_drained_begin(bs); + + /* Ref throttle_node's child bs to ensure it won't go away */ + bdrv_ref(bs); + + bdrv_child_try_set_perm(throttle_node->file, 0, BLK_PERM_ALL, + &error_abort); + /* Replace throttle_node with bs. While throttle_node was inserted und= er + * blk, at this point it might have more than one parent, so use + * bdrv_replace_node(). This destroys throttle_node */ + bdrv_replace_node(throttle_node, bs, &error_abort); + blk_get_public(blk)->throttle_node =3D NULL; + + bdrv_unref(bs); + bdrv_drained_end(bs); + } =20 /* should be called before blk_set_io_limits if a limit is set */ -void blk_io_limits_enable(BlockBackend *blk, const char *group) +void blk_io_limits_enable(BlockBackend *blk, const char *group, Error **e= rrp) { - assert(!blk->public.throttle_group_member.throttle_state); - throttle_group_register_tgm(&blk->public.throttle_group_member, - group, blk_get_aio_context(blk)); + BlockDriverState *bs =3D blk_bs(blk), *throttle_node; + QDict *options =3D qdict_new(); + Error *local_err =3D NULL; + + bdrv_drained_begin(bs); + + qdict_set_default_str(options, "file", bs->node_name); + qdict_set_default_str(options, QEMU_OPT_THROTTLE_GROUP_NAME, group); + throttle_node =3D bdrv_new_open_driver(bdrv_find_format("throttle"), N= ULL, + bdrv_get_flags(bs), options, errp= ); + if (!throttle_node) { + goto end; + } + throttle_node->implicit =3D true; + + blk_remove_bs(blk); + blk_insert_bs(blk, throttle_node, &local_err); + if (local_err) { + error_propagate(errp, local_err); + blk_insert_bs(blk, bs, &error_abort); + bdrv_unref(throttle_node); + throttle_node =3D NULL; + goto end; + } + bdrv_unref(throttle_node); + + assert(throttle_node->file->bs =3D=3D bs); + assert(throttle_node->refcnt =3D=3D 1); + +end: + bdrv_drained_end(bs); + blk_get_public(blk)->throttle_node =3D throttle_node; } =20 -void blk_io_limits_update_group(BlockBackend *blk, const char *group) +void blk_io_limits_update_group(BlockBackend *blk, const char *group, Erro= r **errp) { + ThrottleGroupMember *tgm; + /* this BB is not part of any group */ - if (!blk->public.throttle_group_member.throttle_state) { + if (!blk->public.throttle_node) { return; } =20 + tgm =3D throttle_get_tgm(blk->public.throttle_node); /* this BB is a part of the same group than the one we want */ - if (!g_strcmp0(throttle_group_get_name(&blk->public.throttle_group_mem= ber), - group)) { + if (!g_strcmp0(throttle_group_get_name(tgm), + group)) { return; } =20 - /* need to change the group this bs belong to */ + /* need to change the group this bs belongs to */ blk_io_limits_disable(blk); - blk_io_limits_enable(blk, group); + blk_io_limits_enable(blk, group, errp); } =20 static void blk_root_drained_begin(BdrvChild *child) { + ThrottleGroupMember *tgm; BlockBackend *blk =3D child->opaque; =20 if (++blk->quiesce_counter =3D=3D 1) { @@ -1958,19 +1981,25 @@ static void blk_root_drained_begin(BdrvChild *child) =20 /* Note that blk->root may not be accessible here yet if we are just * attaching to a BlockDriverState that is drained. Use child instead.= */ - - if (atomic_fetch_inc(&blk->public.throttle_group_member.io_limits_disa= bled) =3D=3D 0) { - throttle_group_restart_tgm(&blk->public.throttle_group_member); + if (blk->public.throttle_node) { + tgm =3D throttle_get_tgm(blk->public.throttle_node); + if (atomic_fetch_inc(&tgm->io_limits_disabled) =3D=3D 0) { + throttle_group_restart_tgm(tgm); + } } } =20 static void blk_root_drained_end(BdrvChild *child) { + ThrottleGroupMember *tgm; BlockBackend *blk =3D child->opaque; assert(blk->quiesce_counter); =20 - assert(blk->public.throttle_group_member.io_limits_disabled); - atomic_dec(&blk->public.throttle_group_member.io_limits_disabled); + if (blk->public.throttle_node) { + tgm =3D throttle_get_tgm(blk->public.throttle_node); + assert(tgm->io_limits_disabled); + atomic_dec(&tgm->io_limits_disabled); + } =20 if (--blk->quiesce_counter =3D=3D 0) { if (blk->dev_ops && blk->dev_ops->drained_end) { diff --git a/block/qapi.c b/block/qapi.c index 847b044d13..ab55db7134 100644 --- a/block/qapi.c +++ b/block/qapi.c @@ -66,11 +66,12 @@ BlockDeviceInfo *bdrv_block_device_info(BlockBackend *b= lk, =20 info->detect_zeroes =3D bs->detect_zeroes; =20 - if (blk && blk_get_public(blk)->throttle_group_member.throttle_state) { + if (blk && blk_get_public(blk)->throttle_node) { ThrottleConfig cfg; - BlockBackendPublic *blkp =3D blk_get_public(blk); + BlockDriverState *throttle_node =3D blk_get_public(blk)->throttle_= node; + ThrottleGroupMember *tgm =3D throttle_get_tgm(throttle_node); =20 - throttle_group_get_config(&blkp->throttle_group_member, &cfg); + throttle_group_get_config(tgm, &cfg); =20 info->bps =3D cfg.buckets[THROTTLE_BPS_TOTAL].avg; info->bps_rd =3D cfg.buckets[THROTTLE_BPS_READ].avg; @@ -118,8 +119,7 @@ BlockDeviceInfo *bdrv_block_device_info(BlockBackend *b= lk, info->iops_size =3D cfg.op_size; =20 info->has_group =3D true; - info->group =3D - g_strdup(throttle_group_get_name(&blkp->throttle_group_member)= ); + info->group =3D g_strdup(throttle_group_get_name(tgm)); } =20 info->write_threshold =3D bdrv_write_threshold_get(bs); diff --git a/block/throttle.c b/block/throttle.c index 3e6cb1de7b..16861b57ff 100644 --- a/block/throttle.c +++ b/block/throttle.c @@ -38,6 +38,14 @@ static QemuOptsList throttle_opts =3D { }, }; =20 +static BlockDriver bdrv_throttle; + +ThrottleGroupMember *throttle_get_tgm(BlockDriverState *bs) +{ + assert(bs->drv =3D=3D &bdrv_throttle); + return (ThrottleGroupMember *)bs->opaque; +} + /* Extract ThrottleConfig options. Assumes cfg is initialized and will be * checked for validity. * diff --git a/blockdev.c b/blockdev.c index 6ffa5b0b04..20e5513f87 100644 --- a/blockdev.c +++ b/blockdev.c @@ -607,7 +607,14 @@ static BlockBackend *blockdev_init(const char *file, Q= Dict *bs_opts, if (!throttling_group) { throttling_group =3D id; } - blk_io_limits_enable(blk, throttling_group); + blk_io_limits_enable(blk, throttling_group, &error); + if (error) { + error_propagate(errp, error); + blk_unref(blk); + blk =3D NULL; + goto err_no_bs_opts; + + } blk_set_io_limits(blk, &cfg); } =20 @@ -2629,6 +2636,9 @@ void qmp_block_set_io_throttle(BlockIOThrottle *arg, = Error **errp) BlockDriverState *bs; BlockBackend *blk; AioContext *aio_context; + BlockDriverState *throttle_node =3D NULL; + ThrottleGroupMember *tgm; + Error *local_err =3D NULL; =20 blk =3D qmp_get_blk(arg->has_device ? arg->device : NULL, arg->has_id ? arg->id : NULL, @@ -2704,18 +2714,33 @@ void qmp_block_set_io_throttle(BlockIOThrottle *arg= , Error **errp) if (throttle_enabled(&cfg)) { /* Enable I/O limits if they're not enabled yet, otherwise * just update the throttling group. */ - if (!blk_get_public(blk)->throttle_group_member.throttle_state) { - blk_io_limits_enable(blk, - arg->has_group ? arg->group : - arg->has_device ? arg->device : - arg->id); - } else if (arg->has_group) { - blk_io_limits_update_group(blk, arg->group); + if (!blk_get_public(blk)->throttle_node) { + blk_io_limits_enable(blk, arg->has_group ? arg->group : + arg->has_device ? arg->device : arg->id, + &local_err); + if (local_err) { + error_propagate(errp, local_err); + goto out; + } } - /* Set the new throttling configuration */ - blk_set_io_limits(blk, &cfg); - } else if (blk_get_public(blk)->throttle_group_member.throttle_state) { - /* If all throttling settings are set to 0, disable I/O limits */ + + if (arg->has_group) { + /* move throttle node membership to arg->group */ + blk_io_limits_update_group(blk, arg->group, &local_err); + if (local_err) { + error_propagate(errp, local_err); + goto out; + } + } + + throttle_node =3D blk_get_public(blk)->throttle_node; + tgm =3D throttle_get_tgm(throttle_node); + throttle_group_config(tgm, &cfg); + } else if (blk_get_public(blk)->throttle_node) { + /* + * If all throttling settings are set to 0, disable I/O limits + * by deleting the legacy throttle node + * */ blk_io_limits_disable(blk); } =20 diff --git a/include/block/throttle-groups.h b/include/block/throttle-group= s.h index 82f030523f..26a8e44b43 100644 --- a/include/block/throttle-groups.h +++ b/include/block/throttle-groups.h @@ -76,5 +76,6 @@ void coroutine_fn throttle_group_co_io_limits_intercept(T= hrottleGroupMember *tgm void throttle_group_attach_aio_context(ThrottleGroupMember *tgm, AioContext *new_context); void throttle_group_detach_aio_context(ThrottleGroupMember *tgm); +ThrottleGroupMember *throttle_get_tgm(BlockDriverState *bs); =20 #endif diff --git a/include/sysemu/block-backend.h b/include/sysemu/block-backend.h index 0e0cda7521..4a7ca53685 100644 --- a/include/sysemu/block-backend.h +++ b/include/sysemu/block-backend.h @@ -73,7 +73,7 @@ typedef struct BlockDevOps { * friends so that BlockBackends can be kept in lists outside block-backen= d.c * */ typedef struct BlockBackendPublic { - ThrottleGroupMember throttle_group_member; + BlockDriverState *throttle_node; } BlockBackendPublic; =20 BlockBackend *blk_new(uint64_t perm, uint64_t shared_perm); @@ -225,7 +225,7 @@ BlockAIOCB *blk_abort_aio_request(BlockBackend *blk, =20 void blk_set_io_limits(BlockBackend *blk, ThrottleConfig *cfg); void blk_io_limits_disable(BlockBackend *blk); -void blk_io_limits_enable(BlockBackend *blk, const char *group); -void blk_io_limits_update_group(BlockBackend *blk, const char *group); +void blk_io_limits_enable(BlockBackend *blk, const char *group, Error **er= rp); +void blk_io_limits_update_group(BlockBackend *blk, const char *group, Erro= r **errp); =20 #endif diff --git a/tests/test-throttle.c b/tests/test-throttle.c index 0ea9093eee..eef2b1c707 100644 --- a/tests/test-throttle.c +++ b/tests/test-throttle.c @@ -594,7 +594,6 @@ static void test_groups(void) { ThrottleConfig cfg1, cfg2; BlockBackend *blk1, *blk2, *blk3; - BlockBackendPublic *blkp1, *blkp2, *blkp3; ThrottleGroupMember *tgm1, *tgm2, *tgm3; =20 /* No actual I/O is performed on these devices */ @@ -602,13 +601,9 @@ static void test_groups(void) blk2 =3D blk_new(0, BLK_PERM_ALL); blk3 =3D blk_new(0, BLK_PERM_ALL); =20 - blkp1 =3D blk_get_public(blk1); - blkp2 =3D blk_get_public(blk2); - blkp3 =3D blk_get_public(blk3); - - tgm1 =3D &blkp1->throttle_group_member; - tgm2 =3D &blkp2->throttle_group_member; - tgm3 =3D &blkp3->throttle_group_member; + tgm1 =3D g_new0(ThrottleGroupMember, 1); + tgm2 =3D g_new0(ThrottleGroupMember, 1); + tgm3 =3D g_new0(ThrottleGroupMember, 1); =20 g_assert(tgm1->throttle_state =3D=3D NULL); g_assert(tgm2->throttle_state =3D=3D NULL); @@ -655,6 +650,14 @@ static void test_groups(void) g_assert(tgm1->throttle_state =3D=3D NULL); g_assert(tgm2->throttle_state =3D=3D NULL); g_assert(tgm3->throttle_state =3D=3D NULL); + + g_free(tgm1); + g_free(tgm2); + g_free(tgm3); + + blk_unref(blk1); + blk_unref(blk2); + blk_unref(blk3); } =20 int main(int argc, char **argv) --=20 2.11.0 From nobody Fri May 3 12:20:26 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.zohomail.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 1502287712403952.1194470325873; Wed, 9 Aug 2017 07:08:32 -0700 (PDT) Received: from localhost ([::1]:47705 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dfRew-0006vD-Qf for importer@patchew.org; Wed, 09 Aug 2017 10:08:30 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49831) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dfRar-0003SY-Ee for qemu-devel@nongnu.org; Wed, 09 Aug 2017 10:04:19 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dfRap-0003cY-Qg for qemu-devel@nongnu.org; Wed, 09 Aug 2017 10:04:17 -0400 Received: from smtp1.ntua.gr ([2001:648:2000:de::183]:49069) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dfRal-0003W1-LW; Wed, 09 Aug 2017 10:04:12 -0400 Received: from mail.ntua.gr ([IPv6:2a02:587:8030:4e00:989e:98bf:1f16:f20b]) (authenticated bits=0) by smtp1.ntua.gr (8.15.2/8.15.2) with ESMTPSA id v79E3Vrc083158 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 9 Aug 2017 17:03:31 +0300 (EEST) (envelope-from el13635@mail.ntua.gr) X-Authentication-Warning: smtp1.ntua.gr: Host [IPv6:2a02:587:8030:4e00:989e:98bf:1f16:f20b] claimed to be mail.ntua.gr From: Manos Pitsidianakis To: qemu-devel Date: Wed, 9 Aug 2017 17:02:55 +0300 Message-Id: <20170809140256.25584-6-el13635@mail.ntua.gr> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170809140256.25584-1-el13635@mail.ntua.gr> References: <20170809140256.25584-1-el13635@mail.ntua.gr> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2001:648:2000:de::183 Subject: [Qemu-devel] [PATCH v2 5/6] block: add iotest 191 for legacy throttling interface 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: Kevin Wolf , Alberto Garcia , Stefan Hajnoczi , qemu-block 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" Check that the implicit throttle filter driver node, used for compatibility with the legacy throttling interface on the BlockBackend level, works. Signed-off-by: Manos Pitsidianakis Reviewed-by: Alberto Garcia --- tests/qemu-iotests/191 | 138 +++++++++++++++++++++++++++++++++++++++++= ++++ tests/qemu-iotests/191.out | 5 ++ tests/qemu-iotests/group | 1 + 3 files changed, 144 insertions(+) create mode 100644 tests/qemu-iotests/191 create mode 100644 tests/qemu-iotests/191.out diff --git a/tests/qemu-iotests/191 b/tests/qemu-iotests/191 new file mode 100644 index 0000000000..82fd0b2fe5 --- /dev/null +++ b/tests/qemu-iotests/191 @@ -0,0 +1,138 @@ +#!/usr/bin/env python +# +# Tests that the legacy throttling interface using an implicit throttle fi= lter +# driver node works +# +# Copyright (C) 2017 Manos Pitsidianakis +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +import os +import iotests + +class TestLegacyThrottling(iotests.QMPTestCase): + test_img =3D os.path.join(iotests.test_dir, "test.img") + target_img =3D os.path.join(iotests.test_dir, "target.img") + base_img =3D os.path.join(iotests.test_dir, "base.img") + + def setUp(self): + iotests.qemu_img("create", "-f", iotests.imgfmt, self.base_img, "1= G") + iotests.qemu_img("create", "-f", iotests.imgfmt, self.test_img, "-= b", self.base_img) + iotests.qemu_io("-f", iotests.imgfmt, "-c", "write -P0x5d 1M 128M"= , self.test_img) + self.vm =3D iotests.VM().add_drive(self.test_img) + self.vm.launch() + + def tearDown(self): + self.do_check_throttle_node(expect=3DTrue) + params =3D {"device": "drive0", + "bps": 0, + "bps_rd": 0, + "bps_wr": 0, + "iops": 0, + "iops_rd": 0, + "iops_wr": 0, + } + """ + This must remove the implicit throttle_node + """ + result =3D self.vm.qmp("block_set_io_throttle", conv_keys=3DFalse, + **params) + self.do_check_throttle_node(expect=3DFalse) + self.vm.shutdown() + + def do_test_job(self, cmd, **args): + params =3D {"device": "drive0", + "bps": 1024, + "bps_rd": 0, + "bps_wr": 0, + "iops": 0, + "iops_rd": 0, + "iops_wr": 0, + } + result =3D self.vm.qmp("block_set_io_throttle", conv_keys=3DFalse, + **params) + self.assert_qmp(result, "return", {}) + result =3D self.vm.qmp(cmd, **args) + self.assert_qmp(result, "return", {}) + result =3D self.vm.qmp("query-block-jobs") + self.assert_qmp(result, "return[0]/device", "drive0") + + def do_check_throttle_node(self, expect): + result =3D self.vm.qmp("query-named-block-nodes") + for r in result["return"]: + if r["drv"] =3D=3D "throttle": + self.assertTrue(expect) + return + if expect: + """ throttle_node missing! """ + self.assertTrue(False) + + def do_check_params(self, file): + result =3D self.vm.qmp("query-block") + self.assert_qmp(result, "return[0]/inserted/bps", 1024) + self.assert_qmp(result, "return[0]/inserted/drv", iotests.imgfmt) + self.assert_qmp(result, "return[0]/inserted/file", file) + + """ + Check that query-block reports the correct throttling parameters while + ignoring the implicit throttle node. + """ + def test_query_block(self): + params =3D {"device": "drive0", + "bps": 1024, + "bps_rd": 0, + "bps_wr": 0, + "iops": 0, + "iops_rd": 0, + "iops_wr": 0, + } + result =3D self.vm.qmp("block_set_io_throttle", conv_keys=3DFalse, + **params) + self.assert_qmp(result, "return", {}) + self.do_check_params(file=3Dself.test_img) + + """ + Check that the throttle node doesn't get removed by block jobs, and th= at + query-block reports the correct throttling parameters + """ + def test_drive_mirror(self): + self.do_test_job("drive-mirror", device=3D"drive0", + target=3Dself.target_img, + sync=3D"full") + self.vm.event_wait("BLOCK_JOB_READY") + self.vm.qmp("block-job-complete", device=3D"drive0") + """ + query-block should report `target_img` now + """ + self.do_check_params(file=3Dself.target_img) + + def test_drive_backup(self): + self.do_test_job("drive-backup", device=3D"drive0", + target=3Dself.target_img, + sync=3D"full") + self.vm.event_wait("BLOCK_JOB_COMPLETED") + self.do_check_params(file=3Dself.test_img) + + def test_block_commit(self): + self.do_test_job("block-commit", device=3D"drive0") + self.vm.event_wait("BLOCK_JOB_READY") + self.vm.qmp("block-job-complete", device=3D"drive0") + """ + query-block should report the backing file `base_img` now + """ + self.do_check_params(file=3Dself.base_img) + +if __name__ =3D=3D "__main__": + iotests.main(supported_fmts=3D["qcow2"]) diff --git a/tests/qemu-iotests/191.out b/tests/qemu-iotests/191.out new file mode 100644 index 0000000000..89968f35d7 --- /dev/null +++ b/tests/qemu-iotests/191.out @@ -0,0 +1,5 @@ +.... +---------------------------------------------------------------------- +Ran 4 tests + +OK diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group index 6e6afb8ba9..1b4221f26d 100644 --- a/tests/qemu-iotests/group +++ b/tests/qemu-iotests/group @@ -187,3 +187,4 @@ 188 rw auto quick 189 rw auto 190 rw auto quick +191 rw auto quick --=20 2.11.0 From nobody Fri May 3 12:20:26 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.zohomail.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 1502287589089792.1439852144716; Wed, 9 Aug 2017 07:06:29 -0700 (PDT) Received: from localhost ([::1]:47696 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dfRcx-0004zL-E6 for importer@patchew.org; Wed, 09 Aug 2017 10:06:27 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49893) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dfRau-0003VQ-7L for qemu-devel@nongnu.org; Wed, 09 Aug 2017 10:04:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dfRas-0003ed-Lp for qemu-devel@nongnu.org; Wed, 09 Aug 2017 10:04:20 -0400 Received: from smtp1.ntua.gr ([2001:648:2000:de::183]:49071) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dfRal-0003W3-PJ; Wed, 09 Aug 2017 10:04:12 -0400 Received: from mail.ntua.gr ([IPv6:2a02:587:8030:4e00:989e:98bf:1f16:f20b]) (authenticated bits=0) by smtp1.ntua.gr (8.15.2/8.15.2) with ESMTPSA id v79E3We7083183 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 9 Aug 2017 17:03:32 +0300 (EEST) (envelope-from el13635@mail.ntua.gr) X-Authentication-Warning: smtp1.ntua.gr: Host [IPv6:2a02:587:8030:4e00:989e:98bf:1f16:f20b] claimed to be mail.ntua.gr From: Manos Pitsidianakis To: qemu-devel Date: Wed, 9 Aug 2017 17:02:56 +0300 Message-Id: <20170809140256.25584-7-el13635@mail.ntua.gr> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170809140256.25584-1-el13635@mail.ntua.gr> References: <20170809140256.25584-1-el13635@mail.ntua.gr> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2001:648:2000:de::183 Subject: [Qemu-devel] [PATCH v2 6/6] block: remove BlockBackendPublic 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: Kevin Wolf , Alberto Garcia , Stefan Hajnoczi , qemu-block 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" All BlockBackend level throttling (via the implicit throttle filter node) is done in block/block-backend.c and block/throttle-groups.c doesn't know about BlockBackends anymore. Since BlockBackendPublic is not needed anymore= , remove it. Signed-off-by: Manos Pitsidianakis Reviewed-by: Alberto Garcia --- block/block-backend.c | 43 +++++++++++++++++++-------------------= ---- block/qapi.c | 4 ++-- blockdev.c | 6 +++--- include/sysemu/block-backend.h | 12 +----------- 4 files changed, 25 insertions(+), 40 deletions(-) diff --git a/block/block-backend.c b/block/block-backend.c index 61983b7393..05f6e67222 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -36,7 +36,10 @@ struct BlockBackend { DriveInfo *legacy_dinfo; /* null unless created by drive_new() */ QTAILQ_ENTRY(BlockBackend) link; /* for block_backends */ QTAILQ_ENTRY(BlockBackend) monitor_link; /* for monitor_block_backends= */ - BlockBackendPublic public; + + /* implicit throttle filter node for backwards compatibility with lega= cy + * throttling commands */ + BlockDriverState *throttle_node; =20 void *dev; /* attached device model, if any */ bool legacy_dev; /* true if dev is not a DeviceState */ @@ -283,7 +286,7 @@ static void blk_delete(BlockBackend *blk) assert(!blk->refcnt); assert(!blk->name); assert(!blk->dev); - if (blk->public.throttle_node) { + if (blk->throttle_node) { blk_io_limits_disable(blk); } if (blk->root) { @@ -574,19 +577,11 @@ BlockBackend *blk_by_legacy_dinfo(DriveInfo *dinfo) } =20 /* - * Returns a pointer to the publicly accessible fields of @blk. + * Returns the throttle_node field of @blk. */ -BlockBackendPublic *blk_get_public(BlockBackend *blk) +BlockDriverState *blk_get_throttle_node(BlockBackend *blk) { - return &blk->public; -} - -/* - * Returns a BlockBackend given the associated @public fields. - */ -BlockBackend *blk_by_public(BlockBackendPublic *public) -{ - return container_of(public, BlockBackend, public); + return blk->throttle_node; } =20 /* @@ -1879,15 +1874,15 @@ int blk_commit_all(void) /* throttling disk I/O limits */ void blk_set_io_limits(BlockBackend *blk, ThrottleConfig *cfg) { - assert(blk->public.throttle_node); - throttle_group_config(throttle_get_tgm(blk->public.throttle_node), cfg= ); + assert(blk->throttle_node); + throttle_group_config(throttle_get_tgm(blk->throttle_node), cfg); } =20 void blk_io_limits_disable(BlockBackend *blk) { BlockDriverState *bs, *throttle_node; =20 - throttle_node =3D blk_get_public(blk)->throttle_node; + throttle_node =3D blk->throttle_node; =20 assert(throttle_node); =20 @@ -1903,7 +1898,7 @@ void blk_io_limits_disable(BlockBackend *blk) * blk, at this point it might have more than one parent, so use * bdrv_replace_node(). This destroys throttle_node */ bdrv_replace_node(throttle_node, bs, &error_abort); - blk_get_public(blk)->throttle_node =3D NULL; + blk->throttle_node =3D NULL; =20 bdrv_unref(bs); bdrv_drained_end(bs); @@ -1944,7 +1939,7 @@ void blk_io_limits_enable(BlockBackend *blk, const ch= ar *group, Error **errp) =20 end: bdrv_drained_end(bs); - blk_get_public(blk)->throttle_node =3D throttle_node; + blk->throttle_node =3D throttle_node; } =20 void blk_io_limits_update_group(BlockBackend *blk, const char *group, Erro= r **errp) @@ -1952,11 +1947,11 @@ void blk_io_limits_update_group(BlockBackend *blk, = const char *group, Error **er ThrottleGroupMember *tgm; =20 /* this BB is not part of any group */ - if (!blk->public.throttle_node) { + if (!blk->throttle_node) { return; } =20 - tgm =3D throttle_get_tgm(blk->public.throttle_node); + tgm =3D throttle_get_tgm(blk->throttle_node); /* this BB is a part of the same group than the one we want */ if (!g_strcmp0(throttle_group_get_name(tgm), group)) { @@ -1981,8 +1976,8 @@ static void blk_root_drained_begin(BdrvChild *child) =20 /* Note that blk->root may not be accessible here yet if we are just * attaching to a BlockDriverState that is drained. Use child instead.= */ - if (blk->public.throttle_node) { - tgm =3D throttle_get_tgm(blk->public.throttle_node); + if (blk->throttle_node) { + tgm =3D throttle_get_tgm(blk->throttle_node); if (atomic_fetch_inc(&tgm->io_limits_disabled) =3D=3D 0) { throttle_group_restart_tgm(tgm); } @@ -1995,8 +1990,8 @@ static void blk_root_drained_end(BdrvChild *child) BlockBackend *blk =3D child->opaque; assert(blk->quiesce_counter); =20 - if (blk->public.throttle_node) { - tgm =3D throttle_get_tgm(blk->public.throttle_node); + if (blk->throttle_node) { + tgm =3D throttle_get_tgm(blk->throttle_node); assert(tgm->io_limits_disabled); atomic_dec(&tgm->io_limits_disabled); } diff --git a/block/qapi.c b/block/qapi.c index ab55db7134..2be44a6758 100644 --- a/block/qapi.c +++ b/block/qapi.c @@ -66,9 +66,9 @@ BlockDeviceInfo *bdrv_block_device_info(BlockBackend *blk, =20 info->detect_zeroes =3D bs->detect_zeroes; =20 - if (blk && blk_get_public(blk)->throttle_node) { + if (blk && blk_get_throttle_node(blk)) { ThrottleConfig cfg; - BlockDriverState *throttle_node =3D blk_get_public(blk)->throttle_= node; + BlockDriverState *throttle_node =3D blk_get_throttle_node(blk); ThrottleGroupMember *tgm =3D throttle_get_tgm(throttle_node); =20 throttle_group_get_config(tgm, &cfg); diff --git a/blockdev.c b/blockdev.c index 20e5513f87..5c11c245b0 100644 --- a/blockdev.c +++ b/blockdev.c @@ -2714,7 +2714,7 @@ void qmp_block_set_io_throttle(BlockIOThrottle *arg, = Error **errp) if (throttle_enabled(&cfg)) { /* Enable I/O limits if they're not enabled yet, otherwise * just update the throttling group. */ - if (!blk_get_public(blk)->throttle_node) { + if (!blk_get_throttle_node(blk)) { blk_io_limits_enable(blk, arg->has_group ? arg->group : arg->has_device ? arg->device : arg->id, &local_err); @@ -2733,10 +2733,10 @@ void qmp_block_set_io_throttle(BlockIOThrottle *arg= , Error **errp) } } =20 - throttle_node =3D blk_get_public(blk)->throttle_node; + throttle_node =3D blk_get_throttle_node(blk); tgm =3D throttle_get_tgm(throttle_node); throttle_group_config(tgm, &cfg); - } else if (blk_get_public(blk)->throttle_node) { + } else if (blk_get_throttle_node(blk)) { /* * If all throttling settings are set to 0, disable I/O limits * by deleting the legacy throttle node diff --git a/include/sysemu/block-backend.h b/include/sysemu/block-backend.h index 4a7ca53685..a05d75fa5f 100644 --- a/include/sysemu/block-backend.h +++ b/include/sysemu/block-backend.h @@ -68,14 +68,6 @@ typedef struct BlockDevOps { void (*drained_end)(void *opaque); } BlockDevOps; =20 -/* This struct is embedded in (the private) BlockBackend struct and contai= ns - * fields that must be public. This is in particular for QLIST_ENTRY() and - * friends so that BlockBackends can be kept in lists outside block-backen= d.c - * */ -typedef struct BlockBackendPublic { - BlockDriverState *throttle_node; -} BlockBackendPublic; - BlockBackend *blk_new(uint64_t perm, uint64_t shared_perm); BlockBackend *blk_new_open(const char *filename, const char *reference, QDict *options, int flags, Error **errp); @@ -90,9 +82,7 @@ BlockBackend *blk_all_next(BlockBackend *blk); bool monitor_add_blk(BlockBackend *blk, const char *name, Error **errp); void monitor_remove_blk(BlockBackend *blk); =20 -BlockBackendPublic *blk_get_public(BlockBackend *blk); -BlockBackend *blk_by_public(BlockBackendPublic *public); - +BlockDriverState *blk_get_throttle_node(BlockBackend *blk); BlockDriverState *blk_bs(BlockBackend *blk); void blk_remove_bs(BlockBackend *blk); int blk_insert_bs(BlockBackend *blk, BlockDriverState *bs, Error **errp); --=20 2.11.0