From: Max Reitz <mreitz@redhat.com>
To: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>,
"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>,
"qemu-block@nongnu.org" <qemu-block@nongnu.org>
Cc: "fam@euphon.net" <fam@euphon.net>,
"kwolf@redhat.com" <kwolf@redhat.com>,
"berto@igalia.com" <berto@igalia.com>,
Denis Lunev <den@virtuozzo.com>,
"wencongyang2@huawei.com" <wencongyang2@huawei.com>,
"xiechanglong.d@gmail.com" <xiechanglong.d@gmail.com>,
"stefanha@redhat.com" <stefanha@redhat.com>,
Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>,
"jsnow@redhat.com" <jsnow@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v6 3/3] block/stream: introduce a bottom node
Date: Wed, 29 May 2019 13:53:02 +0200 [thread overview]
Message-ID: <3a1e038c-bd09-5aa2-19a3-56e2819ea01d@redhat.com> (raw)
In-Reply-To: <2a950448-96b1-e48a-684f-3c8e1bdfecf1@virtuozzo.com>
[-- Attachment #1: Type: text/plain, Size: 4793 bytes --]
On 29.05.19 13:44, Vladimir Sementsov-Ogievskiy wrote:
> 29.05.2019 14:23, Max Reitz wrote:
>> On 29.05.19 09:34, Vladimir Sementsov-Ogievskiy wrote:
>>> 28.05.2019 20:33, Max Reitz wrote:
>>>> On 06.05.19 17:34, Vladimir Sementsov-Ogievskiy wrote:
>>>>> From: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
>>>>>
>>>>> The bottom node is the intermediate block device that has the base as its
>>>>> backing image. It is used instead of the base node while a block stream
>>>>> job is running to avoid dependency on the base that may change due to the
>>>>> parallel jobs. The change may take place due to a filter node as well that
>>>>> is inserted between the base and the intermediate bottom node. It occurs
>>>>> when the base node is the top one for another commit or stream job.
>>>>> After the introduction of the bottom node, don't freeze its backing child,
>>>>> that's the base, anymore.
>>>>>
>>>>> Suggested-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>>>>> Signed-off-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
>>>>> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>>>>> Reviewed-by: Alberto Garcia <berto@igalia.com>
>>>>> ---
>>>>> block/stream.c | 49 +++++++++++++++++++++---------------------
>>>>> tests/qemu-iotests/245 | 4 ++--
>>>>> 2 files changed, 27 insertions(+), 26 deletions(-)
>>>>>
>>>>> diff --git a/block/stream.c b/block/stream.c
>>>>> index 65b13b27e0..fc97c89f81 100644
>>>>> --- a/block/stream.c
>>>>> +++ b/block/stream.c
>>>>
>>>> [...]
>>>>
>>>>> @@ -248,26 +250,25 @@ void stream_start(const char *job_id, BlockDriverState *bs,
>>>>> * already have our own plans. Also don't allow resize as the image size is
>>>>> * queried only at the job start and then cached. */
>>>>> s = block_job_create(job_id, &stream_job_driver, NULL, bs,
>>>>> - BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE_UNCHANGED |
>>>>> - BLK_PERM_GRAPH_MOD,
>>>>> - BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE_UNCHANGED |
>>>>> - BLK_PERM_WRITE,
>>>>> + basic_flags | BLK_PERM_GRAPH_MOD,
>>>>> + basic_flags | BLK_PERM_WRITE,
>>>>> speed, creation_flags, NULL, NULL, errp);
>>>>> if (!s) {
>>>>> goto fail;
>>>>> }
>>>>>
>>>>> - /* Block all intermediate nodes between bs and base, because they will
>>>>> - * disappear from the chain after this operation. The streaming job reads
>>>>> - * every block only once, assuming that it doesn't change, so block writes
>>>>> - * and resizes. */
>>>>> - for (iter = backing_bs(bs); iter && iter != base; iter = backing_bs(iter)) {
>>>>> - block_job_add_bdrv(&s->common, "intermediate node", iter, 0,
>>>>> - BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE_UNCHANGED,
>>>>> - &error_abort);
>>>>> + /*
>>>>> + * Block all intermediate nodes between bs and bottom (inclusive), because
>>>>> + * they will disappear from the chain after this operation. The streaming
>>>>> + * job reads every block only once, assuming that it doesn't change, so
>>>>> + * forbid writes and resizes.
>>>>> + */
>>>>> + for (iter = bs; iter != bottom; iter = backing_bs(iter)) {
>>>>> + block_job_add_bdrv(&s->common, "intermediate node", backing_bs(iter),
>>>>> + 0, basic_flags, &error_abort);
>>>>
>>>> I don’t understand this change. Isn’t it doing exactly the same as before?
>>>>
>>>> (If so, I just find it harder to read because every iteration isn’t
>>>> about @iter but backing_bs(iter).)
>>>
>>> Hm, it's the same, but not using base. We may save old loop if calculate base exactly before
>>> the loop (or at least not separated from it by any yield-point)
>>
>> But we are still in stream_start() here. base cannot have changed yet,
>> can it?
>>
>> (I don’t even think this is about yield points. As long as
>> stream_start() doesn’t return, the QMP monitor won’t receive any new
>> commands.)
>>
>
> But block graph may be modified not only from qmp. From block jobs too. If base is another filter, it may
> be dropped in any time.
Ah, yes, that’s true. And I suppose that can happen in
bdrv_reopen_set_read_only(). Hm.
OK, I still don’t like the loop how it is currently written. Maybe I’d
like it better with s/iter/parent_bs/?
Well, or you proposed would work, too, i.e. base = backing_bs(bottom)
just before the loop – with a comment that explains why we need that.
That’s probably better.
Max
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
next prev parent reply other threads:[~2019-05-29 11:56 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-06 15:34 [Qemu-devel] [PATCH v6 0/3] block/stream: get rid of the base Vladimir Sementsov-Ogievskiy
2019-05-06 15:34 ` [Qemu-devel] [PATCH v6 1/3] block: include base when checking image chain for block allocation Vladimir Sementsov-Ogievskiy
2019-05-28 17:15 ` Max Reitz
2019-05-06 15:34 ` [Qemu-devel] [PATCH v6 2/3] block/stream: refactor stream_run: drop goto Vladimir Sementsov-Ogievskiy
2019-05-28 17:17 ` Max Reitz
2019-05-06 15:34 ` [Qemu-devel] [PATCH v6 3/3] block/stream: introduce a bottom node Vladimir Sementsov-Ogievskiy
2019-05-28 17:33 ` Max Reitz
2019-05-29 7:34 ` Vladimir Sementsov-Ogievskiy
2019-05-29 11:23 ` Max Reitz
2019-05-29 11:44 ` Vladimir Sementsov-Ogievskiy
2019-05-29 11:53 ` Max Reitz [this message]
2019-05-21 7:51 ` [Qemu-devel] [PATCH v6 0/3] block/stream: get rid of the base 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=3a1e038c-bd09-5aa2-19a3-56e2819ea01d@redhat.com \
--to=mreitz@redhat.com \
--cc=andrey.shinkevich@virtuozzo.com \
--cc=berto@igalia.com \
--cc=den@virtuozzo.com \
--cc=fam@euphon.net \
--cc=jsnow@redhat.com \
--cc=kwolf@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
--cc=vsementsov@virtuozzo.com \
--cc=wencongyang2@huawei.com \
--cc=xiechanglong.d@gmail.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).