All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: Eric Blake <eblake@redhat.com>
Cc: qemu-devel@nongnu.org, qemu-block@nongnu.org, mreitz@redhat.com
Subject: Re: [RFC PATCH 13/22] block/export: Move refcount from NBDExport to BlockExport
Date: Thu, 20 Aug 2020 16:15:14 +0200	[thread overview]
Message-ID: <20200820141514.GF99531@linux.fritz.box> (raw)
In-Reply-To: <0ff82c83-16eb-c544-553a-9a58c9453133@redhat.com>

Am 19.08.2020 um 22:58 hat Eric Blake geschrieben:
> On 8/13/20 11:29 AM, Kevin Wolf wrote:
> > Having a refcount makes sense for all types of block exports. It is also
> > a prerequisite for keeping a list of all exports at the BlockExport
> > level.
> > 
> > Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> > ---
> 
> > +++ b/include/block/export.h
> > @@ -21,14 +21,24 @@ typedef struct BlockExport BlockExport;
> >   typedef struct BlockExportDriver {
> >       BlockExportType type;
> >       BlockExport *(*create)(BlockExportOptions *, Error **);
> > +    void (*delete)(BlockExport *);
> >   } BlockExportDriver;
> >   struct BlockExport {
> >       const BlockExportDriver *drv;
> > +
> > +    /*
> > +     * Reference count for this block export. This includes strong references
> > +     * both from the owner (qemu-nbd or the monitor) and clients connected to
> > +     * the export.
> 
> I guess 'the monitor' includes qemu-storage-daemon.

Yes, qemu-storage-daemon has a QMP monitor, so I would count it there.
Even the --export command line option only calls the QMP command
internally.

> > +     */
> > +    int refcount;
> >   };
> >   extern const BlockExportDriver blk_exp_nbd;
> >   BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp);
> > +void blk_exp_ref(BlockExport *exp);
> > +void blk_exp_unref(BlockExport *exp);
> 
> Yay, I think this naming is more consistent with the rest of qemu...
> 
> >   #endif
> > diff --git a/include/block/nbd.h b/include/block/nbd.h
> > index 23030db3f1..af8509ab70 100644
> > --- a/include/block/nbd.h
> > +++ b/include/block/nbd.h
> > @@ -336,8 +336,6 @@ NBDExport *nbd_export_new(BlockDriverState *bs,
> >   void nbd_export_set_on_eject_blk(BlockExport *exp, BlockBackend *blk);
> >   void nbd_export_close(NBDExport *exp);
> >   void nbd_export_remove(NBDExport *exp, NbdServerRemoveMode mode, Error **errp);
> > -void nbd_export_get(NBDExport *exp);
> > -void nbd_export_put(NBDExport *exp);
> 
> ...as opposed to this which is common in kernel but less so in this project.
> No hard feelings from me :)
> 
> > +++ b/blockdev-nbd.c
> > @@ -232,7 +232,7 @@ BlockExport *nbd_export_create(BlockExportOptions *exp_args, Error **errp)
> >       /* The list of named exports has a strong reference to this export now and
> >        * our only way of accessing it is through nbd_export_find(), so we can drop
> >        * the strong reference that is @exp. */
> > -    nbd_export_put(exp);
> > +    blk_exp_unref((BlockExport*) exp);
> 
> Even a helper function that converts NBDBlockExport* to BlockExport* rather
> than a cast might be nicer, but then again, I see from Max's review that
> this may be a temporary state of things.
> (The QAPI contains such type-safe container casts, such as
> qapi_DriveBackup_base(), if that helps...)

Yes, this goes away before the end of the series.

