All of lore.kernel.org
 help / color / mirror / Atom feed
From: Claudio Fontana <claudio.fontana@huawei.com>
To: marcandre.lureau@redhat.com, qemu-devel@nongnu.org
Cc: drjones@redhat.com, cam@cs.ualberta.ca, stefanha@redhat.com
Subject: Re: [Qemu-devel] [PATCH v3 43/46] ivshmem: add hostmem backend
Date: Tue, 22 Sep 2015 16:49:47 +0200	[thread overview]
Message-ID: <56016A8B.4000006@huawei.com> (raw)
In-Reply-To: <1442333283-13119-44-git-send-email-marcandre.lureau@redhat.com>

On 15.09.2015 18:08, marcandre.lureau@redhat.com wrote:
> From: Marc-André Lureau <marcandre.lureau@redhat.com>
> 
> Instead of handling allocation, teach ivshmem to use a memory backend.
> This allows to use hugetlbfs backed memory now.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  hw/misc/ivshmem.c    | 84 ++++++++++++++++++++++++++++++++++++++++------------
>  tests/ivshmem-test.c | 12 ++++++++
>  2 files changed, 77 insertions(+), 19 deletions(-)
> 
> diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c
> index 5fb2123..ac90f0a 100644
> --- a/hw/misc/ivshmem.c
> +++ b/hw/misc/ivshmem.c
> @@ -26,6 +26,8 @@
>  #include "qemu/event_notifier.h"
>  #include "qemu/fifo8.h"
>  #include "sysemu/char.h"
> +#include "sysemu/hostmem.h"
> +#include "qapi/visitor.h"
>  
>  #include "hw/misc/ivshmem.h"
>  
> @@ -57,6 +59,8 @@
>  #define IVSHMEM(obj) \
>      OBJECT_CHECK(IVShmemState, (obj), TYPE_IVSHMEM)
>  
> +#define IVSHMEM_MEMDEV_PROP "memdev"
> +
>  typedef struct Peer {
>      int nb_eventfds;
>      EventNotifier *eventfds;
> @@ -72,6 +76,7 @@ typedef struct IVShmemState {
>      PCIDevice parent_obj;
>      /*< public >*/
>  
> +    HostMemoryBackend *hostmem;
>      uint32_t intrmask;
>      uint32_t intrstatus;
>  
> @@ -699,9 +704,22 @@ static void pci_ivshmem_realize(PCIDevice *dev, Error **errp)
>          PCI_BASE_ADDRESS_MEM_PREFETCH;;
>      Error *local_err = NULL;
>  
> -    s->shm_fd = -1;
> +    if (!!s->server_chr + !!s->shmobj + !!s->hostmem != 1) {
> +        error_setg(errp, "You must specify either a shmobj, a chardev"
> +                   " or a hostmem");
> +        return;
> +    }
> +
> +    if (s->hostmem) {
> +        MemoryRegion *mr;
>  
> -    if (s->sizearg == NULL) {
> +        if (s->sizearg) {
> +            g_warning("size argument ignored with hostmem");
> +        }
> +
> +        mr = host_memory_backend_get_memory(s->hostmem, errp);
> +        s->ivshmem_size = memory_region_size(mr);
> +    } else if (s->sizearg == NULL) {
>          s->ivshmem_size = 4 << 20; /* 4 MB default */
>      } else {
>          s->ivshmem_size = parse_mem_size(s->sizearg, &local_err);
> @@ -757,7 +775,16 @@ static void pci_ivshmem_realize(PCIDevice *dev, Error **errp)
>          attr |= PCI_BASE_ADDRESS_MEM_TYPE_64;
>      }
>  
> -    if (s->server_chr != NULL) {
> +    if (s->hostmem != NULL) {
> +        MemoryRegion *mr;
> +
> +        IVSHMEM_DPRINTF("using hostmem\n");
> +
> +        mr = host_memory_backend_get_memory(MEMORY_BACKEND(s->hostmem), errp);
> +        vmstate_register_ram(mr, DEVICE(s));
> +        memory_region_add_subregion(&s->bar, 0, mr);
> +        pci_register_bar(PCI_DEVICE(s), 2, attr, &s->bar);
> +    } else if (s->server_chr != NULL) {
>          if (strncmp(s->server_chr->filename, "unix:", 5)) {
>              error_setg(errp, "chardev is not a unix client socket");
>              return;
> @@ -766,12 +793,6 @@ static void pci_ivshmem_realize(PCIDevice *dev, Error **errp)
>          /* if we get a UNIX socket as the parameter we will talk
>           * to the ivshmem server to receive the memory region */
>  
> -        if (s->shmobj != NULL) {
> -            error_setg(errp, "do not specify both 'chardev' "
> -                       "and 'shm' with ivshmem");
> -            return;
> -        }
> -
>          IVSHMEM_DPRINTF("using shared memory server (socket = %s)\n",
>                          s->server_chr->filename);
>  
> @@ -795,11 +816,6 @@ static void pci_ivshmem_realize(PCIDevice *dev, Error **errp)
>          /* just map the file immediately, we're not using a server */
>          int fd;
>  
> -        if (s->shmobj == NULL) {
> -            error_setg(errp, "Must specify 'chardev' or 'shm' to ivshmem");
> -            return;
> -        }
> -
>          IVSHMEM_DPRINTF("using shm_open (shm object = %s)\n", s->shmobj);
>  
>          /* try opening with O_EXCL and if it succeeds zero the memory
> @@ -839,14 +855,17 @@ static void pci_ivshmem_exit(PCIDevice *dev)
>      }
>  
>      if (memory_region_is_mapped(&s->ivshmem)) {
> -        void *addr = memory_region_get_ram_ptr(&s->ivshmem);
> +        if (!s->hostmem) {
> +            void *addr = memory_region_get_ram_ptr(&s->ivshmem);
> +
> +            if (munmap(addr, s->ivshmem_size) == -1) {
> +                error_report("Failed to munmap shared memory %s",
> +                             strerror(errno));
> +            }
> +        }
>  
>          vmstate_unregister_ram(&s->ivshmem, DEVICE(dev));
>          memory_region_del_subregion(&s->bar, &s->ivshmem);
> -
> -        if (munmap(addr, s->ivshmem_size) == -1) {
> -            error_report("Failed to munmap shared memory %s", strerror(errno));
> -        }
>      }
>  
>      if (s->eventfd_chr) {
> @@ -988,10 +1007,37 @@ static void ivshmem_class_init(ObjectClass *klass, void *data)
>      dc->desc = "Inter-VM shared memory";
>  }
>  
> +static void ivshmem_check_memdev_is_busy(Object *obj, const char *name,
> +                                         Object *val, Error **errp)
> +{
> +    MemoryRegion *mr;
> +
> +    mr = host_memory_backend_get_memory(MEMORY_BACKEND(val), errp);
> +    if (memory_region_is_mapped(mr)) {
> +        char *path = object_get_canonical_path_component(val);
> +        error_setg(errp, "can't use already busy memdev: %s", path);
> +        g_free(path);
> +    } else {
> +        qdev_prop_allow_set_link_before_realize(obj, name, val, errp);
> +    }
> +}
> +
> +static void ivshmem_init(Object *obj)
> +{
> +    IVShmemState *s = IVSHMEM(obj);
> +
> +    object_property_add_link(obj, IVSHMEM_MEMDEV_PROP, TYPE_MEMORY_BACKEND,
> +                             (Object **)&s->hostmem,
> +                             ivshmem_check_memdev_is_busy,
> +                             OBJ_PROP_LINK_UNREF_ON_RELEASE,
> +                             &error_abort);
> +}
> +
>  static const TypeInfo ivshmem_info = {
>      .name          = TYPE_IVSHMEM,
>      .parent        = TYPE_PCI_DEVICE,
>      .instance_size = sizeof(IVShmemState),
> +    .instance_init = ivshmem_init,
>      .class_init    = ivshmem_class_init,
>  };
>  
> diff --git a/tests/ivshmem-test.c b/tests/ivshmem-test.c
> index 03f44c1..920b9fa 100644
> --- a/tests/ivshmem-test.c
> +++ b/tests/ivshmem-test.c
> @@ -390,6 +390,17 @@ static void test_ivshmem_hotplug(void)
>      g_free(opts);
>  }
>  
> +static void test_ivshmem_memdev(void)
> +{
> +    IVState state;
> +
> +    /* just for the sake of checking memory-backend property */
> +    setup_vm_cmd(&state, "-object memory-backend-ram,size=1M,id=mb1"
> +                 " -device ivshmem,memdev=mb1", false);
> +
> +    qtest_quit(state.qtest);
> +}
> +
>  static void cleanup(void)
>  {
>      if (tmpshmem) {
> @@ -466,6 +477,7 @@ int main(int argc, char **argv)
>      qtest_add_func("/ivshmem/pair", test_ivshmem_pair);
>      qtest_add_func("/ivshmem/server", test_ivshmem_server);
>      qtest_add_func("/ivshmem/hotplug", test_ivshmem_hotplug);
> +    qtest_add_func("/ivshmem/memdev", test_ivshmem_memdev);
>  
>      ret = g_test_run();
>  
> 

seems good to me..

Reviewed-by: Claudio Fontana <claudio.fontana@huawei.com>

  reply	other threads:[~2015-09-22 14:50 UTC|newest]

Thread overview: 109+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-15 16:07 [Qemu-devel] [PATCH v3 00/46] ivshmem improvements (please review) marcandre.lureau
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 01/46] char: add qemu_chr_free() marcandre.lureau
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 02/46] msix: add VMSTATE_MSIX_TEST marcandre.lureau
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 03/46] ivhsmem: read do not accept more than sizeof(long) marcandre.lureau
2015-09-16  9:27   ` Claudio Fontana
2015-09-16  9:33     ` Marc-André Lureau
2015-09-16 11:27       ` Claudio Fontana
2015-09-16 12:03         ` Marc-André Lureau
2015-09-16 12:51         ` Paolo Bonzini
2015-09-16 13:05           ` Claudio Fontana
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 04/46] ivshmem: fix number of bytes to push to fifo marcandre.lureau
2015-09-16  9:28   ` Claudio Fontana
2015-09-23 10:17     ` Marc-André Lureau
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 05/46] ivshmem: factor out the incoming fifo handling marcandre.lureau
2015-09-22 14:01   ` Claudio Fontana
2015-09-23 10:18     ` Marc-André Lureau
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 06/46] ivshmem: remove unnecessary dup() marcandre.lureau
2015-09-22 14:06   ` Claudio Fontana
2015-09-22 15:29     ` Marc-André Lureau
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 07/46] ivshmem: remove superflous ivshmem_attr field marcandre.lureau
2015-09-16  9:25   ` Claudio Fontana
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 08/46] ivshmem: remove useless doorbell field marcandre.lureau
2015-09-22 13:50   ` Claudio Fontana
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 09/46] ivshmem: more qdev conversion marcandre.lureau
2015-09-22 14:00   ` Claudio Fontana
2015-09-23 10:22     ` Marc-André Lureau
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 10/46] ivshmem: remove last exit(1) marcandre.lureau
2015-09-22 13:55   ` Claudio Fontana
2015-09-22 13:58     ` Claudio Fontana
2015-09-22 14:00     ` Marc-André Lureau
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 11/46] ivshmem: limit maximum number of peers to G_MAXUINT16 marcandre.lureau
2015-09-22 14:09   ` Claudio Fontana
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 12/46] ivshmem: simplify around increase_dynamic_storage() marcandre.lureau
2015-09-22 14:10   ` Claudio Fontana
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 13/46] ivshmem: allocate eventfds in resize_peers() marcandre.lureau
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 14/46] ivshmem: remove useless ivshmem_update_irq() val argument marcandre.lureau
2015-09-22 14:13   ` Claudio Fontana
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 15/46] ivshmem: initialize max_peer to -1 marcandre.lureau
2015-09-22 14:13   ` Claudio Fontana
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 16/46] ivshmem: remove max_peer field marcandre.lureau
2015-09-16  9:39   ` Claudio Fontana
2015-09-16  9:40     ` Marc-André Lureau
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 17/46] ivshmem: improve debug messages marcandre.lureau
2015-09-22 14:23   ` Claudio Fontana
2015-09-23 10:29     ` Marc-André Lureau
2015-09-23 12:10       ` Claudio Fontana
2015-09-23 15:45         ` Marc-André Lureau
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 18/46] ivshmem: improve error marcandre.lureau
2015-09-22 14:26   ` Claudio Fontana
2015-09-23 10:30     ` Marc-André Lureau
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 19/46] ivshmem: print error on invalid peer id marcandre.lureau
2015-09-22 14:27   ` Claudio Fontana
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 20/46] ivshmem: simplify a bit the code marcandre.lureau
2015-09-22 14:32   ` Claudio Fontana
2015-09-22 14:56     ` Marc-André Lureau
2015-09-23 12:18       ` Claudio Fontana
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 21/46] ivshmem: use common return marcandre.lureau
2015-09-16 11:30   ` Claudio Fontana
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 22/46] ivshmem: use common is_power_of_2() marcandre.lureau
2015-09-16 11:31   ` Claudio Fontana
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 23/46] ivshmem: migrate with VMStateDescription marcandre.lureau
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 24/46] ivshmem: shmfd can be 0 marcandre.lureau
2015-09-16 11:33   ` Claudio Fontana
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 25/46] ivshmem: check shm isn't already initialized marcandre.lureau
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 26/46] ivshmem: add device description marcandre.lureau
2015-09-16 11:38   ` Claudio Fontana
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 27/46] ivshmem: fix pci_ivshmem_exit() marcandre.lureau
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 28/46] ivshmem: replace 'guest' for 'peer' appropriately marcandre.lureau
2015-09-16 11:44   ` Claudio Fontana
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 29/46] ivshmem: error on too many eventfd received marcandre.lureau
2015-09-16 12:14   ` Claudio Fontana
2015-09-23 10:47     ` Marc-André Lureau
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 30/46] ivshmem: reset mask on device reset marcandre.lureau
2015-09-16 12:15   ` Claudio Fontana
2015-09-23 10:48     ` Marc-André Lureau
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 31/46] contrib: add ivshmem client and server marcandre.lureau
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 32/46] ivshmem-client: check the number of vectors marcandre.lureau
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 33/46] ivshmem-server: use a uint16 for client ID marcandre.lureau
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 34/46] ivshmem-server: fix hugetlbfs support marcandre.lureau
2015-09-16 16:07   ` Vladimir Sementsov-Ogievskiy
2015-09-16 16:14     ` Marc-André Lureau
2015-09-17  8:52       ` Vladimir Sementsov-Ogievskiy
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 35/46] docs: update ivshmem device spec marcandre.lureau
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 36/46] ivshmem: add check on protocol version in QEMU marcandre.lureau
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 37/46] contrib: remove unnecessary strdup() marcandre.lureau
2015-09-17  9:01   ` Vladimir Sementsov-Ogievskiy
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 38/46] msix: implement pba write (but read-only) marcandre.lureau
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 39/46] qtest: add qtest_add_abrt_handler() marcandre.lureau
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 40/46] tests: add ivshmem qtest marcandre.lureau
2015-09-22 14:44   ` Claudio Fontana
2015-09-23 11:24     ` Marc-André Lureau
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 41/46] ivshmem: do not keep shm_fd open marcandre.lureau
2015-09-22 14:36   ` Claudio Fontana
2015-09-22 14:59     ` Marc-André Lureau
2015-09-23 12:20       ` Claudio Fontana
2015-09-15 16:07 ` [Qemu-devel] [PATCH v3 42/46] ivshmem: make ivshmem_get_size() more generic marcandre.lureau
2015-09-16 15:23   ` Vladimir Sementsov-Ogievskiy
2015-09-16 15:24   ` Vladimir Sementsov-Ogievskiy
2015-09-16 15:26     ` Marc-André Lureau
2015-09-15 16:08 ` [Qemu-devel] [PATCH v3 43/46] ivshmem: add hostmem backend marcandre.lureau
2015-09-22 14:49   ` Claudio Fontana [this message]
2015-09-15 16:08 ` [Qemu-devel] [PATCH v3 44/46] ivshmem: remove EventfdEntry.vector marcandre.lureau
2015-09-22 14:59   ` Claudio Fontana
2015-09-22 15:18     ` Marc-André Lureau
2015-09-15 16:08 ` [Qemu-devel] [PATCH v3 45/46] ivshmem: rename MSI eventfd_table marcandre.lureau
2015-09-15 16:08 ` [Qemu-devel] [PATCH v3 46/46] ivshmem: use kvm irqfd for msi notifications marcandre.lureau
2015-09-16 12:47 ` [Qemu-devel] [PATCH v3 00/46] ivshmem improvements (please review) Claudio Fontana
2015-09-16 16:52 ` Vladimir Sementsov-Ogievskiy
2015-09-16 20:34   ` Marc-André 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=56016A8B.4000006@huawei.com \
    --to=claudio.fontana@huawei.com \
    --cc=cam@cs.ualberta.ca \
    --cc=drjones@redhat.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@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 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.