All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: "Marc-André Lureau" <mlureau@redhat.com>
Cc: haifeng lin <haifeng.lin@huawei.com>,
	thibaut collet <thibaut.collet@6wind.com>,
	jasowang@redhat.com, qemu-devel@nongnu.org, pbonzini@redhat.com,
	marcandre lureau <marcandre.lureau@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v4 07/22] vhost: alloc shareable log
Date: Mon, 21 Sep 2015 22:29:29 +0300	[thread overview]
Message-ID: <20150921222715-mutt-send-email-mst@redhat.com> (raw)
In-Reply-To: <2063208980.14557622.1442844122026.JavaMail.zimbra@redhat.com>

On Mon, Sep 21, 2015 at 10:02:02AM -0400, Marc-André Lureau wrote:
> Hi
> 
> ----- Original Message -----
> > On Sat, Sep 19, 2015 at 12:11:58PM +0200, marcandre.lureau@redhat.com wrote:
> > > From: Marc-André Lureau <marcandre.lureau@redhat.com>
> > > 
> > > If the backend is of type VHOST_BACKEND_TYPE_USER, allocate
> > > shareable memory. Next patch will only allocate when the backend
> > > has the required feature.
> > > 
> > > Note: vhost_log_get() can use a global "vhost_log" that can be shared by
> > > several vhost devices. We may want instead a common shareable log and a
> > > common non-shareable one.
> > > 
> > > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > 
> > Well you do at least need to count the number of times the log is
> > shared.  Otherwise, if you share the log, then unshare it, you are left
> > with a shared one.
> 
> Do you mean that if the device is removed (or stopped, so that the log
> is unref) and a shm log is no longer needed, it should replace the log
> of other devices with a non-shm log?

Yes. Basically, you have code to swicth non-shared -> shared
but not back. That's asymmetrical.

> In this case, wouldn't it make
> more sense to have a log shm per device, because replacing other
> devices log do not seem simple without more tracking of devices
> sharing the log.

A per device log slows down syncs. Jason coded the shared one
specifically to avoid the need to do that.

> Can this be considered a future enhancement?

What's the big issue? Just count the devices that need a shared one, if
that count is 0 reallocate with shared == false.

