From patchwork Wed Mar 31 07:34:02 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amit Shah X-Patchwork-Id: 49108 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 8BE52B7C09 for ; Wed, 31 Mar 2010 20:12:23 +1100 (EST) Received: from localhost ([127.0.0.1]:55794 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NwtyG-0001dt-A4 for incoming@patchwork.ozlabs.org; Wed, 31 Mar 2010 05:12:20 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NwtxG-0001Xa-3X for qemu-devel@nongnu.org; Wed, 31 Mar 2010 05:11:18 -0400 Received: from [140.186.70.92] (port=40153 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NwtxC-0001X1-I6 for qemu-devel@nongnu.org; Wed, 31 Mar 2010 05:11:17 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1Nwtx9-00088B-Tw for qemu-devel@nongnu.org; Wed, 31 Mar 2010 05:11:14 -0400 Received: from mx1.redhat.com ([209.132.183.28]:8052) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1NwsTK-0007Ca-0y for qemu-devel@nongnu.org; Wed, 31 Mar 2010 03:36:18 -0400 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o2V7aFwq015732 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 31 Mar 2010 03:36:15 -0400 Received: from localhost (vpn-235-197.phx2.redhat.com [10.3.235.197]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o2V7aDCT007786; Wed, 31 Mar 2010 03:36:14 -0400 From: Amit Shah To: qemu list Date: Wed, 31 Mar 2010 13:04:02 +0530 Message-Id: <1270020848-15526-12-git-send-email-amit.shah@redhat.com> In-Reply-To: <1270020848-15526-11-git-send-email-amit.shah@redhat.com> References: <1270020848-15526-1-git-send-email-amit.shah@redhat.com> <1270020848-15526-2-git-send-email-amit.shah@redhat.com> <1270020848-15526-3-git-send-email-amit.shah@redhat.com> <1270020848-15526-4-git-send-email-amit.shah@redhat.com> <1270020848-15526-5-git-send-email-amit.shah@redhat.com> <1270020848-15526-6-git-send-email-amit.shah@redhat.com> <1270020848-15526-7-git-send-email-amit.shah@redhat.com> <1270020848-15526-8-git-send-email-amit.shah@redhat.com> <1270020848-15526-9-git-send-email-amit.shah@redhat.com> <1270020848-15526-10-git-send-email-amit.shah@redhat.com> <1270020848-15526-11-git-send-email-amit.shah@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. Cc: Amit Shah , "Michael S. Tsirkin" , Gerd Hoffmann , Juan Quintela Subject: [Qemu-devel] [PATCH 11/17] iov: Introduce a new file for helpers around iovs, add iov_from_buf() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org The virtio-net code uses iov_fill() which fills an iov from a linear buffer. The virtio-serial-bus code does something similar in an open-coded function. Create a new iov.c file that has iov_from_buf(). Convert virtio-net and virtio-serial-bus over to use this functionality. virtio-net used ints to hold sizes, the new function is going to use size_t types. Later commits will add the opposite functionality -- going from an iov to a linear buffer. Signed-off-by: Amit Shah --- Makefile.objs | 1 + hw/iov.c | 33 +++++++++++++++++++++++++++++++++ hw/iov.h | 16 ++++++++++++++++ hw/virtio-net.c | 20 +++----------------- hw/virtio-serial-bus.c | 15 +++++++-------- 5 files changed, 60 insertions(+), 25 deletions(-) create mode 100644 hw/iov.c create mode 100644 hw/iov.h diff --git a/Makefile.objs b/Makefile.objs index 233fbba..2ab09d7 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -129,6 +129,7 @@ user-obj-y += cutils.o cache-utils.o hw-obj-y = hw-obj-y += vl.o loader.o +hw-obj-y += iov.o hw-obj-y += virtio.o virtio-console.o hw-obj-$(CONFIG_VIRTIO_PCI) += virtio-pci.o hw-obj-y += fw_cfg.o pci.o pci_host.o pcie_host.o diff --git a/hw/iov.c b/hw/iov.c new file mode 100644 index 0000000..07bd499 --- /dev/null +++ b/hw/iov.c @@ -0,0 +1,33 @@ +/* + * Helpers for getting linearized buffers from iov / filling buffers into iovs + * + * Copyright IBM, Corp. 2007, 2008 + * Copyright (C) 2010 Red Hat, Inc. + * + * Author(s): + * Anthony Liguori + * Amit Shah + * + * This work is licensed under the terms of the GNU GPL, version 2. See + * the COPYING file in the top-level directory. + */ + +#include "iov.h" + +size_t iov_from_buf(struct iovec *iov, unsigned int iovcnt, + const void *buf, size_t size) +{ + size_t offset; + unsigned int i; + + offset = 0; + for (i = 0; offset < size && i < iovcnt; i++) { + size_t len; + + len = MIN(iov[i].iov_len, size - offset); + + memcpy(iov[i].iov_base, buf + offset, len); + offset += len; + } + return offset; +} diff --git a/hw/iov.h b/hw/iov.h new file mode 100644 index 0000000..5e3e541 --- /dev/null +++ b/hw/iov.h @@ -0,0 +1,16 @@ +/* + * Helpers for getting linearized buffers from iov / filling buffers into iovs + * + * Copyright (C) 2010 Red Hat, Inc. + * + * Author(s): + * Amit Shah + * + * This work is licensed under the terms of the GNU GPL, version 2. See + * the COPYING file in the top-level directory. + */ + +#include "qemu-common.h" + +size_t iov_from_buf(struct iovec *iov, unsigned int iovcnt, + const void *buf, size_t size); diff --git a/hw/virtio-net.c b/hw/virtio-net.c index be33c68..273e7f9 100644 --- a/hw/virtio-net.c +++ b/hw/virtio-net.c @@ -11,6 +11,7 @@ * */ +#include "iov.h" #include "virtio.h" #include "net.h" #include "net/checksum.h" @@ -423,21 +424,6 @@ static void work_around_broken_dhclient(struct virtio_net_hdr *hdr, } } -static int iov_fill(struct iovec *iov, int iovcnt, const void *buf, int count) -{ - int offset, i; - - offset = i = 0; - while (offset < count && i < iovcnt) { - int len = MIN(iov[i].iov_len, count - offset); - memcpy(iov[i].iov_base, buf + offset, len); - offset += len; - i++; - } - - return offset; -} - static int receive_header(VirtIONet *n, struct iovec *iov, int iovcnt, const void *buf, size_t size, size_t hdr_len) { @@ -573,8 +559,8 @@ static ssize_t virtio_net_receive(VLANClientState *nc, const uint8_t *buf, size_ } /* copy in packet. ugh */ - len = iov_fill(sg, elem.in_num, - buf + offset, size - offset); + len = iov_from_buf(sg, elem.in_num, + buf + offset, size - offset); total += len; /* signal other side */ diff --git a/hw/virtio-serial-bus.c b/hw/virtio-serial-bus.c index 236e300..ee45146 100644 --- a/hw/virtio-serial-bus.c +++ b/hw/virtio-serial-bus.c @@ -15,6 +15,7 @@ * the COPYING file in the top-level directory. */ +#include "iov.h" #include "monitor.h" #include "qemu-queue.h" #include "sysbus.h" @@ -84,27 +85,25 @@ static size_t write_to_port(VirtIOSerialPort *port, { VirtQueueElement elem; VirtQueue *vq; - size_t offset = 0; - size_t len = 0; + size_t offset; vq = port->ivq; if (!virtio_queue_ready(vq)) { return 0; } + offset = 0; while (offset < size) { - int i; + size_t len; if (!virtqueue_pop(vq, &elem)) { break; } - for (i = 0; offset < size && i < elem.in_num; i++) { - len = MIN(elem.in_sg[i].iov_len, size - offset); + len = iov_from_buf(elem.in_sg, elem.in_num, + buf + offset, size - offset); + offset += len; - memcpy(elem.in_sg[i].iov_base, buf + offset, len); - offset += len; - } virtqueue_push(vq, &elem, len); }