[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 01/27] block: enhance QEMUIOVector structure
From: |
Stefan Hajnoczi |
Subject: |
[Qemu-devel] [PULL 01/27] block: enhance QEMUIOVector structure |
Date: |
Fri, 22 Feb 2019 14:07:30 +0000 |
From: Vladimir Sementsov-Ogievskiy <address@hidden>
Add a possibility of embedded iovec, for cases when we need only one
local iov.
Signed-off-by: Vladimir Sementsov-Ogievskiy <address@hidden>
Reviewed-by: Eric Blake <address@hidden>
Message-id: address@hidden
Message-Id: <address@hidden>
Signed-off-by: Stefan Hajnoczi <address@hidden>
---
include/qemu/iov.h | 64 ++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 62 insertions(+), 2 deletions(-)
diff --git a/include/qemu/iov.h b/include/qemu/iov.h
index 5f433c7768..48b45987b7 100644
--- a/include/qemu/iov.h
+++ b/include/qemu/iov.h
@@ -133,10 +133,70 @@ size_t iov_discard_back(struct iovec *iov, unsigned int
*iov_cnt,
typedef struct QEMUIOVector {
struct iovec *iov;
int niov;
- int nalloc;
- size_t size;
+
+ /*
+ * For external @iov (qemu_iovec_init_external()) or allocated @iov
+ * (qemu_iovec_init()), @size is the cumulative size of iovecs and
+ * @local_iov is invalid and unused.
+ *
+ * For embedded @iov (QEMU_IOVEC_INIT_BUF() or qemu_iovec_init_buf()),
+ * @iov is equal to &@local_iov, and @size is valid, as it has same
+ * offset and type as @local_iov.iov_len, which is guaranteed by
+ * static assertion below.
+ *
+ * @nalloc is always valid and is -1 both for embedded and external
+ * cases. It is included in the union only to ensure the padding prior
+ * to the @size field will not result in a 0-length array.
+ */
+ union {
+ struct {
+ int nalloc;
+ struct iovec local_iov;
+ };
+ struct {
+ char __pad[sizeof(int) + offsetof(struct iovec, iov_len)];
+ size_t size;
+ };
+ };
} QEMUIOVector;
+QEMU_BUILD_BUG_ON(offsetof(QEMUIOVector, size) !=
+ offsetof(QEMUIOVector, local_iov.iov_len));
+
+#define QEMU_IOVEC_INIT_BUF(self, buf, len) \
+{ \
+ .iov = &(self).local_iov, \
+ .niov = 1, \
+ .nalloc = -1, \
+ .local_iov = { \
+ .iov_base = (void *)(buf), /* cast away const */ \
+ .iov_len = (len), \
+ }, \
+}
+
+/*
+ * qemu_iovec_init_buf
+ *
+ * Initialize embedded QEMUIOVector.
+ *
+ * Note: "const" is used over @buf pointer to make it simple to pass
+ * const pointers, appearing in read functions. Then this "const" is
+ * cast away by QEMU_IOVEC_INIT_BUF().
+ */
+static inline void qemu_iovec_init_buf(QEMUIOVector *qiov,
+ const void *buf, size_t len)
+{
+ *qiov = (QEMUIOVector) QEMU_IOVEC_INIT_BUF(*qiov, buf, len);
+}
+
+static inline void *qemu_iovec_buf(QEMUIOVector *qiov)
+{
+ /* Only supports embedded iov */
+ assert(qiov->nalloc == -1 && qiov->iov == &qiov->local_iov);
+
+ return qiov->local_iov.iov_base;
+}
+
void qemu_iovec_init(QEMUIOVector *qiov, int alloc_hint);
void qemu_iovec_init_external(QEMUIOVector *qiov, struct iovec *iov, int niov);
void qemu_iovec_add(QEMUIOVector *qiov, void *base, size_t len);
--
2.20.1
- [Qemu-devel] [PULL 00/27] Block patches, Stefan Hajnoczi, 2019/02/22
- [Qemu-devel] [PULL 04/27] block/backup: use qemu_iovec_init_buf, Stefan Hajnoczi, 2019/02/22
- [Qemu-devel] [PULL 06/27] block/stream: use QEMU_IOVEC_INIT_BUF, Stefan Hajnoczi, 2019/02/22
- [Qemu-devel] [PULL 05/27] block/commit: use QEMU_IOVEC_INIT_BUF, Stefan Hajnoczi, 2019/02/22
- [Qemu-devel] [PULL 11/27] block/vmdk: use qemu_iovec_init_buf, Stefan Hajnoczi, 2019/02/22
- [Qemu-devel] [PULL 07/27] block/parallels: use QEMU_IOVEC_INIT_BUF, Stefan Hajnoczi, 2019/02/22
- [Qemu-devel] [PULL 03/27] block/block-backend: use QEMU_IOVEC_INIT_BUF, Stefan Hajnoczi, 2019/02/22
- [Qemu-devel] [PULL 01/27] block: enhance QEMUIOVector structure,
Stefan Hajnoczi <=
- [Qemu-devel] [PULL 13/27] migration/block: use qemu_iovec_init_buf, Stefan Hajnoczi, 2019/02/22
- [Qemu-devel] [PULL 09/27] block/qcow2: use qemu_iovec_init_buf, Stefan Hajnoczi, 2019/02/22
- [Qemu-devel] [PULL 08/27] block/qcow: use qemu_iovec_init_buf, Stefan Hajnoczi, 2019/02/22
- [Qemu-devel] [PULL 10/27] block/qed: use qemu_iovec_init_buf, Stefan Hajnoczi, 2019/02/22
- [Qemu-devel] [PULL 14/27] tests/test-bdrv-drain: use QEMU_IOVEC_INIT_BUF, Stefan Hajnoczi, 2019/02/22
- [Qemu-devel] [PULL 15/27] hw/ide: drop iov field from IDEState, Stefan Hajnoczi, 2019/02/22
- [Qemu-devel] [PULL 12/27] qemu-img: use qemu_iovec_init_buf, Stefan Hajnoczi, 2019/02/22
- [Qemu-devel] [PULL 22/27] virtio-blk: set config size depending on the features enabled, Stefan Hajnoczi, 2019/02/22
- [Qemu-devel] [PULL 16/27] hw/ide: drop iov field from IDEBufferedRequest, Stefan Hajnoczi, 2019/02/22
- [Qemu-devel] [PULL 25/27] tests/virtio-blk: add virtio_blk_fix_dwz_hdr() function, Stefan Hajnoczi, 2019/02/22