> > @@ -1537,7 +1536,8 @@ NBDExport *nbd_export_new(BlockDriverState *bs,
> >       exp = g_new0(NBDExport, 1);
> >       exp->common = (BlockExport) {
> > -        .drv = &blk_exp_nbd,
> > +        .drv        = &blk_exp_nbd,
> > +        .refcount   = 1,
> 
> I'm not sure whether trying to align the '=' is good, because the moment you
> add a longer field name, every other line has to be touched.  I'm fine with
> just one space on both side of =, even if it is more ragged to read.  But
> you're the author, so you get to pick.

I generally prefer aligned '=' because the code is read much more often
than it is written or modified, so being friendly for readers is
important.

> > @@ -1626,8 +1625,9 @@ NBDExport *nbd_export_new(BlockDriverState *bs,
> >       exp->ctx = ctx;
> >       blk_add_aio_context_notifier(blk, blk_aio_attached, blk_aio_detach, exp);
> > +    blk_exp_ref(&exp->common);
> >       QTAILQ_INSERT_TAIL(&exports, exp, next);
> > -    nbd_export_get(exp);
> > +
> 
> Is there any consequence to this changed ordering in grabbing the reference
> vs. updating the list?

No intended consequences, but if Max is right that the code (before and
after this series) lacks some locking, it might make a theoretical
difference. If it does, the new code is safer than the old one. If it
doesn't, it's just more consistent with the order I'm used to see in
other places: First take the reference, then use it.

Kevin



  reply	other threads:[~2020-08-20 14:16 UTC|newest]

Thread overview: 90+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-08-13 16:29 [RFC PATCH 00/22] block/export: Add infrastructure and QAPI for block exports Kevin Wolf
2020-08-13 16:29 ` [RFC PATCH 01/22] nbd: Remove unused nbd_export_get_blockdev() Kevin Wolf
2020-08-17  8:14   ` Max Reitz
2020-08-19 18:13   ` Eric Blake
2020-08-13 16:29 ` [RFC PATCH 02/22] qapi: Create block-export module Kevin Wolf
2020-08-17  8:50   ` Max Reitz
2020-08-19 18:17   ` Eric Blake
2020-08-13 16:29 ` [RFC PATCH 03/22] qapi: Rename BlockExport to BlockExportOptions Kevin Wolf
2020-08-17  9:13   ` Max Reitz
2020-08-19 18:19   ` Eric Blake
2020-08-13 16:29 ` [RFC PATCH 04/22] block/export: Add BlockExport infrastructure and block-export-add Kevin Wolf
2020-08-17 10:03   ` Max Reitz
2020-08-17 12:45     ` Kevin Wolf
2020-08-17 13:19       ` Max Reitz
2020-08-17 13:29         ` Kevin Wolf
2020-08-17 13:53           ` Max Reitz
2020-08-19 18:31   ` Eric Blake
2020-08-13 16:29 ` [RFC PATCH 05/22] qemu-storage-daemon: Use qmp_block_export_add() Kevin Wolf
2020-08-17 10:13   ` Max Reitz
2020-08-19 19:14   ` Eric Blake
2020-08-13 16:29 ` [RFC PATCH 06/22] qemu-nbd: Use raw block driver for --offset Kevin Wolf
2020-08-17 10:56   ` Max Reitz
2020-08-17 11:41   ` Max Reitz
2020-08-17 17:19   ` Nir Soffer
2020-08-18  8:47     ` Kevin Wolf
2020-08-18  9:05       ` Nir Soffer
2020-08-19 19:33   ` Eric Blake
2020-08-13 16:29 ` [RFC PATCH 07/22] block/export: Remove magic from block-export-add Kevin Wolf
2020-08-17 11:41   ` Max Reitz
2020-08-17 12:49     ` Kevin Wolf
2020-08-17 13:22       ` Max Reitz
2020-08-19 19:50   ` Eric Blake
2020-08-20 11:05     ` Kevin Wolf
2020-08-20 14:41       ` Eric Blake
2020-08-20 15:28         ` Peter Krempa
2020-08-13 16:29 ` [RFC PATCH 08/22] nbd: Add max-connections to nbd-server-start Kevin Wolf
2020-08-17 12:37   ` Max Reitz
2020-08-17 13:01     ` Kevin Wolf
2020-08-19 20:00   ` Eric Blake
2020-08-20 11:12     ` Kevin Wolf
2020-08-13 16:29 ` [RFC PATCH 09/22] nbd: Add writethrough to block-export-add Kevin Wolf
2020-08-17 12:56   ` Max Reitz
2020-08-17 13:13     ` Kevin Wolf
2020-08-17 13:51       ` Max Reitz
2020-08-17 14:32         ` Kevin Wolf
2020-08-17 15:35           ` Max Reitz
2020-08-19 20:05     ` Eric Blake
2020-08-19 20:13   ` Eric Blake
2020-08-13 16:29 ` [RFC PATCH 10/22] nbd: Remove NBDExport.close callback Kevin Wolf
2020-08-17 14:02   ` Max Reitz
2020-08-19 20:17   ` Eric Blake
2020-08-13 16:29 ` [RFC PATCH 11/22] qemu-nbd: Use blk_exp_add() to create the export Kevin Wolf
2020-08-17 14:27   ` Max Reitz
2020-08-17 14:38     ` Max Reitz
2020-08-17 15:01     ` Kevin Wolf
2020-08-19 20:35   ` Eric Blake
2020-08-13 16:29 ` [RFC PATCH 12/22] nbd/server: Simplify export shutdown Kevin Wolf
2020-08-17 14:32   ` Max Reitz
2020-08-19 20:45   ` Eric Blake
2020-08-13 16:29 ` [RFC PATCH 13/22] block/export: Move refcount from NBDExport to BlockExport Kevin Wolf
2020-08-17 14:49   ` Max Reitz
2020-08-19 20:58   ` Eric Blake
2020-08-20 14:15     ` Kevin Wolf [this message]
2020-08-13 16:29 ` [RFC PATCH 14/22] block/export: Move AioContext " Kevin Wolf
2020-08-17 14:56   ` Max Reitz
2020-08-17 15:22     ` Kevin Wolf
2020-08-17 15:47       ` Max Reitz
2020-08-13 16:29 ` [RFC PATCH 15/22] block/export: Move device to BlockExportOptions Kevin Wolf
2020-08-17 15:13   ` Max Reitz
2020-08-17 15:27     ` Kevin Wolf
2020-08-17 15:49       ` Max Reitz
2020-08-19 21:13   ` Eric Blake
2020-08-13 16:29 ` [RFC PATCH 16/22] block/export: Allocate BlockExport in blk_exp_add() Kevin Wolf
2020-08-18 14:25   ` Max Reitz
2020-08-13 16:29 ` [RFC PATCH 17/22] block/export: Add blk_exp_close_all(_type) Kevin Wolf
2020-08-18 15:00   ` Max Reitz
2020-08-13 16:29 ` [RFC PATCH 18/22] block/export: Add 'id' option to block-export-add Kevin Wolf
2020-08-18 15:08   ` Max Reitz
2020-08-13 16:29 ` [RFC PATCH 19/22] block/export: Move strong user reference to block_exports Kevin Wolf
2020-08-19  8:35   ` Max Reitz
2020-08-19 11:56   ` Max Reitz
2020-08-19 14:23     ` Kevin Wolf
2020-08-19 14:48       ` Max Reitz
2020-08-13 16:29 ` [RFC PATCH 20/22] block/export: Add block-export-del Kevin Wolf
2020-08-19  9:54   ` Max Reitz
2020-08-13 16:29 ` [RFC PATCH 21/22] block/export: Move blk to BlockExport Kevin Wolf
2020-08-19 10:53   ` Max Reitz
2020-08-13 16:29 ` [RFC PATCH 22/22] block/export: Add query-block-exports Kevin Wolf
2020-08-19 11:04   ` Max Reitz
2020-08-19 12:04     ` 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=20200820141514.GF99531@linux.fritz.box \
    --to=kwolf@redhat.com \
    --cc=eblake@redhat.com \
    --cc=mreitz@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.