All of lore.kernel.org
 help / color / mirror / Atom feed
From: Markus Armbruster <armbru@redhat.com>
To: qemu-devel@nongnu.org
Cc: claudio.fontana@huawei.com, cam@cs.ualberta.ca,
	mlureau@redhat.com, david.marchand@6wind.com,
	pbonzini@redhat.com
Subject: [Qemu-devel] [PATCH v2 33/42] ivshmem: Implement shm=... with a memory backend
Date: Mon,  7 Mar 2016 20:25:45 +0100	[thread overview]
Message-ID: <1457378754-21649-34-git-send-email-armbru@redhat.com> (raw)
In-Reply-To: <1457378754-21649-1-git-send-email-armbru@redhat.com>

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 <armbru@redhat.com>
---
 hw/misc/ivshmem.c | 79 ++++++++++++++++---------------------------------------
 1 file changed, 23 insertions(+), 56 deletions(-)

diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c
index 1c25621..747f9c3 100644
--- a/hw/misc/ivshmem.c
+++ b/hw/misc/ivshmem.c
@@ -26,6 +26,7 @@
 #include "migration/migration.h"
 #include "qemu/error-report.h"
 #include "qemu/event_notifier.h"
+#include "qom/object_interfaces.h"
 #include "sysemu/char.h"
 #include "sysemu/hostmem.h"
 #include "qapi/visitor.h"
@@ -369,31 +370,6 @@ static int check_shm_size(IVShmemState *s, int fd, Error **errp)
     }
 }
 
