diff options
author | aliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162> | 2009-01-22 16:59:20 +0000 |
---|---|---|
committer | aliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162> | 2009-01-22 16:59:20 +0000 |
commit | 31f78c38f47b27adbde40a485df16ac0ff161a6a (patch) | |
tree | 450cf688ca2c46221c9e4447da0bbabde0398b29 /cutils.c | |
parent | 9b197cefa0f1b5dde3bd545809d4a199a9fc147e (diff) | |
download | qemu-31f78c38f47b27adbde40a485df16ac0ff161a6a.tar.gz qemu-31f78c38f47b27adbde40a485df16ac0ff161a6a.tar.bz2 qemu-31f78c38f47b27adbde40a485df16ac0ff161a6a.zip |
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 <avi@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6396 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'cutils.c')
-rw-r--r-- | cutils.c | 47 |
1 files changed, 47 insertions, 0 deletions
@@ -101,3 +101,50 @@ int qemu_fls(int i) { 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; + } +} |