Message ID | 017e01d1003b$959bc820$c0d35860$@samsung.com |
---|---|
State | New |
Headers | show |
On Tue, Oct 06, 2015 at 04:33:23PM +0300, Pavel Fedin wrote: > This patch permits to share memory areas that do not specifically belong to > /dev/shm. In such case, the file must be already present when launching qemu. > A new parameter 'file' has been added to specify the file to use. > > A use case for this patch is sharing huge pages available through a > hugetlbfs mountpoint. ivshmem is getting a big reboot right now. See this series "[PATCH v5 00/48] ivshmem improvements". Part of that work is to better support sharing huge pages. Please look at that series first, and if there's still something missing, then additional patches to that series should be posted. Thanks, drew
Hello! > ivshmem is getting a big reboot right now. See this series > "[PATCH v5 00/48] ivshmem improvements". Part of that work > is to better support sharing huge pages. I see there's a PULL, and i was waiting for it to be merged in order to test. But, is it going to happen? I see there's some strong authorship-related conflict around it. Kind regards, Pavel Fedin Expert Engineer Samsung Electronics Research center Russia
Hi On Wed, Oct 7, 2015 at 3:13 PM, Pavel Fedin <p.fedin@samsung.com> wrote: > I see there's a PULL, and i was waiting for it to be merged in order to test. But, is it going to > happen? I see there's some strong authorship-related conflict around it. The authorship conflict is related to a single commit that could easily be dropped in the next pull request. It's worth it if you could test before it before it's actually merge! thanks
Hello! > The authorship conflict is related to a single commit that could > easily be dropped in the next pull request. It's worth it if you could > test before it before it's actually merge! Ok. In this case a single question. How to configure qemu to use ivshmem with the series. I have seen that "ivshmem can now use host memory backend", but how to set it up? I checked documentation patch, did not find good explanation there. But, well, programmers never read docs :) Kind regards, Pavel Fedin Expert Engineer Samsung Electronics Research center Russia
Hi
On Wed, Oct 7, 2015 at 3:50 PM, Pavel Fedin <p.fedin@samsung.com> wrote:
> Ok. In this case a single question. How to configure qemu to use ivshmem with the series. I have seen that "ivshmem can now use host memory backend", but how to set it up? I checked documentation patch, did not find good explanation there. But, well, programmers never read docs :)
It is like other memdev properties, and there is an example in the
patch adding a test:
-object memory-backend-ram,size=1M,id=mb1 -device ivshmem,memdev=mb1
I will work on a patch to update the documentation.
Hello! > It is like other memdev properties, and there is an example in the > patch adding a test: > -object memory-backend-ram,size=1M,id=mb1 -device ivshmem,memdev=mb1 But what will cause memory-backend-ram to use hugetlb instead of just a RAM? P.S. Sorry if the question is stupid, i'm not really familiar in hugetlb details. I only know that managing huge pages is done via hugetlbfs. Kind regards, Pavel Fedin Expert Engineer Samsung Electronics Research center Russia
Hi On Wed, Oct 7, 2015 at 4:22 PM, Pavel Fedin <p.fedin@samsung.com> wrote: > But what will cause memory-backend-ram to use hugetlb instead of just a RAM? > > P.S. Sorry if the question is stupid, i'm not really familiar in hugetlb details. I only know that managing huge pages is done via hugetlbfs. Ah right, docs/memory-hotplug.txt should give you more details: memory-backend-file,id=mem1,size=1G,mem-path=/mnt/hugepages-1GB I wish they would have documented this in qemu-docs.texi too
Hi! > P.S. Sorry if the question is stupid, i'm not really familiar in hugetlb details. I only know > that managing huge pages is done via hugetlbfs. Ops, i was double-stupid. :) The question should have actually been: "How to configure ivshmem to use hugetlb with the series?" Kind regards, Pavel Fedin Expert Engineer Samsung Electronics Research center Russia
diff --git a/docs/specs/ivshmem_device_spec.txt b/docs/specs/ivshmem_device_spec.txt index 667a862..8b108e7 100644 --- a/docs/specs/ivshmem_device_spec.txt +++ b/docs/specs/ivshmem_device_spec.txt @@ -4,8 +4,11 @@ Device Specification for Inter-VM shared memory device The Inter-VM shared memory device is designed to share a region of memory to userspace in multiple virtual guests. The memory region does not belong to any -guest, but is a POSIX memory object on the host. Optionally, the device may -support sending interrupts to other guests sharing the same memory region. +guest, but is a either a POSIX memory object or a mmap'd file (for instance, +hugepage-backed file) on the host. + +Optionally, the device may support sending interrupts to other guests sharing +the same memory region. The Inter-VM PCI device diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c index cc76989..999ed7d 100644 --- a/hw/misc/ivshmem.c +++ b/hw/misc/ivshmem.c @@ -100,9 +100,10 @@ typedef struct IVShmemState { Error *migration_blocker; - char * shmobj; - char * sizearg; - char * role; + char *shmobj; + char *fileobj; + char *sizearg; + char *role; int role_val; /* scalar to avoid multiple string comparisons */ } IVShmemState; @@ -769,9 +770,9 @@ static int pci_ivshmem_init(PCIDevice *dev) /* 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) { + if (s->shmobj != NULL || s->fileobj != NULL) { error_report("WARNING: do not specify both 'chardev' " - "and 'shm' with ivshmem"); + "and 'shm' or 'file' with ivshmem"); } IVSHMEM_DPRINTF("using shared memory server (socket = %s)\n", @@ -797,28 +798,49 @@ static int pci_ivshmem_init(PCIDevice *dev) } else { /* just map the file immediately, we're not using a server */ int fd; + int is_shm = !!(s->shmobj != NULL); + int is_file = !!(s->fileobj != NULL); - if (s->shmobj == NULL) { - error_report("Must specify 'chardev' or 'shm' to ivshmem"); + if (!(is_shm ^ is_file)) { + error_report("Must specify one of 'chardev', 'shm' or 'file' " + "to ivshmem"); exit(1); } - 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"); + if (is_shm) { + 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 */ + fd = shm_open(s->shmobj, O_CREAT|O_RDWR|O_EXCL, + S_IRWXU|S_IRWXG|S_IRWXO); + if (fd > 0) { + /* truncate file to length PCI device's memory */ + if (ftruncate(fd, s->ivshmem_size) != 0) { + error_report("could not truncate shared file: %s", + strerror(errno)); + exit(1); + } + } else { + fd = shm_open(s->shmobj, O_CREAT|O_RDWR, + S_IRWXU|S_IRWXG|S_IRWXO); + if (fd < 0) { + error_report("could not open shared file: %s", + strerror(errno)); + exit(1); + } + } + } else { + IVSHMEM_DPRINTF("using open (file object = %s)\n", s->fileobj); + + /* try opening a mmap's file. This file must have been previously + * created on the host */ + fd = open(s->fileobj, O_RDWR); + if (fd < 0) { + error_report("ivshmem: could not open file: %s\n", + strerror(errno)); + exit(-1); } - - } else if ((fd = shm_open(s->shmobj, O_CREAT|O_RDWR, - S_IRWXU|S_IRWXG|S_IRWXO)) < 0) { - error_report("could not open shared file"); - exit(1); - } if (check_shm_size(s, fd) == -1) { @@ -856,6 +878,7 @@ static Property ivshmem_properties[] = { DEFINE_PROP_BIT("ioeventfd", IVShmemState, features, IVSHMEM_IOEVENTFD, false), DEFINE_PROP_BIT("msi", IVShmemState, features, IVSHMEM_MSI, true), DEFINE_PROP_STRING("shm", IVShmemState, shmobj), + DEFINE_PROP_STRING("file", IVShmemState, fileobj), DEFINE_PROP_STRING("role", IVShmemState, role), DEFINE_PROP_UINT32("use64", IVShmemState, ivshmem_64bit, 1), DEFINE_PROP_END_OF_LIST(),