From: John Snow <jsnow@redhat.com>
To: Marc Olson <marcolso@amazon.com>, qemu-devel@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>,
qemu-block@nongnu.org, Max Reitz <mreitz@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v3 2/3] blkdebug: Extend rule check for additional types
Date: Tue, 13 Nov 2018 18:22:31 -0500 [thread overview]
Message-ID: <94e0cf20-1a15-e4d0-cc68-cc7247067914@redhat.com> (raw)
In-Reply-To: <1542006398-30037-2-git-send-email-marcolso@amazon.com>
On 11/12/18 2:06 AM, Marc Olson via Qemu-devel wrote:
> Break out the more common parts of the BlkdebugRule struct, and make
> rule_check() more explicit about operating only on error injection types
> so that additional rule types can be added in the future.
>
> Signed-off-by: Marc Olson <marcolso@amazon.com>
> ---
> block/blkdebug.c | 59 +++++++++++++++++++++++++++++---------------------------
> 1 file changed, 31 insertions(+), 28 deletions(-)
>
> diff --git a/block/blkdebug.c b/block/blkdebug.c
> index 327049b..7739849 100644
> --- a/block/blkdebug.c
> +++ b/block/blkdebug.c
> @@ -73,13 +73,13 @@ typedef struct BlkdebugRule {
> BlkdebugEvent event;
> int action;
> int state;
> + int once;
> + int64_t offset;
> union {
> struct {
> int error;
> int immediately;
> - int once;
> - int64_t offset;
> - } inject;
> + } inject_error;
...pulling out "once" and "offset" from inject_error (renamed inject) to
shared properties. Fine, though this looks like it could use more love.
Not your doing.
This adds new dead fields for set_state and suspend which will now work,
but hopefully not do anything.
> struct {
> int new_state;
> } set_state;
> @@ -182,16 +182,16 @@ static int add_rule(void *opaque, QemuOpts *opts, Error **errp)
> .state = qemu_opt_get_number(opts, "state", 0),
> };
>
> + rule->once = qemu_opt_get_bool(opts, "once", 0);
> + sector = qemu_opt_get_number(opts, "sector", -1);
> + rule->offset = sector == -1 ? -1 : sector * BDRV_SECTOR_SIZE;
> +
> /* Parse action-specific options */
> switch (d->action) {
> case ACTION_INJECT_ERROR:
> - rule->options.inject.error = qemu_opt_get_number(opts, "errno", EIO);
> - rule->options.inject.once = qemu_opt_get_bool(opts, "once", 0);
> - rule->options.inject.immediately =
> + rule->options.inject_error.error = qemu_opt_get_number(opts, "errno", EIO);
> + rule->options.inject_error.immediately =
> qemu_opt_get_bool(opts, "immediately", 0);
> - sector = qemu_opt_get_number(opts, "sector", -1);
> - rule->options.inject.offset =
> - sector == -1 ? -1 : sector * BDRV_SECTOR_SIZE;
> break;
>
> case ACTION_SET_STATE:
> @@ -474,38 +474,41 @@ static int rule_check(BlockDriverState *bs, uint64_t offset, uint64_t bytes)
> {
> BDRVBlkdebugState *s = bs->opaque;
> BlkdebugRule *rule = NULL;
> + BlkdebugRule *error_rule = NULL;
> int error;
> bool immediately;
> + int ret = 0;
>
> QSIMPLEQ_FOREACH(rule, &s->active_rules, active_next) {
> - uint64_t inject_offset = rule->options.inject.offset;
> -
> - if (inject_offset == -1 ||
> - (bytes && inject_offset >= offset &&
> - inject_offset < offset + bytes))
> + if (rule->offset == -1 ||
> + (bytes && rule->offset >= offset &&
> + rule->offset < offset + bytes))
> {
> - break;
> + if (rule->action == ACTION_INJECT_ERROR) {
> + error_rule = rule;
> + break;
> + }
> }
> }
>
> - if (!rule) {
> - return 0;
> - }
> + if (error_rule) {
> + immediately = error_rule->options.inject_error.immediately;
> + error = error_rule->options.inject_error.error;
>
> - immediately = rule->options.inject.immediately;
> - error = rule->options.inject.error;
> + if (error_rule->once) {
> + QSIMPLEQ_REMOVE(&s->active_rules, error_rule, BlkdebugRule, active_next);
> + remove_rule(error_rule);
> + }
>
> - if (rule->options.inject.once) {
> - QSIMPLEQ_REMOVE(&s->active_rules, rule, BlkdebugRule, active_next);
> - remove_rule(rule);
> - }
> + if (error && !immediately) {
> + aio_co_schedule(qemu_get_current_aio_context(), qemu_coroutine_self());
> + qemu_coroutine_yield();
> + }
>
> - if (error && !immediately) {
> - aio_co_schedule(qemu_get_current_aio_context(), qemu_coroutine_self());
> - qemu_coroutine_yield();
> + ret = -error;
> }
Bit messy as a diff, but it seems to check out. As a bonus we now
actually check the tag of the rules we're iterating through, so that
seems like an improvement.
Reviewed-By: John Snow <jsnow@redhat.com>
>
> - return -error;
> + return ret;
> }
>
> static int coroutine_fn
>
next prev parent reply other threads:[~2018-11-13 23:22 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-12 7:06 [Qemu-devel] [PATCH v3 1/3] blkdebug: fix one shot rule processing Marc Olson
2018-11-12 7:06 ` [Qemu-devel] [PATCH v3 2/3] blkdebug: Extend rule check for additional types Marc Olson
2018-11-13 23:22 ` John Snow [this message]
2018-11-13 23:34 ` Marc Olson
2018-11-13 23:38 ` John Snow
2019-01-11 14:41 ` Max Reitz
2018-11-12 7:06 ` [Qemu-devel] [PATCH v3 3/3] blkdebug: Add latency injection rule type Marc Olson
2018-11-13 23:57 ` John Snow
2019-01-11 15:00 ` Max Reitz
2019-02-12 21:21 ` Marc Olson
2019-02-13 15:48 ` Max Reitz
2019-02-13 20:49 ` Marc Olson
2019-02-13 21:12 ` Max Reitz
2019-02-14 6:39 ` Markus Armbruster
2018-11-12 11:15 ` [Qemu-devel] [PATCH v3 1/3] blkdebug: fix one shot rule processing Dongli Zhang
2018-11-13 23:00 ` John Snow
2019-01-11 14:36 ` Max Reitz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=94e0cf20-1a15-e4d0-cc68-cc7247067914@redhat.com \
--to=jsnow@redhat.com \
--cc=kwolf@redhat.com \
--cc=marcolso@amazon.com \
--cc=mreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).