From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60396) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aaicw-0000g9-Ff for qemu-devel@nongnu.org; Tue, 01 Mar 2016 06:38:07 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aaict-00058J-5P for qemu-devel@nongnu.org; Tue, 01 Mar 2016 06:38:06 -0500 Received: from mail-wm0-x242.google.com ([2a00:1450:400c:c09::242]:33578) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aaics-00057v-Kx for qemu-devel@nongnu.org; Tue, 01 Mar 2016 06:38:03 -0500 Received: by mail-wm0-x242.google.com with SMTP id n186so3628159wmn.0 for ; Tue, 01 Mar 2016 03:38:02 -0800 (PST) Sender: Paolo Bonzini References: <1456771254-17511-1-git-send-email-armbru@redhat.com> <1456771254-17511-30-git-send-email-armbru@redhat.com> From: Paolo Bonzini Message-ID: <56D57F17.4020706@redhat.com> Date: Tue, 1 Mar 2016 12:37:59 +0100 MIME-Version: 1.0 In-Reply-To: <1456771254-17511-30-git-send-email-armbru@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 29/38] ivshmem: Implement shm=... with a memory backend List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Markus Armbruster , qemu-devel@nongnu.org Cc: mlureau@redhat.com, cam@cs.ualberta.ca, claudio.fontana@huawei.com, david.marchand@6wind.com On 29/02/2016 19:40, Markus Armbruster wrote: > ivshmem has its very own code to create and map shared memory. > Replace that with an implicitly created memory backend. Reduces the > number of ways we create BAR 2 from three to two. > > Signed-off-by: Markus Armbruster Very appreciated, but do not use user_creatable_add_opts. Instead, create the object with object_initialize, object_property_set_* and user_creatable_complete. After the object_initialize, add it with object_property_add_child *under the ivshmem device itself*, giving it a name like "internal-shm-backend". This matches what virtio-blk dataplane used to do for x-dataplane (now removed). Thanks, Paolo > +static HostMemoryBackend *desugar_shm(const char *shm, size_t size) > +{ > + /* TODO avoid the detour through QemuOpts */ > + static int counter; > + QemuOpts *opts = qemu_opts_create(qemu_find_opts("object"), > + NULL, 0, &error_abort); > + char *path; > + Object *obj; > + > + qemu_opt_set(opts, "qom-type", "memory-backend-file", > + &error_abort); > + /* FIXME need a better way to make up an ID */ > + qemu_opts_set_id(opts, g_strdup_printf("ivshmem-backend-%d", counter++)); > + path = g_strdup_printf("/dev/shm/%s", shm); > + qemu_opt_set(opts, "mem-path", path, &error_abort); > + qemu_opt_set_number(opts, "size", size, &error_abort); > + qemu_opt_set_bool(opts, "share", true, &error_abort); > + g_free(path); > + > + obj = user_creatable_add_opts(opts, &error_abort); > + qemu_opts_del(opts); > + > + user_creatable_complete(obj, &error_abort); > + > + return MEMORY_BACKEND(obj); > +} > + > static void pci_ivshmem_realize(PCIDevice *dev, Error **errp) > { > IVShmemState *s = IVSHMEM(dev); > @@ -911,6 +914,10 @@ static void pci_ivshmem_realize(PCIDevice *dev, Error **errp) > attr |= PCI_BASE_ADDRESS_MEM_TYPE_64; > } > > + if (s->shmobj) { > + s->hostmem = desugar_shm(s->shmobj, s->ivshmem_size); > + } > + > if (s->hostmem != NULL) { > MemoryRegion *mr; > > @@ -921,7 +928,7 @@ static void pci_ivshmem_realize(PCIDevice *dev, Error **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) { > + } else { > IVSHMEM_DPRINTF("using shared memory server (socket = %s)\n", > s->server_chr->filename); > > @@ -948,36 +955,6 @@ static void pci_ivshmem_realize(PCIDevice *dev, Error **errp) > error_setg(errp, "failed to initialize interrupts"); > return; > } > - } else { > - /* just map the file immediately, we're not using a server */ > - int fd; > - > - IVSHMEM_DPRINTF("using shm_open (shm object = %s)\n", s->shmobj); > - > - /* try opening with O_EXCL and if it succeeds zero the memory > - * by truncating to 0 */ > - if ((fd = shm_open(s->shmobj, O_CREAT|O_RDWR|O_EXCL, > - S_IRWXU|S_IRWXG|S_IRWXO)) > 0) { > - /* truncate file to length PCI device's memory */ > - if (ftruncate(fd, s->ivshmem_size) != 0) { > - error_report("could not truncate shared file"); > - } > - > - } else if ((fd = shm_open(s->shmobj, O_CREAT|O_RDWR, > - S_IRWXU|S_IRWXG|S_IRWXO)) < 0) { > - error_setg(errp, "could not open shared file"); > - return; > - } > - > - if (check_shm_size(s, fd, errp) == -1) { > - return; > - } > - > - create_shared_memory_BAR(s, fd, attr, &err); > - if (err) { > - error_propagate(errp, err); > - return; > - } > } > > if (s->role_val == IVSHMEM_PEER) { >