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: 1211531 Return-Path: X-Original-To: patchwork-kvm@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork2.kernel.org (Postfix) with ESMTP id 3AA9DDFFFD for ; Wed, 18 Jul 2012 15:08:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754774Ab2GRPIi (ORCPT ); Wed, 18 Jul 2012 11:08:38 -0400 Received: from e06smtp14.uk.ibm.com ([195.75.94.110]:59102 "EHLO e06smtp14.uk.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754616Ab2GRPIc (ORCPT ); Wed, 18 Jul 2012 11:08:32 -0400 Received: from /spool/local by e06smtp14.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 18 Jul 2012 16:08:31 +0100 Received: from d06nrmr1507.portsmouth.uk.ibm.com (9.149.38.233) by e06smtp14.uk.ibm.com (192.168.101.144) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 18 Jul 2012 16:08:28 +0100 Received: from d06av12.portsmouth.uk.ibm.com (d06av12.portsmouth.uk.ibm.com [9.149.37.247]) by d06nrmr1507.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q6IF8Rvh1515722 for ; Wed, 18 Jul 2012 16:08:27 +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 q6IF8QQo007367 for ; Wed, 18 Jul 2012 09:08:27 -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: Cc: , Anthony Liguori , Kevin Wolf , Paolo Bonzini , "Michael S. Tsirkin" , Asias He , Khoa Huynh , Stefan Hajnoczi Subject: [RFC v9 04/27] virtio-blk: Map vring 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-1948-0000-0000-0000026EE5B2 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.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)