From patchwork Wed Jul 18 15:07:31 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Hajnoczi X-Patchwork-Id: 171709 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 1C10D2C0084 for ; Thu, 19 Jul 2012 01:09:05 +1000 (EST) Received: from localhost ([::1]:33743 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SrVs5-0005j0-OA for incoming@patchwork.ozlabs.org; Wed, 18 Jul 2012 11:09:01 -0400 Received: from eggs.gnu.org ([208.118.235.92]:52852) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SrVrh-0005R6-Rn for qemu-devel@nongnu.org; Wed, 18 Jul 2012 11:08:41 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SrVrb-0000hQ-1q for qemu-devel@nongnu.org; Wed, 18 Jul 2012 11:08:37 -0400 Received: from e06smtp10.uk.ibm.com ([195.75.94.106]:59644) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SrVra-0000h7-Oh for qemu-devel@nongnu.org; Wed, 18 Jul 2012 11:08:30 -0400 Received: from /spool/local by e06smtp10.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 18 Jul 2012 16:08:29 +0100 Received: from d06nrmr1307.portsmouth.uk.ibm.com (9.149.38.129) by e06smtp10.uk.ibm.com (192.168.101.140) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 18 Jul 2012 16:08:27 +0100 Received: from d06av12.portsmouth.uk.ibm.com (d06av12.portsmouth.uk.ibm.com [9.149.37.247]) by d06nrmr1307.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q6IF8QCv2662416 for ; Wed, 18 Jul 2012 16:08:26 +0100 Received: from d06av12.portsmouth.uk.ibm.com (loopback [127.0.0.1]) by d06av12.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q6IF8QQi007367 for ; Wed, 18 Jul 2012 09:08:26 -0600 Received: from localhost (sig-9-145-185-169.de.ibm.com [9.145.185.169]) by d06av12.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id q6IF8Q2l007339; Wed, 18 Jul 2012 09:08:26 -0600 From: Stefan Hajnoczi To: Date: Wed, 18 Jul 2012 16:07:31 +0100 Message-Id: <1342624074-24650-5-git-send-email-stefanha@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1342624074-24650-1-git-send-email-stefanha@linux.vnet.ibm.com> References: <1342624074-24650-1-git-send-email-stefanha@linux.vnet.ibm.com> x-cbid: 12071815-4966-0000-0000-000002FADDBA X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 195.75.94.106 Cc: Kevin Wolf , Anthony Liguori , Stefan Hajnoczi , kvm@vger.kernel.org, "Michael S. Tsirkin" , Khoa Huynh , Paolo Bonzini , Asias He Subject: [Qemu-devel] [RFC v9 04/27] virtio-blk: Map vring 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 Map the vring to host memory so it can be accessed without the overhead of the QEMU memory functions. Signed-off-by: Stefan Hajnoczi --- hw/virtio-blk.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c index f6043bc..4c790a3 100644 --- a/hw/virtio-blk.c +++ b/hw/virtio-blk.c @@ -14,6 +14,7 @@ #include #include #include +#include #include "qemu-common.h" #include "qemu-thread.h" #include "qemu-error.h" @@ -43,6 +44,8 @@ typedef struct VirtIOBlock bool data_plane_started; QemuThread data_plane_thread; + struct vring vring; + int epoll_fd; /* epoll(2) file descriptor */ io_context_t io_ctx; /* Linux AIO context */ EventNotifier io_notifier; /* Linux AIO eventfd */ @@ -55,6 +58,43 @@ static VirtIOBlock *to_virtio_blk(VirtIODevice *vdev) return (VirtIOBlock *)vdev; } +/* Map the guest's vring to host memory + * + * This is not allowed but we know the ring won't move. + */ +static void map_vring(struct vring *vring, VirtIODevice *vdev, int n) +{ + target_phys_addr_t physaddr, len; + + vring->num = virtio_queue_get_num(vdev, n); + + physaddr = virtio_queue_get_desc_addr(vdev, n); + len = virtio_queue_get_desc_size(vdev, n); + vring->desc = cpu_physical_memory_map(physaddr, &len, 0); + + physaddr = virtio_queue_get_avail_addr(vdev, n); + len = virtio_queue_get_avail_size(vdev, n); + vring->avail = cpu_physical_memory_map(physaddr, &len, 0); + + physaddr = virtio_queue_get_used_addr(vdev, n); + len = virtio_queue_get_used_size(vdev, n); + vring->used = cpu_physical_memory_map(physaddr, &len, 0); + + if (!vring->desc || !vring->avail || !vring->used) { + fprintf(stderr, "virtio-blk failed to map vring\n"); + exit(1); + } + + fprintf(stderr, "virtio-blk vring physical=%#lx desc=%p avail=%p used=%p\n", + virtio_queue_get_ring_addr(vdev, n), + vring->desc, vring->avail, vring->used); +} + +static void unmap_vring(struct vring *vring, VirtIODevice *vdev, int n) +{ + cpu_physical_memory_unmap(vring->desc, virtio_queue_get_ring_size(vdev, n), 0, 0); +} + static void handle_io(void) { fprintf(stderr, "io completion happened\n"); @@ -109,6 +149,8 @@ static void add_event_handler(int epoll_fd, EventHandler *event_handler) static void data_plane_start(VirtIOBlock *s) { + map_vring(&s->vring, &s->vdev, 0); + /* Create epoll file descriptor */ s->epoll_fd = epoll_create1(EPOLL_CLOEXEC); if (s->epoll_fd < 0) { @@ -157,6 +199,8 @@ static void data_plane_stop(VirtIOBlock *s) s->vdev.binding->set_host_notifier(s->vdev.binding_opaque, 0, false); close(s->epoll_fd); + + unmap_vring(&s->vring, &s->vdev, 0); } static void virtio_blk_set_status(VirtIODevice *vdev, uint8_t val)