From: "Richard W.M. Jones" <rjones@redhat.com>
To: Hanna Reitz <hreitz@redhat.com>
Cc: kwolf@redhat.com, andrey.shinkevich@virtuozzo.com,
eblake@redhat.com, qemu-devel@nongnu.org, qemu-block@nongnu.org
Subject: Re: Block alignment of qcow2 compress driver
Date: Fri, 28 Jan 2022 12:18:03 +0000 [thread overview]
Message-ID: <20220128121803.GS1127@redhat.com> (raw)
In-Reply-To: <26486e0e-adb5-aa3b-e70d-82ab21a0d2be@redhat.com>
On Fri, Jan 28, 2022 at 12:57:47PM +0100, Hanna Reitz wrote:
> On 28.01.22 12:48, Richard W.M. Jones wrote:
> >On Fri, Jan 28, 2022 at 12:39:11PM +0100, Hanna Reitz wrote:
> >>So I actually don’t know why it works for you. OTOH, I don’t
> >>understand why the block size affects you over NBD, because I would
> >>have expected qemu to internally auto-align requests when they are
> >>not aligned (in bdrv_co_pwritev_part()).
> >I checked it again and my hack definitely fixes nbdcopy. But maybe
> >that's expected if qemu-nbd is auto-aligning requests? (I'm only
> >accessing the block layer through qemu-nbd, not with qemu-io)
>
> It’s not just qemu-io, with your diff[3] I get the same EINVAL over
> NBD, too:
>
> $ ./qemu-img create -f qcow2 test.qcow2 64M
> Formatting 'test.qcow2', fmt=qcow2 cluster_size=65536
> extended_l2=off compression_type=zlib size=67108864
> lazy_refcounts=off refcount_bits=16
>
> $ ./qemu-nbd --fork --image-opts \
> driver=compress,file.driver=qcow2,file.file.driver=file,file.file.filename=test.qcow2
>
> $ ./qemu-io -c 'write 0 32k' -f raw nbd://localhost
> write failed: Invalid argument
Strange - is that error being generated by qemu's nbd client code?
Here's my test not involving qemu's client code:
$ qemu-nbd --version
qemu-nbd 6.2.0 (qemu-6.2.0-2.fc36)
$ qemu-img create -f qcow2 output.qcow2 1M
Formatting 'output.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=1048576 lazy_refcounts=off refcount_bits=16
$ qemu-nbd --fork --image-opts driver=compress,file.driver=qcow2,file.file.driver=file,file.file.filename=output.qcow2
$ nbdsh -u nbd://localhost
nbd> h.get_strict_mode()
31
nbd> h.set_strict_mode(31 & ~nbd.STRICT_ALIGN)
nbd> h.get_strict_mode()
15
nbd> h.pwrite(b'1'*1024, 0)
nbd> exit
So an unaligned 1K write works (after disabling libnbd's client-side
alignment checks).
> I just changed that line of code [2], as shown in [4]. I suppose
> the better thing to do would be to have an option for the NBD server
> to force-change the announced request alignment, because it can
> expect the qemu block layer code to auto-align requests through
> RMW. Doing it in the client is wrong, because the NBD server might
> want to detect that the client sends unaligned requests and reject
> them (though ours doesn’t, it just traces such events[5] – note that
> it’s explicitly noted there that qemu will auto-align requests).
I know I said I didn't care about performance (in this case), but is
there in fact a penalty to sending unaligned requests to the qcow2
layer? Or perhaps it cannot compress them?
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-top is 'top' for virtual machines. Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://people.redhat.com/~rjones/virt-top
next prev parent reply other threads:[~2022-01-28 13:09 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-28 11:07 Block alignment of qcow2 compress driver Richard W.M. Jones
2022-01-28 11:39 ` Hanna Reitz
2022-01-28 11:48 ` Richard W.M. Jones
2022-01-28 11:57 ` Hanna Reitz
2022-01-28 12:18 ` Richard W.M. Jones [this message]
2022-01-28 12:30 ` Hanna Reitz
2022-01-28 13:19 ` Kevin Wolf
2022-01-28 13:36 ` Richard W.M. Jones
2022-01-28 13:30 ` Richard W.M. Jones
2022-01-28 13:37 ` Richard W.M. Jones
2022-01-28 21:22 ` Eric Blake
2022-01-28 11:56 ` Richard W.M. Jones
2022-01-28 21:40 ` Eric Blake
2022-02-01 14:13 ` Vladimir Sementsov-Ogievskiy
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=20220128121803.GS1127@redhat.com \
--to=rjones@redhat.com \
--cc=andrey.shinkevich@virtuozzo.com \
--cc=eblake@redhat.com \
--cc=hreitz@redhat.com \
--cc=kwolf@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.