Am 24.02.2016 um 10:28 hat Markus Armbruster geschrieben: > Max Reitz <mre...@redhat.com> writes: > > > On 23.02.2016 10:48, Markus Armbruster wrote: > >> Max Reitz <mre...@redhat.com> writes: > >> > >>> On 22.02.2016 09:24, Markus Armbruster wrote: > >>>> Max Reitz <mre...@redhat.com> writes: > >>>> > >>>>> On 17.02.2016 17:20, Kevin Wolf wrote: > >>>>>> Am 17.02.2016 um 16:41 hat Max Reitz geschrieben: > >>>>>>> On 17.02.2016 11:53, Kevin Wolf wrote: > >>>>>>>> Am 16.02.2016 um 19:08 hat Max Reitz geschrieben: > >>>>>>>>> The monitor does hold references to some BlockBackends so it should > >>>>>>>>> have > >>>>>>>> > >>>>>>>> s/does hold/holds/? > >>>>>>> > >>>>>>> It was intentional, so I'd keep it unless you drop the question mark. > >>>>>> > >>>>>> For me it seems to imply something like "contrary to your > >>>>>> expectations", > >>>>>> but maybe that's just my non-native English needing a fix. > >>>>>> > >>>>>> I don't find it surprising anyway that the monitor holds BB references. > >>>> > >>>> Me neither. > >>>> > >>>>> The contrast I tried to point out is that while we do have these > >>>>> references in theory, and they are reflected by a refcount, too, we do > >>>>> not actually have these references because the monitor does not yet have > >>>>> a list of the BBs it owns. > >>>> > >>>> Oh yes, it has. It's just outsources their actual storage to > >>>> block-backend.c, but that's detail. > >>> > >>> In my opinion it's not a reference made by the monitor, then, especially > >>> because it's done through magic. With this interpretation, > >>> block-backend.c considers every BB to be monitor-owned (until > >>> blk_hide...() is called). > >> > >> block-backend.c holds a reference from blk_backends. By *why* does it > >> do that? Let's go through the uses of blk_backends. > >> > >> 0. blk_backends maintenance: blk_new(), blk_delete(), > >> blk_hide_on_behalf_of_hmp_drive_del() > >> > >> 1. To permit lookup by name, with blk_by_name(). > >> > >> In my view, block-backend.c holds this reference in trust for those > >> parts of QEMU that reference by name rather than by pointer, most > >> prominently the monitor. > >> > >> I can't see the point of backing up the reference by name with a > >> reference by pointer in the monitor, like your patch seems to do. > >> What's the difference between the two? Can one ever exist without > >> the other? Why in the monitor, and not in any other part looking up > >> by name? > >> > >> 2. To iterate over all named ones, with blk_next(). > >> > >> Since this can only return named BBs, the reference held in trust for > >> named lookup suffices. > >> > >> 3. To permit lookup by DriveInfo, with blk_by_legacy_dinfo() > >> > >> Since this must only return named BBs, the reference held in trust > >> for named lookup suffices. > >> > >> 4. To do something so unimportant that it's not worth explaining, with > >> blk_remove_bs(). > >> > >> I made a point of giving every single external function a carefully > >> worded contract, to hopefully shame future contributors into > >> following suit. Didn't work. > > > > Side note: I consider it very important and there was no other way to do > > it before this series, because there is no list of all block backends. > > > >>> Also, if blk_backends is supposed to be the list of monitor-owned BBs, > >>> then it's a really bad name and I put all the blame on that. > >> > >> Naming is hard. Feel free to propose better comments and/or better > >> names. > > > > I did. It's "monitor_block_backends". > > > >>>>> So it's not an "emphasize the verb because it may be contrary to your > >>>>> expectations", but an "emphasize it because it is contrary to what the > >>>>> current code does" (which is not actually referencing these BBs). > >>>> > >>>> I disagree :) > >>> > >>> Then I'd say "It's contrary to my interpretation of what the current > >>> code wants to do." Now it's my personal opinion! ;-) > >>> > >>> I wouldn't mind removing the "does" from the commit message (obviously), > >>> but that is not the only thing there which conflicts with your opinion. > >>> It clearly states that blk_backends is not the list of monitor-owned > >>> BlockBackends, whereas you are saying that it very much is. > >>> > >>> So...? Rephrase it entirely? State that blk_backends is a bad name and > >>> this commit is basically duplicating blk_backends as > >>> monitor_block_backends, which is the correct name, and that a follow-up > >>> commit will make blk_backends contain what it name implies it does? Or > >>> just call the commit "Remove magic", because it adds explicit functions > >>> for saying that a BB is monitor-owned or that it is not? > >> > >> Can you explain the *actual* difference between blk_backends and > >> monitor_block_backends? "Actual" in the sense of difference in contents > >> over time. > > > > First difference: The name. That's enough reason for me. > > > > Second difference: blk_new() adds any BB to blk_backends automatically. > > It doesn't do so for monitor_block_backends. > > > > Third difference: Often the monitor doesn't take care of signalling that > > it's releasing its reference, only sometimes (where "sometimes" means > > every time blk_hide...() is called). blk_delete() will instead > > automatically remove it from blk_backends, because it's assuming that > > the last reference had been held by the monitor. > > The reference held in trust for lookup by name exists as long as lookup > by name is permitted. > > Therefore, it goes away when the BB dies or when it loses its name. > > The only way for a BB to lose its name is (was?) the messed up HMP > drive_del: it wants to kill the BB right away, but can't, so it needs to > hide it instead until it can. > > New functionality may lead to a more complex live cycle where BBs may > acquire and lose their name in new ways. > > Note that I carefully avoid calling the reference the monitor's > reference. Because you made me realize it's not the monitor's alone! > Lookup by name has more customers than just the monitor.
Legitimate ones or bugs to fix? > > The second and third difference are what I referred to as "magic". You > > could also call them "convenience", if you prefer, but in any case as we > > can see by the existence blk_hide...(), removing the monitor reference > > in blk_delete() appears to be wrong. Both should be separate operations, > > and this is what this patch does. > > I can't see how the existence of blk_hide_on_behalf_of_hmp_drive_del() > shows that the name going away in blk_delete() is wrong. It must go > away there, because the thing it names goes away. It must go away there _the latest_, but it can (should?) go away earlier. > Additional operations to add / remove a BBs name may make sense; I'd > have to see their users. See "more complex live cycle" above. > > > Assuming that any blk_new() is ultimately done by the monitor, we maybe > > actually do not need an own monitor_add_blk() function; except that > > Kevin stated that he does deem it useful when I proposed inlining it > > (back) into blk_new(). > > As Kevin noted, that's not a good assumption. > > > All in all, you have convinced me that the commit message is incorrect. > > It should state that blk_backends is effectively repurposed to contain > > the list of all BBs, and that a more explicit monitor_block_backends > > list will take its place, with explicit operations for the monitor to > > signal when it takes or releases the reference to a BB. > > A member of monitor_block_backends is always a member of blk_backends. > Correct? > > Is a member of blk_backends with a name always a member of > monitor_block_backends? I would have expected that yes, but apparently you found other places that use the name, so it might not be as clear as I thought it was. Kevin