qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH] ivshmem: allow the sharing of hugepages


From: Damien Millescamps
Subject: [Qemu-devel] [PATCH] ivshmem: allow the sharing of hugepages
Date: Thu, 12 Sep 2013 20:23:48 +0200

According to shm_open specifications:

 A shared memory object should be identified by a name of the form /somename;
 that is, a null-terminated string of up to NAME_MAX (i.e., 255) characters
 consisting of an initial slash, followed by one or more characters, none of
 which are slashes.

This patch permits to share memory areas that do not specifically belong to
/dev/shmem.

A use case for this patch is sharing huge pages available through a
hugetlbfs mountpoint.

Signed-off-by: Damien Millescamps <address@hidden>
---
 hw/misc/ivshmem.c |   16 +++++++++++++++-
 1 files changed, 15 insertions(+), 1 deletions(-)

diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c
index 2838866..9020bb2 100644
--- a/hw/misc/ivshmem.c
+++ b/hw/misc/ivshmem.c
@@ -751,9 +751,23 @@ static int pci_ivshmem_init(PCIDevice *dev)
 
         IVSHMEM_DPRINTF("using shm_open (shm object = %s)\n", s->shmobj);
 
+        /* 
+         * A shared memory object should be identified by a name of the form 
/somename; 
+         * that is, a null-terminated string of up to NAME_MAX (i.e., 255) 
characters 
+         * consisting of an initial slash, followed by one or more characters, 
none of 
+         * which are slashes.
+         */
+        if (s->shmobj && s->shmobj[0] == '/' && strstr(&s->shmobj[1], "/")) {
+            /* This can't be a shared memory object. */
+            fd = open(s->shmobj, O_RDWR);
+            if (fd < 0) {
+                perror("ivshmem - open");
+                exit(-1);
+            }
+        }
         /* 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,
+        else 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) {
-- 
1.7.2.5




reply via email to

[Prev in Thread] Current Thread [Next in Thread]