From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NuRvq-0001rd-8e for qemu-devel@nongnu.org; Wed, 24 Mar 2010 10:51:42 -0400 Received: from [140.186.70.92] (port=60953 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NuRvo-0001q3-9O for qemu-devel@nongnu.org; Wed, 24 Mar 2010 10:51:41 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1NuRvl-0006WG-E8 for qemu-devel@nongnu.org; Wed, 24 Mar 2010 10:51:39 -0400 Received: from mx1.redhat.com ([209.132.183.28]:53437) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1NuRvl-0006W1-47 for qemu-devel@nongnu.org; Wed, 24 Mar 2010 10:51:37 -0400 Received: from int-mx08.intmail.prod.int.phx2.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o2OEpain020932 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 24 Mar 2010 10:51:36 -0400 From: Amit Shah Date: Wed, 24 Mar 2010 20:19:30 +0530 Message-Id: <1269442173-18421-13-git-send-email-amit.shah@redhat.com> In-Reply-To: <1269442173-18421-12-git-send-email-amit.shah@redhat.com> References: <1269442173-18421-1-git-send-email-amit.shah@redhat.com> <1269442173-18421-2-git-send-email-amit.shah@redhat.com> <1269442173-18421-3-git-send-email-amit.shah@redhat.com> <1269442173-18421-4-git-send-email-amit.shah@redhat.com> <1269442173-18421-5-git-send-email-amit.shah@redhat.com> <1269442173-18421-6-git-send-email-amit.shah@redhat.com> <1269442173-18421-7-git-send-email-amit.shah@redhat.com> <1269442173-18421-8-git-send-email-amit.shah@redhat.com> <1269442173-18421-9-git-send-email-amit.shah@redhat.com> <1269442173-18421-10-git-send-email-amit.shah@redhat.com> <1269442173-18421-11-git-send-email-amit.shah@redhat.com> <1269442173-18421-12-git-send-email-amit.shah@redhat.com> Subject: [Qemu-devel] [PATCH 12/15] iov: Introduce a new file for helpers around iovs, add iov_from_buf() List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu list Cc: Amit Shah , Juan Quintela , Gerd Hoffmann , "Michael S. Tsirkin" 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 281f7a6..212ae1d 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -127,6 +127,7 @@ user-obj-y += cutils.o cache-utils.o # libhw hw-obj-y = +hw-obj-y += iov.o hw-obj-y += loader.o hw-obj-y += virtio.o virtio-console.o 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 80fbff4..bd1223e 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-objects.h" #include "qemu-queue.h" @@ -85,27 +86,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); } -- 1.6.2.5