> > 
> > > ---
> > >  hw/virtio/vhost.c         | 38 +++++++++++++++++++++++++++++++-------
> > >  include/hw/virtio/vhost.h |  3 ++-
> > >  2 files changed, 33 insertions(+), 8 deletions(-)
> > > 
> > > diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
> > > index a08c36b..cd3af16 100644
> > > --- a/hw/virtio/vhost.c
> > > +++ b/hw/virtio/vhost.c
> > > @@ -18,6 +18,7 @@
> > >  #include "qemu/atomic.h"
> > >  #include "qemu/range.h"
> > >  #include "qemu/error-report.h"
> > > +#include "qemu/memfd.h"
> > >  #include <linux/vhost.h>
> > >  #include "exec/address-spaces.h"
> > >  #include "hw/virtio/virtio-bus.h"
> > > @@ -286,20 +287,34 @@ static uint64_t vhost_get_log_size(struct vhost_dev
> > > *dev)
> > >      }
> > >      return log_size;
> > >  }
> > > -static struct vhost_log *vhost_log_alloc(uint64_t size)
> > > +
> > > +static struct vhost_log *vhost_log_alloc(uint64_t size, bool share)
> > >  {
> > > -    struct vhost_log *log = g_malloc0(sizeof *log + size *
> > > sizeof(*(log->log)));
> > > +    struct vhost_log *log;
> > > +    uint64_t logsize = size * sizeof(*(log->log));
> > > +    int fd = -1;
> > > +
> > > +    log = g_new0(struct vhost_log, 1);
> > > +    if (share) {
> > > +        log->log = qemu_memfd_alloc("vhost-log", logsize,
> > > +                                    F_SEAL_GROW|F_SEAL_SHRINK|F_SEAL_SEAL,
> > > &fd);
> > > +        memset(log->log, 0, logsize);
> > > +    } else {
> > > +        log->log = g_malloc0(logsize);
> > > +    }
> > >  
> > >      log->size = size;
> > >      log->refcnt = 1;
> > > +    log->fd = fd;
> > >  
> > >      return log;
> > >  }
> > >  
> > > -static struct vhost_log *vhost_log_get(uint64_t size)
> > > +static struct vhost_log *vhost_log_get(uint64_t size, bool share)
> > >  {
> > > -    if (!vhost_log || vhost_log->size != size) {
> > > -        vhost_log = vhost_log_alloc(size);
> > > +    if (!vhost_log || vhost_log->size != size ||
> > > +        (share && vhost_log->fd == -1)) {
> > > +        vhost_log = vhost_log_alloc(size, share);
> > >      } else {
> > >          ++vhost_log->refcnt;
> > >      }
> > > @@ -324,13 +339,21 @@ static void vhost_log_put(struct vhost_dev *dev, bool
> > > sync)
> > >          if (vhost_log == log) {
> > >              vhost_log = NULL;
> > >          }
> > > +
> > > +        if (log->fd == -1) {
> > > +            g_free(log->log);
> > > +        } else {
> > > +            qemu_memfd_free(log->log, log->size * sizeof(*(log->log)),
> > > +                            log->fd);
> > > +        }
> > >          g_free(log);
> > >      }
> > >  }
> > >  
> > >  static inline void vhost_dev_log_resize(struct vhost_dev* dev, uint64_t
> > >  size)
> > >  {
> > > -    struct vhost_log *log = vhost_log_get(size);
> > > +    bool share = dev->vhost_ops->backend_type == VHOST_BACKEND_TYPE_USER;
> > > +    struct vhost_log *log = vhost_log_get(size, share);
> > >      uint64_t log_base = (uintptr_t)log->log;
> > >      int r;
> > >  
> > > @@ -1136,9 +1159,10 @@ int vhost_dev_start(struct vhost_dev *hdev,
> > > VirtIODevice *vdev)
> > >  
> > >      if (hdev->log_enabled) {
> > >          uint64_t log_base;
> > > +        bool share = hdev->vhost_ops->backend_type ==
> > > VHOST_BACKEND_TYPE_USER;
> > >  
> > >          hdev->log_size = vhost_get_log_size(hdev);
> > > -        hdev->log = vhost_log_get(hdev->log_size);
> > > +        hdev->log = vhost_log_get(hdev->log_size, share);
> > >          log_base = (uintptr_t)hdev->log->log;
> > >          r = hdev->vhost_ops->vhost_call(hdev, VHOST_SET_LOG_BASE,
> > >                                          hdev->log_size ? &log_base :
> > >                                          NULL);
> > > diff --git a/include/hw/virtio/vhost.h b/include/hw/virtio/vhost.h
> > > index 6467c73..ab1dcac 100644
> > > --- a/include/hw/virtio/vhost.h
> > > +++ b/include/hw/virtio/vhost.h
> > > @@ -31,7 +31,8 @@ typedef unsigned long vhost_log_chunk_t;
> > >  struct vhost_log {
> > >      unsigned long long size;
> > >      int refcnt;
> > > -    vhost_log_chunk_t log[0];
> > > +    int fd;
> > > +    vhost_log_chunk_t *log;
> > >  };
> > >  
> > >  struct vhost_memory;
> > > --
> > > 2.4.3
> > 

  reply	other threads:[~2015-09-21 19:29 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-19 10:11 [Qemu-devel] [PATCH v4 00/22] vhost-user: add migration support marcandre.lureau
2015-09-19 10:11 ` [Qemu-devel] [PATCH v4 01/22] vhost-user: refactor ioctl translation marcandre.lureau
2015-09-19 10:11 ` [Qemu-devel] [PATCH v4 02/22] vhost-user: add protocol feature negotiation marcandre.lureau
2015-09-19 10:11 ` [Qemu-devel] [PATCH v4 03/22] vhost-user: unit test for new messages marcandre.lureau
2015-09-19 10:11 ` [Qemu-devel] [PATCH v4 04/22] configure: probe for memfd marcandre.lureau
2015-09-19 10:11 ` [Qemu-devel] [PATCH v4 05/22] util: add linux-only memfd fallback marcandre.lureau
2015-09-19 10:11 ` [Qemu-devel] [PATCH v4 06/22] util: add memfd helpers marcandre.lureau
2015-09-19 10:11 ` [Qemu-devel] [PATCH v4 07/22] vhost: alloc shareable log marcandre.lureau
2015-09-21  8:44   ` Michael S. Tsirkin
2015-09-21 14:02     ` Marc-André Lureau
2015-09-21 19:29       ` Michael S. Tsirkin [this message]
2015-09-21 21:44         ` Marc-André Lureau
2015-09-22 10:12           ` Michael S. Tsirkin
2015-09-22 11:01             ` Marc-André Lureau
2015-09-22 11:41               ` Michael S. Tsirkin
2015-09-22 11:50                 ` Marc-André Lureau
2015-09-22 11:54                   ` Michael S. Tsirkin
2015-09-19 10:11 ` [Qemu-devel] [PATCH v4 08/22] vhost: document log resizing marcandre.lureau
2015-09-19 10:12 ` [Qemu-devel] [PATCH v4 09/22] vhost: use a function for each call marcandre.lureau
2015-09-21  7:33   ` Thibaut Collet
2015-09-21  8:56     ` Michael S. Tsirkin
2015-09-21  8:58   ` Michael S. Tsirkin
2015-09-21 14:05     ` Marc-André Lureau
2015-09-19 10:12 ` [Qemu-devel] [PATCH v4 10/22] vhost-user: remove vhost_user_request_translate() marcandre.lureau
2015-09-19 10:12 ` [Qemu-devel] [PATCH v4 11/22] vhost-user: send log shm fd along with log_base marcandre.lureau
2015-09-21  8:49   ` Michael S. Tsirkin
2015-09-21 14:05     ` Marc-André Lureau
2015-09-21 19:30       ` Michael S. Tsirkin
2015-09-19 10:12 ` [Qemu-devel] [PATCH v4 12/22] vhost: only use shared log if in use by backend marcandre.lureau
2015-09-21  8:46   ` Michael S. Tsirkin
2015-09-21 14:03     ` Marc-André Lureau
2015-09-19 10:12 ` [Qemu-devel] [PATCH v4 13/22] vhost-user: document migration log marcandre.lureau
2015-09-19 10:12 ` [Qemu-devel] [PATCH v4 14/22] net: add trace_vhost_user_event marcandre.lureau
2015-09-19 10:12 ` [Qemu-devel] [PATCH v4 15/22] vhost user: add support of live migration marcandre.lureau
2015-09-19 10:12 ` [Qemu-devel] [PATCH v4 16/22] vhost user: add rarp sending after live migration for legacy guest marcandre.lureau
2015-09-19 10:12 ` [Qemu-devel] [PATCH v4 17/22] vhost-user-test: move wait_for_fds() out marcandre.lureau
2015-09-19 10:12 ` [Qemu-devel] [PATCH v4 18/22] vhost-user-test: remove useless static check marcandre.lureau
2015-09-19 10:12 ` [Qemu-devel] [PATCH v4 19/22] vhost-user-test: wrap server in TestServer struct marcandre.lureau
2015-09-19 10:12 ` [Qemu-devel] [PATCH v4 20/22] vhost-user-test: learn to tweak various qemu arguments marcandre.lureau
2015-09-19 10:12 ` [Qemu-devel] [PATCH v4 21/22] vhost-user-test: add live-migration test marcandre.lureau
2015-09-19 10:12 ` [Qemu-devel] [PATCH v4 22/22] vhost-user-test: check ownership during migration marcandre.lureau

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=20150921222715-mutt-send-email-mst@redhat.com \
    --to=mst@redhat.com \
    --cc=haifeng.lin@huawei.com \
    --cc=jasowang@redhat.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=mlureau@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=thibaut.collet@6wind.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 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.