From: Eric Blake <eblake@redhat.com>
To: Stefan Hajnoczi <stefanha@redhat.com>, qemu-devel@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>,
Paolo Bonzini <pbonzini@redhat.com>, John Snow <jsnow@redhat.com>,
Max Reitz <mreitz@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v2] docs: add blkdebug block driver documentation
Date: Tue, 23 Sep 2014 11:12:52 -0600 [thread overview]
Message-ID: <5421AA14.9060709@redhat.com> (raw)
In-Reply-To: <1411466956-19801-1-git-send-email-stefanha@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 5188 bytes --]
On 09/23/2014 04:09 AM, Stefan Hajnoczi wrote:
> The blkdebug block driver is undocumented. Documenting it is worthwhile
> since it offers powerful error injection features that are used by
> qemu-iotests test cases.
>
> This document will make it easier for people to learn about and use
> blkdebug.
>
> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
> ---
> v2:
> * Added GPL v2 or later license and Red Hat copyright [Eric]
> * Expanded ini rules file explanation [Paolo]
> * Added note that errno values depend on the host [Eric]
>
> docs/blkdebug.txt | 155 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 155 insertions(+)
> create mode 100644 docs/blkdebug.txt
>
> +Rules support the following attributes:
> +
> + event - which type of operation to match (e.g. read_aio, write_aio,
> + flush_to_os, flush_to_disk). See the "Events" section for
> + information on events.
TAB vs space damage?
> +
> + state - (optional) the engine must be in this state number in order for this
> + rule to match. See the "State transitions" section for information
> + on states.
and again?
> +
> + errno - the numeric errno value to return when a request matches this rule.
> + The errno values depend on the host since the numeric values are not
> + standarized in the POSIX specification.
> +
> + sector - (optional) a sector number that the request must overlap in order to
> + match this rule
> +
> + once - (optional, default "off") only execute this action on the first
> + matching request
> +
> + immediately - (optional, default "off") return a NULL BlockDriverAIOCB
> + pointer and fail without an errno instead. This exercises the
> + code path where BlockDriverAIOCB fails and the caller's
> + BlockDriverCompletionFunc is not invoked.
again?
> +
> +Events
> +------
> +Block drivers provide information about the type of I/O request they are about
> +to make so rules can match specific types of requests. For example, the qcow2
> +block driver tells blkdebug when it accesses the L1 table so rules can match
> +only L1 table accesses and not other metadata or guest data requests.
> +
> +The core events are:
> +
> + read_aio - guest data read
> +
> + write_aio - guest data write
> +
> + flush_to_os - write out unwritten block driver state (e.g. cached metadata)
> +
> + flush_to_disk - flush the host block device's disk cache
> +
> +See block/blkdebug.c:event_names[] for the list of available events. You may
s/available events/additional available events/ ?
> +need to grep block driver source code to understand the meaning of specific
> +events.
> +
> +State transitions
> +-----------------
> +There are cases where more power is needed to match a particular I/O request in
> +a longer sequence of requests. For example:
> +
> + write_aio
> + flush_to_disk
> + write_aio
> +
> +How do we match the 2nd write_aio but not the first? This is where state
> +transitions come in.
> +
> +The error injection engine has an integer called the "state" that always starts
> +initialized to 1. Rules can be conditional on the state and they can
> +transition to a new state.
Is the current state of the engine in a running guest introspectible,
such as through 'query-block'?
> +
> +For example, to match the 2nd write_aio:
> +
> + [set-state]
> + event = "write_aio"
> + state = "1"
> + new_state = "2"
> +
> + [inject-error]
> + event = "write_aio"
> + state = "2"
> + errno = "5"
> +
> +The first write_aio request matches the set-state rule and transitions from
> +state 0 to state 1. Once state 1 has been entered, the set-state rule no
> +longer matches since it required state 0. But the inject-error rule now
state 0/1 or state 1/2 ?
> +matches the next write_aio request and injects EIO (5).
> +
> +State transition rules support the following attributes:
> +
> + event - which type of operation to match (e.g. read_aio, write_aio,
> + flush_to_os, flush_to_disk). See the "Events" section for
> + information on events.
More tab damage?
> +
> + state - (optional) the engine must be in this state number in order for this
> + rule to match
> +
> + new_state - transition to this state number
> +
> +Suspend and resume
> +------------------
> +Exercising code paths in block drivers may require specific ordering amongst
> +concurrent requests. The "breakpoint" feature allows requests to be halted on
> +a blkdebug event and resumed later. This makes it possible to achieve
> +deterministic ordering when multiple requests are in flight.
> +
> +Breakpoints on blkdebug events are associated with a user-defined "tag" string.
> +This tag serves as an identifier by which the request can be resumed at a later
> +point.
> +
> +See the qemu-io(1) break, resume, remove_break, and wait_break commands for
> +details.
>
Looking closer.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 539 bytes --]
next prev parent reply other threads:[~2014-09-23 17:13 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-23 10:09 [Qemu-devel] [PATCH v2] docs: add blkdebug block driver documentation Stefan Hajnoczi
2014-09-23 17:12 ` Eric Blake [this message]
2014-09-24 9:40 ` Stefan Hajnoczi
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=5421AA14.9060709@redhat.com \
--to=eblake@redhat.com \
--cc=jsnow@redhat.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/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).