From mboxrd@z Thu Jan 1 00:00:00 1970 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 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 From: Stefan Hajnoczi Date: Wed, 18 Jul 2012 16:07:31 +0100 Message-Id: <1342624074-24650-5-git-send-email-stefanha@linux.vnet.ibm.com> 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> Subject: [Qemu-devel] [RFC v9 04/27] virtio-blk: Map vring List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , Anthony Liguori , Stefan Hajnoczi , kvm@vger.kernel.org, "Michael S. Tsirkin" , Khoa Huynh , Paolo Bonzini , Asias He 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) -- 1.7.10.4