Merge remote-tracking branch 'origin/master' into threadpool
authorPaolo Bonzini <pbonzini@redhat.com>
Wed, 31 Oct 2012 09:42:51 +0000 (10:42 +0100)
committerPaolo Bonzini <pbonzini@redhat.com>
Wed, 31 Oct 2012 09:42:51 +0000 (10:42 +0100)
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
1  2 
Makefile
block/Makefile.objs
iov.c
osdep.c
qemu-timer.c
qmp.c
trace-events
vl.c

diff --cc Makefile
Simple merge
Simple merge
diff --cc iov.c
index ae17e7dff6d2e90cf607658703dcfdff61579634,b7378bf7ce023a4cdc970e2647e95335fedc0197..a81eedcedb4bf3b6bdaee7440045ddac4af26443
--- 1/iov.c
--- 2/iov.c
+++ b/iov.c
@@@ -229,105 -229,25 +229,128 @@@ void iov_hexdump(const struct iovec *io
      }
  }
  
+ unsigned iov_copy(struct iovec *dst_iov, unsigned int dst_iov_cnt,
+                  const struct iovec *iov, unsigned int iov_cnt,
+                  size_t offset, size_t bytes)
+ {
+     size_t len;
+     unsigned int i, j;
+     for (i = 0, j = 0; i < iov_cnt && j < dst_iov_cnt && bytes; i++) {
+         if (offset >= iov[i].iov_len) {
+             offset -= iov[i].iov_len;
+             continue;
+         }
+         len = MIN(bytes, iov[i].iov_len - offset);
+         dst_iov[j].iov_base = iov[i].iov_base + offset;
+         dst_iov[j].iov_len = len;
+         j++;
+         bytes -= len;
+         offset = 0;
+     }
+     assert(offset == 0);
+     return j;
+ }
++
 +/* io vectors */
 +
 +void qemu_iovec_init(QEMUIOVector *qiov, int alloc_hint)
 +{
 +    qiov->iov = g_malloc(alloc_hint * sizeof(struct iovec));
 +    qiov->niov = 0;
 +    qiov->nalloc = alloc_hint;
 +    qiov->size = 0;
 +}
 +
 +void qemu_iovec_init_external(QEMUIOVector *qiov, struct iovec *iov, int niov)
 +{
 +    int i;
 +
 +    qiov->iov = iov;
 +    qiov->niov = niov;
 +    qiov->nalloc = -1;
 +    qiov->size = 0;
 +    for (i = 0; i < niov; i++)
 +        qiov->size += iov[i].iov_len;
 +}
 +
 +void qemu_iovec_add(QEMUIOVector *qiov, void *base, size_t len)
 +{
 +    assert(qiov->nalloc != -1);
 +
 +    if (qiov->niov == qiov->nalloc) {
 +        qiov->nalloc = 2 * qiov->nalloc + 1;
 +        qiov->iov = g_realloc(qiov->iov, qiov->nalloc * sizeof(struct iovec));
 +    }
 +    qiov->iov[qiov->niov].iov_base = base;
 +    qiov->iov[qiov->niov].iov_len = len;
 +    qiov->size += len;
 +    ++qiov->niov;
 +}
 +
 +/*
 + * Concatenates (partial) iovecs from src to the end of dst.
 + * It starts copying after skipping `soffset' bytes at the
 + * beginning of src and adds individual vectors from src to
 + * dst copies up to `sbytes' bytes total, or up to the end
 + * of src if it comes first.  This way, it is okay to specify
 + * very large value for `sbytes' to indicate "up to the end
 + * of src".
 + * Only vector pointers are processed, not the actual data buffers.
 + */
 +void qemu_iovec_concat(QEMUIOVector *dst,
 +                       QEMUIOVector *src, size_t soffset, size_t sbytes)
 +{
 +    int i;
 +    size_t done;
 +    struct iovec *siov = src->iov;
 +    assert(dst->nalloc != -1);
 +    assert(src->size >= soffset);
 +    for (i = 0, done = 0; done < sbytes && i < src->niov; i++) {
 +        if (soffset < siov[i].iov_len) {
 +            size_t len = MIN(siov[i].iov_len - soffset, sbytes - done);
 +            qemu_iovec_add(dst, siov[i].iov_base + soffset, len);
 +            done += len;
 +            soffset = 0;
 +        } else {
 +            soffset -= siov[i].iov_len;
 +        }
 +    }
 +    /* return done; */
 +}
 +
 +void qemu_iovec_destroy(QEMUIOVector *qiov)
 +{
 +    assert(qiov->nalloc != -1);
 +
 +    qemu_iovec_reset(qiov);
 +    g_free(qiov->iov);
 +    qiov->nalloc = 0;
 +    qiov->iov = NULL;
 +}
 +
 +void qemu_iovec_reset(QEMUIOVector *qiov)
 +{
 +    assert(qiov->nalloc != -1);
 +
 +    qiov->niov = 0;
 +    qiov->size = 0;
 +}
 +
 +size_t qemu_iovec_to_buf(QEMUIOVector *qiov, size_t offset,
 +                         void *buf, size_t bytes)
 +{
 +    return iov_to_buf(qiov->iov, qiov->niov, offset, buf, bytes);
 +}
 +
 +size_t qemu_iovec_from_buf(QEMUIOVector *qiov, size_t offset,
 +                           const void *buf, size_t bytes)
 +{
 +    return iov_from_buf(qiov->iov, qiov->niov, offset, buf, bytes);
 +}
 +
 +size_t qemu_iovec_memset(QEMUIOVector *qiov, size_t offset,
 +                         int fillc, size_t bytes)
 +{
 +    return iov_memset(qiov->iov, qiov->niov, offset, fillc, bytes);
 +}
diff --cc osdep.c
Simple merge
diff --cc qemu-timer.c
Simple merge
diff --cc qmp.c
Simple merge
diff --cc trace-events
Simple merge
diff --cc vl.c
Simple merge