qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Stefan Hajnoczi <stefanha@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: Kevin Wolf <kwolf@redhat.com>,
	Laurent Vivier <lvivier@redhat.com>,
	Thomas Huth <thuth@redhat.com>,
	qemu-block@nongnu.org, qemu-devel@nongnu.org,
	Coiby Xu <coiby.xu@gmail.com>, Max Reitz <mreitz@redhat.com>,
	Paolo Bonzini <pbonzini@redhat.com>
Subject: Re: [PATCH v2 11/13] block/export: convert vhost-user-blk server to block export API
Date: Thu, 1 Oct 2020 16:25:15 +0100	[thread overview]
Message-ID: <20201001152515.GD559957@stefanha-x1.localdomain> (raw)
In-Reply-To: <87eemj72s1.fsf@dusky.pond.sub.org>

[-- Attachment #1: Type: text/plain, Size: 5576 bytes --]

On Wed, Sep 30, 2020 at 04:33:18PM +0200, Markus Armbruster wrote:
> Stefan Hajnoczi <stefanha@redhat.com> writes:
> 
> > On Wed, Sep 30, 2020 at 07:28:58AM +0200, Markus Armbruster wrote:
> >> Stefan Hajnoczi <stefanha@redhat.com> writes:
> >> 
> >> > Use the new QAPI block exports API instead of defining our own QOM
> >> > objects.
> >> >
> >> > This is a large change because the lifecycle of VuBlockDev needs to
> >> > follow BlockExportDriver. QOM properties are replaced by QAPI options
> >> > objects.
> >> >
> >> > VuBlockDev is renamed VuBlkExport and contains a BlockExport field.
> >> > Several fields can be dropped since BlockExport already has equivalents.
> >> >
> >> > The file names and meson build integration will be adjusted in a future
> >> > patch. libvhost-user should probably be built as a static library that
> >> > is linked into QEMU instead of as a .c file that results in duplicate
> >> > compilation.
> >> >
> >> > The new command-line syntax is:
> >> >
> >> >   $ qemu-storage-daemon \
> >> >       --blockdev file,node-name=drive0,filename=test.img \
> >> >       --export vhost-user-blk,node-name=drive0,id=export0,unix-socket=/tmp/vhost-user-blk.sock
> >> >
> >> > Note that unix-socket is optional because we may wish to accept chardevs
> >> > too in the future.
> >> >
> >> > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
> >> > ---
> >> > v2:
> >> >  * Replace str unix-socket with SocketAddress addr to match NBD and
> >> >    support file descriptor passing
> >> >  * Make addr mandatory [Markus]
> >> >  * Update vhost-user-blk-test.c to use --export syntax
> >> > ---
> >> >  qapi/block-export.json               |  21 +-
> >> >  block/export/vhost-user-blk-server.h |  23 +-
> >> >  block/export/export.c                |   8 +-
> >> >  block/export/vhost-user-blk-server.c | 452 +++++++--------------------
> >> >  tests/qtest/vhost-user-blk-test.c    |   2 +-
> >> >  util/vhost-user-server.c             |  10 +-
> >> >  block/export/meson.build             |   1 +
> >> >  block/meson.build                    |   1 -
> >> >  8 files changed, 158 insertions(+), 360 deletions(-)
> >> >
> >> > diff --git a/qapi/block-export.json b/qapi/block-export.json
> >> > index ace0d66e17..2e44625bb1 100644
> >> > --- a/qapi/block-export.json
> >> > +++ b/qapi/block-export.json
> >> > @@ -84,6 +84,21 @@
> >> >    'data': { '*name': 'str', '*description': 'str',
> >> >              '*bitmap': 'str' } }
> >> >  
> >> > +##
> >> > +# @BlockExportOptionsVhostUserBlk:
> >> > +#
> >> > +# A vhost-user-blk block export.
> >> > +#
> >> > +# @addr: The vhost-user socket on which to listen. Both 'unix' and 'fd'
> >> > +#        SocketAddress types are supported. Passed fds must be UNIX domain
> >> > +#        sockets.
> >> 
> >> "addr.type must be 'unix' or 'fd'" is not visible in introspection.
> >> Awkward.  Practical problem only if other addresses ever become
> >> available here.  Is that possible?
> >
> > addr.type=fd itself has the same problem, because it is a file
> > descriptor without type information. Therefore the QMP client cannot
> > introspect which types of file descriptors can be passed.
> 
> Yes, but if introspection could tell us which which values of addr.type
> are valid, then a client should figure out the address families, as
> follows.  Any valid value other than 'fd' corresponds to an address
> family.  The set of values valid for addr.type therefore corresponds to
> a set of address families.  The address families in that set are all
> valid with 'fd', aren't they?

