qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH 29/38] ivshmem: Implement shm=... with a memory


From: Paolo Bonzini
Subject: Re: [Qemu-devel] [PATCH 29/38] ivshmem: Implement shm=... with a memory backend
Date: Tue, 1 Mar 2016 12:37:59 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.0


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 <address@hidden>

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) {
> 



reply via email to

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