qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Hanna Reitz <hreitz@redhat.com>
To: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>,
	qemu-block@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>, qemu-devel@nongnu.org
Subject: Re: [PATCH 4/7] block: Drop detached child from ignore list
Date: Wed, 10 Nov 2021 18:32:14 +0100	[thread overview]
Message-ID: <bc5eef2c-28b2-4e22-49b9-0f694b20ca33@redhat.com> (raw)
In-Reply-To: <9509e689-95cb-ec98-e27d-7f3a35e22503@virtuozzo.com>

On 10.11.21 14:38, Vladimir Sementsov-Ogievskiy wrote:
> 04.11.2021 13:38, Hanna Reitz wrote:
>> bdrv_attach_child_common_abort() restores the parent's AioContext.  To
>> do so, the child (which was supposed to be attached, but is now detached
>> again by this abort handler) is added to the ignore list for the
>> AioContext changing functions.
>>
>> However, since we modify a BDS's children list in the BdrvChildClass's
>> .attach and .detach handlers, the child is already effectively detached
>> from the parent by this point.  We do not need to put it into the ignore
>> list.
>>
>> Use this opportunity to clean up the empty line structure: Keep setting
>> the ignore list, invoking the AioContext function, and freeing the
>> ignore list in blocks separated by empty lines.
>>
>> Signed-off-by: Hanna Reitz <hreitz@redhat.com>
>
>
> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>
>
> What comes in my mind, is that now bdrv_replace_child_noperm() is more 
> strong in detaching.. But may be not enough strong: we still have link 
> from the child to parent (child->opaque).. Maybe more correct for 
> BdrvChild object to have no relation with parent after detaching. But 
> than we'll need some GenericParent object (as child->class is mostly 
> about parent, not about child and even not about the edge).. Now 
> GenericParent is "included" into BdrvChild, which represents both 
> GenericParent and Edge objects..

Yes, I thought about this in exactly this function here 
(bdrv_attach_child_common_abort()).  I was wondering whether I could 
save a pointer to the BdrvChildClass, then just let 
bdrv_replace_child_noperm() free the child, and then invoke the 
BdrvChildClass methods when the child is already gone.  As you say, it’s 
really just about the parent, and child->opaque is effectively just a 
pointer to the parent object, so all of the methods that only use 
child->opaque and nothing else from the BdrvChild object can be invoked 
even after the child is gone.

But doing something about that (like changing some methods like the 
AioContext methods to only take the opaque pointer) was too invasive for 
me for this series, so in case of this function I decided to just 
begrudgingly keep the BdrvChild object around, including its 
back-connection to the parent (via child->opaque), and free it at the 
end of the function.

Besides that back-connection, there’s also to consider that some block 
drivers can keep pointers to special children in their BDS 
“subclasses”.  For example, qcow2 keeps s->data_file.  That’s a problem 
just like bs->backing or bs->file, except that it’s much more unlikely 
to cause problems in practice, and that it would probably be even more 
invasive to fix...

Hanna

>> ---
>>   block.c | 8 +++++---
>>   1 file changed, 5 insertions(+), 3 deletions(-)
>>
>> diff --git a/block.c b/block.c
>> index b95f8dcf8f..6d230ad3d1 100644
>> --- a/block.c
>> +++ b/block.c
>> @@ -2774,14 +2774,16 @@ static void 
>> bdrv_attach_child_common_abort(void *opaque)
>>       }
>>         if (bdrv_child_get_parent_aio_context(child) != 
>> s->old_parent_ctx) {
>> -        GSList *ignore = g_slist_prepend(NULL, child);
>> +        GSList *ignore;
>>   +        /* No need to ignore `child`, because it has been detached 
>> already */
>> +        ignore = NULL;
>>           child->klass->can_set_aio_ctx(child, s->old_parent_ctx, 
>> &ignore,
>>                                         &error_abort);
>>           g_slist_free(ignore);
>> -        ignore = g_slist_prepend(NULL, child);
>> -        child->klass->set_aio_ctx(child, s->old_parent_ctx, &ignore);
>>   +        ignore = NULL;
>> +        child->klass->set_aio_ctx(child, s->old_parent_ctx, &ignore);
>>           g_slist_free(ignore);
>>       }
>>
>
>



  reply	other threads:[~2021-11-10 17:33 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-11-04 10:38 [PATCH 0/7] block: Attempt on fixing 030-reported errors Hanna Reitz
2021-11-04 10:38 ` [PATCH 1/7] stream: Traverse graph after modification Hanna Reitz
2021-11-10 12:17   ` Vladimir Sementsov-Ogievskiy
2021-11-04 10:38 ` [PATCH 2/7] block: Manipulate children list in .attach/.detach Hanna Reitz
2021-11-10 12:46   ` Vladimir Sementsov-Ogievskiy
2021-11-10 15:05     ` Hanna Reitz
2021-11-10 12:51   ` Vladimir Sementsov-Ogievskiy
2021-11-10 15:12     ` Hanna Reitz
2021-11-04 10:38 ` [PATCH 3/7] block: Unite remove_empty_child and child_free Hanna Reitz
2021-11-10 12:52   ` Vladimir Sementsov-Ogievskiy
2021-11-04 10:38 ` [PATCH 4/7] block: Drop detached child from ignore list Hanna Reitz
2021-11-10 13:38   ` Vladimir Sementsov-Ogievskiy via
2021-11-10 17:32     ` Hanna Reitz [this message]
2021-11-04 10:38 ` [PATCH 5/7] block: Pass BdrvChild ** to replace_child_noperm Hanna Reitz
2021-11-05 15:15   ` Kevin Wolf
2021-11-08  9:58     ` Hanna Reitz
2021-11-04 10:38 ` [PATCH 6/7] block: Let replace_child_noperm free children Hanna Reitz
2021-11-05 15:41   ` Kevin Wolf
2021-11-08 10:12     ` Hanna Reitz
2021-11-04 10:38 ` [PATCH 7/7] iotests/030: Unthrottle parallel jobs in reverse Hanna Reitz
2021-11-04 11:58 ` [PATCH 0/7] block: Attempt on fixing 030-reported errors Kevin Wolf
2021-11-04 13:34   ` Hanna Reitz
2021-11-05 15:44 ` Kevin Wolf

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=bc5eef2c-28b2-4e22-49b9-0f694b20ca33@redhat.com \
    --to=hreitz@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=vsementsov@virtuozzo.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).