Yes, in this case the address families in addr.type are the ones also
supported by addr.type=fd.

> > Two ideas:
> >
> > 1. Introduce per-address family fd types (SocketAddrFdTcpInet,
> >    SocketAddrFdTcpInet6, SocketAddrFdUnix, etc) to express specific
> >    address families in the QAPI schema.
> >
> >    Then use per-command unions to express the address families supported
> >    by specific commands. For example,
> >    BlockExportOptionsVhostUserBlkSocketAddr would only allow
> >    SocketAddrUnix and SocketAddrFdUnix. That way new address families
> >    can be supported in the future and introspection reports.
> 
> Awkward.  These types would have to differ structurally, or else they
> are indistinguishable in introspection.
>
> > 2. Use a side-channel (query-features, I think we discussed something
> >    like this a while back) to report features that cannot be
> >    introspected.
> 
> We implemented this in the form of QAPI feature flags, visible in
> introspection.  You could do something like
> 
>   'addr': { 'type': 'SocketAddress',
>             'features': [ 'unix' ] }

That is nice.

> 
> > I think the added complexity for achieving full introspection is not
> > worth it. It becomes harder to define new QAPI commands, increases the
> > chance of errors, and is more tedious to program for clients/servers.
> 
> Hence my question: is it possible that address families other than unix
> become available here?
> 
> When that happens, we have an introspection problem of the sort we
> common solve with a feature flag.
> 
> > Accepting any SocketAddr seems reasonable to me since vhost-user
> > requires an address family that has file descriptor passing. Very few
> > address families support this feature and we don't expect to add new
> > ones often.
> 
> Your answer appears to be "yes in theory, quite unlikely in practice".
> Correct?

Yes.

Stefan

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

  reply	other threads:[~2020-10-01 15:28 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-24 15:15 [PATCH v2 00/13] block/export: convert vhost-user-blk-server to block exports API Stefan Hajnoczi
2020-09-24 15:15 ` [PATCH v2 01/13] block/export: shorten serial string to fit Stefan Hajnoczi
2020-09-24 15:15 ` [PATCH v2 02/13] util/vhost-user-server: s/fileds/fields/ typo fix Stefan Hajnoczi
2020-09-24 15:15 ` [PATCH v2 03/13] util/vhost-user-server: drop unnecessary QOM cast Stefan Hajnoczi
2020-09-24 15:15 ` [PATCH v2 04/13] util/vhost-user-server: drop unnecessary watch deletion Stefan Hajnoczi
2020-09-24 15:15 ` [PATCH v2 05/13] block/export: consolidate request structs into VuBlockReq Stefan Hajnoczi
2020-09-24 15:15 ` [PATCH v2 06/13] util/vhost-user-server: drop unused DevicePanicNotifier Stefan Hajnoczi
2020-09-24 15:15 ` [PATCH v2 07/13] util/vhost-user-server: fix memory leak in vu_message_read() Stefan Hajnoczi
2020-09-24 15:15 ` [PATCH v2 08/13] util/vhost-user-server: check EOF when reading payload Stefan Hajnoczi
2020-09-24 15:15 ` [PATCH v2 09/13] util/vhost-user-server: rework vu_client_trip() coroutine lifecycle Stefan Hajnoczi
2020-09-24 15:15 ` [PATCH v2 10/13] block/export: report flush errors Stefan Hajnoczi
2020-09-24 15:15 ` [PATCH v2 11/13] block/export: convert vhost-user-blk server to block export API Stefan Hajnoczi
2020-09-30  5:28   ` Markus Armbruster
2020-09-30  9:45     ` Stefan Hajnoczi
2020-09-30 14:33       ` Markus Armbruster
2020-10-01 15:25         ` Stefan Hajnoczi [this message]
2020-10-02  5:20           ` Markus Armbruster
2020-10-08 16:02             ` Stefan Hajnoczi
2020-09-24 15:15 ` [PATCH v2 12/13] util/vhost-user-server: move header to include/ Stefan Hajnoczi
2020-09-24 15:15 ` [PATCH v2 13/13] util/vhost-user-server: use static library in meson.build Stefan Hajnoczi
2020-10-09 10:18 ` [PATCH v2 00/13] block/export: convert vhost-user-blk-server to block exports API Stefan Hajnoczi

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=20201001152515.GD559957@stefanha-x1.localdomain \
    --to=stefanha@redhat.com \
    --cc=armbru@redhat.com \
    --cc=coiby.xu@gmail.com \
    --cc=kwolf@redhat.com \
    --cc=lvivier@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=thuth@redhat.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).