qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Cc: qemu-block@nongnu.org, armbru@redhat.com, qemu-devel@nongnu.org,
	mreitz@redhat.com, den@openvz.org, jsnow@redhat.com
Subject: Re: [PATCH v2 15/36] block: use topological sort for permission update
Date: Wed, 10 Mar 2021 12:55:06 +0100	[thread overview]
Message-ID: <20210310115506.GC6076@merkur.fritz.box> (raw)
In-Reply-To: <61c15d60-6d32-3f18-8f17-1104cb7bf683@virtuozzo.com>

Am 10.03.2021 um 12:08 hat Vladimir Sementsov-Ogievskiy geschrieben:
> 03.02.2021 21:38, Kevin Wolf wrote:
> > Am 28.01.2021 um 19:04 hat Vladimir Sementsov-Ogievskiy geschrieben:
> > > 28.01.2021 20:13, Kevin Wolf wrote:
> > > > Am 28.01.2021 um 10:34 hat Vladimir Sementsov-Ogievskiy geschrieben:
> > > > > 27.01.2021 21:38, Kevin Wolf wrote:
> > > > > > Am 27.11.2020 um 15:45 hat Vladimir Sementsov-Ogievskiy geschrieben:
> > > > > > > -static int bdrv_check_perm(BlockDriverState *bs, BlockReopenQueue *q,
> > > > > > > -                           uint64_t cumulative_perms,
> > > > > > > -                           uint64_t cumulative_shared_perms,
> > > > > > > -                           GSList *ignore_children, Error **errp)
> > > > > > > +static int bdrv_node_check_perm(BlockDriverState *bs, BlockReopenQueue *q,
> > > > > > > +                                uint64_t cumulative_perms,
> > > > > > > +                                uint64_t cumulative_shared_perms,
> > > > > > > +                                GSList *ignore_children, Error **errp)
> > > > > > >     {
> > > > > > >         BlockDriver *drv = bs->drv;
> > > > > > >         BdrvChild *c;
> > > > > > > @@ -2166,21 +2193,43 @@ static int bdrv_check_perm(BlockDriverState *bs, BlockReopenQueue *q,
> > > > > > >         /* Check all children */
> > > > > > >         QLIST_FOREACH(c, &bs->children, next) {
> > > > > > >             uint64_t cur_perm, cur_shared;
> > > > > > > -        GSList *cur_ignore_children;
> > > > > > >             bdrv_child_perm(bs, c->bs, c, c->role, q,
> > > > > > >                             cumulative_perms, cumulative_shared_perms,
> > > > > > >                             &cur_perm, &cur_shared);
> > > > > > > +        bdrv_child_set_perm_safe(c, cur_perm, cur_shared, NULL);
> > > > > > 
> > > > > > This "added" line is actually old code. What is removed here is the
> > > > > > recursive call of bdrv_check_update_perm(). This is what the code below
> > > > > > will have to replace.
> > > > > 
> > > > > yes, we'll use explicit loop instead of recursion
> > > > > 
> > > > > > 
> > > > > > > +    }
> > > > > > > +
> > > > > > > +    return 0;
> > > > > > > +}
> > > > > > > +
> > > > > > > +static int bdrv_check_perm(BlockDriverState *bs, BlockReopenQueue *q,
> > > > > > > +                           uint64_t cumulative_perms,
> > > > > > > +                           uint64_t cumulative_shared_perms,
> > > > > > > +                           GSList *ignore_children, Error **errp)
> > > > > > > +{
> > > > > > > +    int ret;
> > > > > > > +    BlockDriverState *root = bs;
> > > > > > > +    g_autoptr(GSList) list = bdrv_topological_dfs(NULL, NULL, root);
> > > > > > > +
> > > > > > > +    for ( ; list; list = list->next) {
> > > > > > > +        bs = list->data;
> > > > > > > +
> > > > > > > +        if (bs != root) {
> > > > > > > +            if (!bdrv_check_parents_compliance(bs, ignore_children, errp)) {
> > > > > > > +                return -EINVAL;
> > > > > > > +            }
> > > > > > 
> > > > > > At this point bs still had the old permissions, but we don't access
> > > > > > them. As we're going in topological order, the parents have already been
> > > > > > updated if they were a child covered in bdrv_node_check_perm(), so we're
> > > > > > checking the relevant values. Good.
> > > > > > 
> > > > > > What about the root node? If I understand correctly, the parents of the
> > > > > > root nodes wouldn't have been checked in the old code. In the new state,
> > > > > > the parent BdrvChild already has to contain the new permission.
> > > > > > 
> > > > > > In bdrv_refresh_perms(), we already check parent conflicts, so no change
> > > > > > for all callers going through it. Good.
> > > > > > 
> > > > > > bdrv_reopen_multiple() is less obvious. It passes permissions from the
> > > > > > BDRVReopenState, without applying the permissions first.
> > > > > 
> > > > > It will be changed in the series
> > > > > 
> > > > > > Do we check the
> > > > > > old parent permissions instead of the new state here?
> > > > > 
> > > > > We use given (new) cumulative permissions for bs, and recalculate
> > > > > permissions for bs subtree.
> > > > 
> > > > Where do we actually set them? I would expect a
> > > > bdrv_child_set_perm_safe() call somewhere, but I can't see it in the
> > > > call path from bdrv_reopen_multiple().
> > > 
> > > You mean parent BdrvChild objects? Then this question applies as well
> > > to pre-patch code.
> > 
> > I don't think so. The pre-patch code doesn't rely on the permissions
> > already being set in the BdrvChild object, but it gets them passed in
> > parameters. Changing the graph first and relying on the information in
> > BdrvChild is the new approach that you're introducing.
> 
> New code still pass permissions as parameters for root node. And only
> inside subtree we rely on updated parents. But that's correct due to
> topological order of updating.
> 
> 
> OK, that's incorrect for the following case: when one of the parents (X)
> of inner node in bs subtree IS NOT in the bs subtree but IS in reopen queue.
> And we'll use wrong permission of X. Still:
> 
> 1. It's preexisting. bdrv_check_update_perm() doesn't take reopen queue
> in mind when calculate cumulative permissions (and ignore_children doesn't
> help for the described case
> 
> 2. We can hope that on next permission update, started from node X, permissions
> will become more correct
> 
> 3. At the end of series permission calculation in bdrv_reopen_multiple is
> rewritten anyway.

Yes, I think 3. is the strongest argument in favour of the patch.

Kevin



  reply	other threads:[~2021-03-10 11:56 UTC|newest]

Thread overview: 108+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-11-27 14:44 [PATCH v2 00/36] block: update graph permissions update Vladimir Sementsov-Ogievskiy
2020-11-27 14:44 ` [PATCH v2 01/36] tests/test-bdrv-graph-mod: add test_parallel_exclusive_write Vladimir Sementsov-Ogievskiy
2020-11-27 14:44 ` [PATCH v2 02/36] tests/test-bdrv-graph-mod: add test_parallel_perm_update Vladimir Sementsov-Ogievskiy
2021-01-18 14:05   ` Kevin Wolf
2021-01-18 17:13     ` Vladimir Sementsov-Ogievskiy
2020-11-27 14:44 ` [PATCH v2 03/36] block: bdrv_append(): don't consume reference Vladimir Sementsov-Ogievskiy
2021-01-18 14:18   ` Kevin Wolf
2021-01-18 17:21     ` Vladimir Sementsov-Ogievskiy
2021-01-18 17:59       ` Kevin Wolf
2020-11-27 14:44 ` [PATCH v2 04/36] block: bdrv_append(): return status Vladimir Sementsov-Ogievskiy
2020-12-14 15:49   ` Alberto Garcia
2021-01-18 14:32   ` Kevin Wolf
2020-11-27 14:44 ` [PATCH v2 05/36] block: add bdrv_parent_try_set_aio_context Vladimir Sementsov-Ogievskiy
2021-01-18 15:08   ` Kevin Wolf
2021-01-18 17:26     ` Vladimir Sementsov-Ogievskiy
2020-11-27 14:44 ` [PATCH v2 06/36] block: BdrvChildClass: add .get_parent_aio_context handler Vladimir Sementsov-Ogievskiy
2021-01-18 15:13   ` Kevin Wolf
2021-01-18 17:36     ` Vladimir Sementsov-Ogievskiy
2021-01-19 16:38       ` Kevin Wolf
2021-01-22 11:04         ` Vladimir Sementsov-Ogievskiy
2021-01-22 11:18           ` Kevin Wolf
2021-01-22 11:26             ` Vladimir Sementsov-Ogievskiy
2020-11-27 14:44 ` [PATCH v2 07/36] block: drop ctx argument from bdrv_root_attach_child Vladimir Sementsov-Ogievskiy
2020-11-27 14:44 ` [PATCH v2 08/36] block: make bdrv_reopen_{prepare, commit, abort} private Vladimir Sementsov-Ogievskiy via
2020-12-15 17:28   ` Alberto Garcia
2021-01-18 15:24   ` [PATCH v2 08/36] block: make bdrv_reopen_{prepare,commit,abort} private Kevin Wolf
2020-11-27 14:44 ` [PATCH v2 09/36] block: return value from bdrv_replace_node() Vladimir Sementsov-Ogievskiy
2020-12-15 17:30   ` Alberto Garcia
2021-01-18 15:40   ` Kevin Wolf
2020-11-27 14:44 ` [PATCH v2 10/36] util: add transactions.c Vladimir Sementsov-Ogievskiy
2021-01-18 16:50   ` Kevin Wolf
2021-01-18 17:41     ` Vladimir Sementsov-Ogievskiy
2020-11-27 14:44 ` [PATCH v2 11/36] block: bdrv_refresh_perms: check parents compliance Vladimir Sementsov-Ogievskiy
2021-01-19 17:42   ` Kevin Wolf
2021-01-19 18:10     ` Vladimir Sementsov-Ogievskiy
2020-11-27 14:44 ` [PATCH v2 12/36] block: refactor bdrv_child* permission functions Vladimir Sementsov-Ogievskiy
2021-01-19 18:09   ` Kevin Wolf
2021-01-19 18:30     ` Vladimir Sementsov-Ogievskiy
2021-01-20  9:09       ` Kevin Wolf
2021-01-20  9:56         ` Vladimir Sementsov-Ogievskiy
2021-01-20 10:06           ` Kevin Wolf
2020-11-27 14:44 ` [PATCH v2 13/36] block: rewrite bdrv_child_try_set_perm() using bdrv_refresh_perms() Vladimir Sementsov-Ogievskiy
2020-11-27 14:45 ` [PATCH v2 14/36] block: inline bdrv_child_*() permission functions calls Vladimir Sementsov-Ogievskiy
2020-12-16 17:16   ` Alberto Garcia
2020-11-27 14:45 ` [PATCH v2 15/36] block: use topological sort for permission update Vladimir Sementsov-Ogievskiy
2021-01-27 18:38   ` Kevin Wolf
2021-01-28  9:34     ` Vladimir Sementsov-Ogievskiy
2021-01-28 17:13       ` Kevin Wolf
2021-01-28 18:04         ` Vladimir Sementsov-Ogievskiy
2021-02-03 18:38           ` Kevin Wolf
2021-02-04  7:16             ` Vladimir Sementsov-Ogievskiy
2021-03-10 11:08             ` Vladimir Sementsov-Ogievskiy
2021-03-10 11:55               ` Kevin Wolf [this message]
2020-11-27 14:45 ` [PATCH v2 16/36] block: add bdrv_drv_set_perm transaction action Vladimir Sementsov-Ogievskiy
2020-11-27 14:45 ` [PATCH v2 17/36] block: add bdrv_list_* permission update functions Vladimir Sementsov-Ogievskiy
2020-11-27 14:45 ` [PATCH v2 18/36] block: add bdrv_replace_child_safe() transaction action Vladimir Sementsov-Ogievskiy
2020-11-27 14:45 ` [PATCH v2 19/36] block: fix bdrv_replace_node_common Vladimir Sementsov-Ogievskiy
2021-02-03 18:23   ` Kevin Wolf
2021-02-04  7:24     ` Vladimir Sementsov-Ogievskiy
2020-11-27 14:45 ` [PATCH v2 20/36] block: add bdrv_attach_child_common() transaction action Vladimir Sementsov-Ogievskiy
2021-02-03 21:01   ` Kevin Wolf
2021-02-04  7:34     ` Vladimir Sementsov-Ogievskiy
2021-02-04  7:50       ` Kevin Wolf
2020-11-27 14:45 ` [PATCH v2 21/36] block: add bdrv_attach_child_noperm() " Vladimir Sementsov-Ogievskiy
2020-11-27 14:45 ` [PATCH v2 22/36] block: split out bdrv_replace_node_noperm() Vladimir Sementsov-Ogievskiy
2021-02-03 21:16   ` Kevin Wolf
2020-11-27 14:45 ` [PATCH v2 23/36] block: adapt bdrv_append() for inserting filters Vladimir Sementsov-Ogievskiy
2021-02-03 21:33   ` Kevin Wolf
2021-02-04  8:30     ` Vladimir Sementsov-Ogievskiy
2021-02-04  9:05       ` Kevin Wolf
2021-02-04 11:54         ` Vladimir Sementsov-Ogievskiy
2020-11-27 14:45 ` [PATCH v2 24/36] block: add bdrv_remove_backing transaction action Vladimir Sementsov-Ogievskiy
2020-11-27 14:45 ` [PATCH v2 25/36] block: introduce bdrv_drop_filter() Vladimir Sementsov-Ogievskiy
2021-02-04 11:31   ` Kevin Wolf
2021-02-04 12:27     ` Vladimir Sementsov-Ogievskiy
2020-11-27 14:45 ` [PATCH v2 26/36] block/backup-top: drop .active Vladimir Sementsov-Ogievskiy
2021-02-04 12:26   ` Kevin Wolf
2021-02-04 12:33     ` Vladimir Sementsov-Ogievskiy
2021-02-04 13:25       ` Kevin Wolf
2021-02-04 13:46         ` Vladimir Sementsov-Ogievskiy
2021-02-04 14:31           ` Kevin Wolf
2020-11-27 14:45 ` [PATCH v2 27/36] block: drop ignore_children for permission update functions Vladimir Sementsov-Ogievskiy
2020-11-27 14:45 ` [PATCH v2 28/36] block: add bdrv_set_backing_noperm() transaction action Vladimir Sementsov-Ogievskiy
2021-02-05 14:00   ` Kevin Wolf
2021-02-05 16:06     ` Vladimir Sementsov-Ogievskiy
2021-02-05 16:30       ` Kevin Wolf
2021-03-11 18:29         ` Vladimir Sementsov-Ogievskiy
2021-02-05 16:26   ` Kevin Wolf
2021-02-08  9:34     ` Vladimir Sementsov-Ogievskiy
2020-11-27 14:45 ` [PATCH v2 29/36] blockdev: qmp_x_blockdev_reopen: acquire all contexts Vladimir Sementsov-Ogievskiy
2021-02-05 16:01   ` Kevin Wolf
2021-02-05 16:16     ` Vladimir Sementsov-Ogievskiy
2021-02-05 16:36       ` Kevin Wolf
2020-11-27 14:45 ` [PATCH v2 30/36] block: bdrv_reopen_multiple: refresh permissions on updated graph Vladimir Sementsov-Ogievskiy
2021-02-05 17:57   ` Kevin Wolf
2021-02-08 11:21     ` Vladimir Sementsov-Ogievskiy
2021-02-10 14:13       ` Kevin Wolf
2021-02-10 14:38       ` Kevin Wolf
2020-11-27 14:45 ` [PATCH v2 31/36] block: drop unused permission update functions Vladimir Sementsov-Ogievskiy
2020-11-27 14:45 ` [PATCH v2 32/36] block: inline bdrv_check_perm_common() Vladimir Sementsov-Ogievskiy
2020-11-27 14:45 ` [PATCH v2 33/36] block: inline bdrv_replace_child() Vladimir Sementsov-Ogievskiy
2020-11-27 14:45 ` [PATCH v2 34/36] block: refactor bdrv_child_set_perm_safe() transaction action Vladimir Sementsov-Ogievskiy
2021-02-10 14:51   ` Kevin Wolf
2020-11-27 14:45 ` [PATCH v2 35/36] block: rename bdrv_replace_child_safe() to bdrv_replace_child() Vladimir Sementsov-Ogievskiy
2020-11-27 14:45 ` [PATCH v2 36/36] block: refactor bdrv_node_check_perm() Vladimir Sementsov-Ogievskiy
2021-02-10 15:07   ` Kevin Wolf
2021-02-11  9:50     ` Vladimir Sementsov-Ogievskiy
2021-01-09 10:12 ` [PATCH v2 00/36] block: update graph permissions update 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=20210310115506.GC6076@merkur.fritz.box \
    --to=kwolf@redhat.com \
    --cc=armbru@redhat.com \
    --cc=den@openvz.org \
    --cc=jsnow@redhat.com \
    --cc=mreitz@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).