From patchwork Mon Dec 21 03:47:34 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tetsuya Mukawa X-Patchwork-Id: 559399 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 6BE2714009B for ; Mon, 21 Dec 2015 14:48:05 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=igel-co-jp.20150623.gappssmtp.com header.i=@igel-co-jp.20150623.gappssmtp.com header.b=IcfzM3Kz; dkim-atps=neutral Received: from localhost ([::1]:42975 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aArS7-0006pb-01 for incoming@patchwork.ozlabs.org; Sun, 20 Dec 2015 22:48:03 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57250) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aArRs-0006Xi-Bg for qemu-devel@nongnu.org; Sun, 20 Dec 2015 22:47:49 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aArRo-0005JM-At for qemu-devel@nongnu.org; Sun, 20 Dec 2015 22:47:48 -0500 Received: from mail-pf0-x236.google.com ([2607:f8b0:400e:c00::236]:35492) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aArRo-0005JH-0s for qemu-devel@nongnu.org; Sun, 20 Dec 2015 22:47:44 -0500 Received: by mail-pf0-x236.google.com with SMTP id 78so8044640pfw.2 for ; Sun, 20 Dec 2015 19:47:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=igel-co-jp.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=6TgcXPdShen2GU9Ms+RtCe+JvBh1Yvcf3wQNAZfXjQ4=; b=IcfzM3KzsYDcqvpt6IuttYamv48cN4frxos9J66zY9aawRrt+UBrXz47voISL+YoDn zt66v3RevIFK6HUcprB7kPnPrChZSsMUU58oQNgEbyoAknK3fw7blFnBPaxl99+m0CvV jVL9WN2vkeYUYfVK+/2Z/k/A3m1J7pSpFXFAPAaO6DNObf66zsbcvmdduraTs/tijfkB EMaAEVG/WahKMAvoZLF4wnGXTv+DNVg6HI73q/6JcXu9qmTRw3EY72CUrK8br/yDF9RG OgvP1CVrfUZz7LYprO6UlBgO2OEwm8lnkhehnek/5TjITdfZQO0Hb3wIDSR5uosUh/eI qUwA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=6TgcXPdShen2GU9Ms+RtCe+JvBh1Yvcf3wQNAZfXjQ4=; b=Bam0eBikUI7iKADS44ojRemep1JtDJ8xnwOuUQkgBOCy87KQ00qhQDa+rMx64MF1FO pp+Sm0fvTWopWzepHHz3mVZrVFlpkfVGjV8qQN9ZMCw25+w6MGQ2gXGK2UyyMtF1N9Dd ACDsXa66zbiNcmtXSPYQlm+Rf8oK3WVI7naNIlV1PAnOdjlynPfxveKagNa4YvDkeIyU PPwl4rfbPy/E3vnpY4grIMU50Mng+toogeR8873wt6tqIJ91HIG2CGwBf/uMsFgfozGv rhM143MxVtOSebPUKlv3iMOatWqv2P0WMIDhfmf0LSbolflN3P6yHwouHRtPKDzkoxXt tOPQ== X-Gm-Message-State: ALoCoQmDtO4wSuDd5skNpflfhfG9FhzIldYDp/imoPTmo92i0CAnhzg1g6Dt09zIKYJ7bHiDun5Jg1YM3ilNRPMtLGEy8Q7XOQ== X-Received: by 10.98.80.147 with SMTP id g19mr10689681pfj.26.1450669662646; Sun, 20 Dec 2015 19:47:42 -0800 (PST) Received: from localhost.localdomain (napt.igel.co.jp. [219.106.231.132]) by smtp.gmail.com with ESMTPSA id 7sm17868261pfn.83.2015.12.20.19.47.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 20 Dec 2015 19:47:41 -0800 (PST) From: Tetsuya Mukawa To: qemu-devel@nongnu.org Date: Mon, 21 Dec 2015 12:47:34 +0900 Message-Id: <1450669654-5248-1-git-send-email-mukawa@igel.co.jp> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1449201120-3432-1-git-send-email-mukawa@igel.co.jp> References: <1449201120-3432-1-git-send-email-mukawa@igel.co.jp> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2607:f8b0:400e:c00::236 Cc: Tetsuya Mukawa , marcandre.lureau@gmail.com, mst@redhat.com Subject: [Qemu-devel] [PATCH v2] ivshmem: Store file descriptor for vhost-user negotiation X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org If virtio-net driver allocates memory in ivshmem shared memory, vhost-net will work correctly, but vhost-user will not work because a fd of shared memory will not be sent to vhost-user backend. This patch fixes ivshmem to store file descriptor of shared memory. It will be used when vhost-user negotiates vhost-user backend. v2: * Fixed typo. Signed-off-by: Tetsuya Mukawa --- exec.c | 10 ++++++++++ hw/misc/ivshmem.c | 9 +++++++-- include/exec/ram_addr.h | 1 + 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/exec.c b/exec.c index 8718a75..7f0ce42 100644 --- a/exec.c +++ b/exec.c @@ -1757,6 +1757,16 @@ int qemu_get_ram_fd(ram_addr_t addr) return fd; } +void qemu_set_ram_fd(ram_addr_t addr, int fd) +{ + RAMBlock *block; + + rcu_read_lock(); + block = qemu_get_ram_block(addr); + block->fd = fd; + rcu_read_unlock(); +} + void *qemu_get_ram_block_host_ptr(ram_addr_t addr) { RAMBlock *block; diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c index f73f0c2..df585de 100644 --- a/hw/misc/ivshmem.c +++ b/hw/misc/ivshmem.c @@ -29,6 +29,7 @@ #include "sysemu/char.h" #include "sysemu/hostmem.h" #include "qapi/visitor.h" +#include "exec/ram_addr.h" #include "hw/misc/ivshmem.h" @@ -422,6 +423,7 @@ static int create_shared_memory_BAR(IVShmemState *s, int fd, uint8_t attr, 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); @@ -682,6 +684,7 @@ static void ivshmem_read(void *opaque, const uint8_t *buf, int size) } memory_region_init_ram_ptr(&s->ivshmem, OBJECT(s), "ivshmem.bar2", s->ivshmem_size, map_ptr); + qemu_set_ram_fd(s->ivshmem.ram_addr, incoming_fd); vmstate_register_ram(&s->ivshmem, DEVICE(s)); IVSHMEM_DPRINTF("guest h/w addr = %p, size = %" PRIu64 "\n", @@ -689,7 +692,6 @@ static void ivshmem_read(void *opaque, const uint8_t *buf, int size) memory_region_add_subregion(&s->bar, 0, &s->ivshmem); - close(incoming_fd); return; } @@ -991,7 +993,6 @@ static void pci_ivshmem_realize(PCIDevice *dev, Error **errp) } create_shared_memory_BAR(s, fd, attr, errp); - close(fd); } } @@ -1010,11 +1011,15 @@ static void pci_ivshmem_exit(PCIDevice *dev) if (memory_region_is_mapped(&s->ivshmem)) { if (!s->hostmem) { void *addr = memory_region_get_ram_ptr(&s->ivshmem); + int fd; if (munmap(addr, s->ivshmem_size) == -1) { error_report("Failed to munmap shared memory %s", strerror(errno)); } + + if ((fd = qemu_get_ram_fd(s->ivshmem.ram_addr)) != -1) + close(fd); } vmstate_unregister_ram(&s->ivshmem, DEVICE(dev)); diff --git a/include/exec/ram_addr.h b/include/exec/ram_addr.h index ba4c04d..ef1489d 100644 --- a/include/exec/ram_addr.h +++ b/include/exec/ram_addr.h @@ -72,6 +72,7 @@ ram_addr_t qemu_ram_alloc_resizeable(ram_addr_t size, ram_addr_t max_size, void *host), MemoryRegion *mr, Error **errp); int qemu_get_ram_fd(ram_addr_t addr); +void qemu_set_ram_fd(ram_addr_t addr, int fd); void *qemu_get_ram_block_host_ptr(ram_addr_t addr); void qemu_ram_free(ram_addr_t addr);