-/* create the shared memory BAR when we are not using the server, so we can
- * create the BAR and map the memory immediately */
-static int create_shared_memory_BAR(IVShmemState *s, int fd, uint8_t attr,
-                                    Error **errp)
-{
-    void * ptr;
-
-    ptr = mmap(0, s->ivshmem_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
-    if (ptr == MAP_FAILED) {
-        error_setg_errno(errp, errno, "Failed to mmap shared memory");
-        return -1;
-    }
-
-    memory_region_init_ram_ptr(&s->ivshmem, OBJECT(s), "ivshmem.bar2",
-                               s->ivshmem_size, ptr);
-    qemu_set_ram_fd(s->ivshmem.ram_addr, fd);
-    vmstate_register_ram(&s->ivshmem, DEVICE(s));
-    memory_region_add_subregion(&s->bar, 0, &s->ivshmem);
-
-    /* region for shared memory */
-    pci_register_bar(PCI_DEVICE(s), 2, attr, &s->bar);
-
-    return 0;
-}
-
 static void ivshmem_add_eventfd(IVShmemState *s, int posn, int i)
 {
     memory_region_add_eventfd(&s->ivshmem_mmio,
@@ -833,6 +809,23 @@ static void ivshmem_write_config(PCIDevice *pdev, uint32_t address,
     }
 }
 
+static void desugar_shm(IVShmemState *s)
+{
+    Object *obj;
+    char *path;
+
+    obj = object_new("memory-backend-file");
+    path = g_strdup_printf("/dev/shm/%s", s->shmobj);
+    object_property_set_str(obj, path, "mem-path", &error_abort);
+    g_free(path);
+    object_property_set_int(obj, s->ivshmem_size, "size", &error_abort);
+    object_property_set_bool(obj, true, "share", &error_abort);
+    object_property_add_child(OBJECT(s), "internal-shm-backend", obj,
+                              &error_abort);
+    user_creatable_complete(obj, &error_abort);
+    s->hostmem = MEMORY_BACKEND(obj);
+}
+
 static void pci_ivshmem_realize(PCIDevice *dev, Error **errp)
 {
     IVShmemState *s = IVSHMEM(dev);
@@ -911,6 +904,10 @@ static void pci_ivshmem_realize(PCIDevice *dev, Error **errp)
         attr |= PCI_BASE_ADDRESS_MEM_TYPE_64;
     }
 
+    if (s->shmobj) {
+        desugar_shm(s);
+    }
+
     if (s->hostmem != NULL) {
         MemoryRegion *mr;
 
@@ -921,7 +918,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 +945,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) {
-- 
2.4.3

  parent reply	other threads:[~2016-03-07 19:26 UTC|newest]

Thread overview: 74+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-07 19:25 [Qemu-devel] [PATCH v2 00/42] ivshmem: Fixes, cleanups, device model split Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 01/42] exec: Fix memory allocation when memory path names new file Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 02/42] exec: Fix memory allocation when memory path isn't on hugetlbfs Markus Armbruster
2016-03-08 14:17   ` Paolo Bonzini
2016-03-15 16:41     ` Markus Armbruster
2016-03-15 16:56       ` Paolo Bonzini
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 03/42] target-ppc: Document TOCTTOU in hugepage support Markus Armbruster
2016-03-09 12:44   ` Marc-André Lureau
2016-03-09 20:05     ` Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 04/42] ivshmem-server: Fix and clean up command line help Markus Armbruster
2016-03-09 12:44   ` Marc-André Lureau
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 05/42] ivshmem-server: Don't overload POSIX shmem and file name Markus Armbruster
2016-03-09 12:44   ` Marc-André Lureau
2016-03-09 20:14     ` Markus Armbruster
2016-03-10  0:44       ` Marc-André Lureau
2016-03-10  6:57         ` Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 06/42] qemu-doc: Fix ivshmem huge page example Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 07/42] event_notifier: Make event_notifier_init_fd() #ifdef CONFIG_EVENTFD Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 08/42] tests/libqos/pci-pc: Fix qpci_pc_iomap() to map BARs aligned Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 09/42] ivshmem-test: Improve test case /ivshmem/single Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 10/42] ivshmem-test: Clean up wait for devices to become operational Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 11/42] ivshmem-test: Improve test cases /ivshmem/server-* Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 12/42] ivshmem: Rewrite specification document Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 13/42] ivshmem: Add missing newlines to debug printfs Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 14/42] ivshmem: Compile debug prints unconditionally to prevent bit-rot Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 15/42] ivshmem: Clean up after commit 9940c32 Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 16/42] ivshmem: Drop ivshmem_event() stub Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 17/42] ivshmem: Don't destroy the chardev on version mismatch Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 18/42] ivshmem: Fix harmless misuse of Error Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 19/42] ivshmem: Failed realize() can leave migration blocker behind Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 20/42] ivshmem: Clean up register callbacks Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 21/42] ivshmem: Clean up MSI-X conditions Markus Armbruster
2016-03-09 12:45   ` Marc-André Lureau
2016-03-09 20:15     ` Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 22/42] ivshmem: Leave INTx alone when using MSI-X Markus Armbruster
2016-03-09 12:45   ` Marc-André Lureau
2016-03-09 20:16     ` Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 23/42] ivshmem: Assert interrupts are set up once Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 24/42] ivshmem: Simplify rejection of invalid peer ID from server Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 25/42] ivshmem: Disentangle ivshmem_read() Markus Armbruster
2016-03-09 12:45   ` Marc-André Lureau
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 26/42] ivshmem: Plug leaks on unplug, fix peer disconnect Markus Armbruster
2016-03-09 12:45   ` Marc-André Lureau
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 27/42] ivshmem: Receive shared memory synchronously in realize() Markus Armbruster
2016-03-09 12:45   ` Marc-André Lureau
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 28/42] ivshmem: Propagate errors through ivshmem_recv_setup() Markus Armbruster
2016-03-09 12:46   ` Marc-André Lureau
2016-03-09 20:25     ` Markus Armbruster
2016-03-10  0:44       ` Marc-André Lureau
2016-03-10  6:38         ` Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 29/42] ivshmem: Rely on server sending the ID right after the version Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 30/42] ivshmem: Drop the hackish test for UNIX domain chardev Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 31/42] ivshmem: Simplify how we cope with short reads from server Markus Armbruster
2016-03-09 12:46   ` Marc-André Lureau
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 32/42] ivshmem: Tighten check of property "size" Markus Armbruster
2016-03-07 19:25 ` Markus Armbruster [this message]
2016-03-09 11:31   ` [Qemu-devel] [PATCH v2 33/42] ivshmem: Implement shm=... with a memory backend Marc-André Lureau
2016-03-09 20:59     ` Markus Armbruster
2016-03-10  0:44       ` Marc-André Lureau
2016-03-10  6:48         ` Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 34/42] ivshmem: Simplify memory regions for BAR 2 (shared memory) Markus Armbruster
2016-03-09 12:46   ` Marc-André Lureau
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 35/42] ivshmem: Inline check_shm_size() into its only caller Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 36/42] qdev: New DEFINE_PROP_ON_OFF_AUTO Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 37/42] ivshmem: Replace int role_val by OnOffAuto master Markus Armbruster
2016-03-09 12:46   ` Marc-André Lureau
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 38/42] ivshmem: Split ivshmem-plain, ivshmem-doorbell off ivshmem Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 39/42] ivshmem: Clean up after the previous commit Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 40/42] ivshmem: Drop ivshmem property x-memdev Markus Armbruster
2016-03-09 12:47   ` Marc-André Lureau
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 41/42] ivshmem: Require master to have ID zero Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 42/42] contrib/ivshmem-server: Print "not for production" warning Markus Armbruster
2016-03-08 14:05 ` [Qemu-devel] [PATCH v2 00/42] ivshmem: Fixes, cleanups, device model split Paolo Bonzini
2016-03-08 14:22 ` Paolo Bonzini

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=1457378754-21649-34-git-send-email-armbru@redhat.com \
    --to=armbru@redhat.com \
    --cc=cam@cs.ualberta.ca \
    --cc=claudio.fontana@huawei.com \
    --cc=david.marchand@6wind.com \
    --cc=mlureau@redhat.com \
    --cc=pbonzini@redhat.com \
    --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.