From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LQ2tn-0003El-9j for qemu-devel@nongnu.org; Thu, 22 Jan 2009 11:59:23 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LQ2tm-0003EQ-K1 for qemu-devel@nongnu.org; Thu, 22 Jan 2009 11:59:23 -0500 Received: from [199.232.76.173] (port=53703 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LQ2tm-0003E9-EK for qemu-devel@nongnu.org; Thu, 22 Jan 2009 11:59:22 -0500 Received: from savannah.gnu.org ([199.232.41.3]:37258 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LQ2tl-00041V-VM for qemu-devel@nongnu.org; Thu, 22 Jan 2009 11:59:22 -0500 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.63) (envelope-from ) id 1LQ2tl-0003Kw-7p for qemu-devel@nongnu.org; Thu, 22 Jan 2009 16:59:21 +0000 Received: from aliguori by cvs.savannah.gnu.org with local (Exim 4.63) (envelope-from ) id 1LQ2tl-0003Ks-0e for qemu-devel@nongnu.org; Thu, 22 Jan 2009 16:59:21 +0000 MIME-Version: 1.0 Errors-To: aliguori Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Anthony Liguori Message-Id: Date: Thu, 22 Jan 2009 16:59:21 +0000 Subject: [Qemu-devel] [6396] I/O vector helpers (Avi Kivity) Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Revision: 6396 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=6396 Author: aliguori Date: 2009-01-22 16:59:20 +0000 (Thu, 22 Jan 2009) Log Message: ----------- I/O vector helpers (Avi Kivity) In general, it is not possible to predict the size of of an I/O vector since a contiguous guest region may map to a disconiguous host region. Add some helpers to manage I/O vector growth. Signed-off-by: Avi Kivity Signed-off-by: Anthony Liguori Modified Paths: -------------- trunk/cutils.c trunk/qemu-common.h Modified: trunk/cutils.c =================================================================== --- trunk/cutils.c 2009-01-22 16:59:16 UTC (rev 6395) +++ trunk/cutils.c 2009-01-22 16:59:20 UTC (rev 6396) @@ -101,3 +101,50 @@ { return 32 - clz32(i); } + +/* io vectors */ + +void qemu_iovec_init(QEMUIOVector *qiov, int alloc_hint) +{ + qiov->iov = qemu_malloc(alloc_hint * sizeof(struct iovec)); + qiov->niov = 0; + qiov->nalloc = alloc_hint; +} + +void qemu_iovec_add(QEMUIOVector *qiov, void *base, size_t len) +{ + if (qiov->niov == qiov->nalloc) { + qiov->nalloc = 2 * qiov->nalloc + 1; + qiov->iov = qemu_realloc(qiov->iov, qiov->nalloc * sizeof(struct iovec)); + } + qiov->iov[qiov->niov].iov_base = base; + qiov->iov[qiov->niov].iov_len = len; + ++qiov->niov; +} + +void qemu_iovec_destroy(QEMUIOVector *qiov) +{ + qemu_free(qiov->iov); +} + +void qemu_iovec_to_buffer(QEMUIOVector *qiov, void *buf) +{ + uint8_t *p = (uint8_t *)buf; + int i; + + for (i = 0; i < qiov->niov; ++i) { + memcpy(p, qiov->iov[i].iov_base, qiov->iov[i].iov_len); + p += qiov->iov[i].iov_len; + } +} + +void qemu_iovec_from_buffer(QEMUIOVector *qiov, const void *buf) +{ + const uint8_t *p = (const uint8_t *)buf; + int i; + + for (i = 0; i < qiov->niov; ++i) { + memcpy(qiov->iov[i].iov_base, p, qiov->iov[i].iov_len); + p += qiov->iov[i].iov_len; + } +} Modified: trunk/qemu-common.h =================================================================== --- trunk/qemu-common.h 2009-01-22 16:59:16 UTC (rev 6395) +++ trunk/qemu-common.h 2009-01-22 16:59:20 UTC (rev 6396) @@ -191,6 +191,18 @@ /* Force QEMU to stop what it's doing and service IO */ void qemu_service_io(void); +typedef struct QEMUIOVector { + struct iovec *iov; + int niov; + int nalloc; +} QEMUIOVector; + +void qemu_iovec_init(QEMUIOVector *qiov, int alloc_hint); +void qemu_iovec_add(QEMUIOVector *qiov, void *base, size_t len); +void qemu_iovec_destroy(QEMUIOVector *qiov); +void qemu_iovec_to_buffer(QEMUIOVector *qiov, void *buf); +void qemu_iovec_from_buffer(QEMUIOVector *qiov, const void *buf); + #endif /* dyngen-exec.h hack */ #endif