[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 01/10] virtio: Factor virtqueue_map_sg out
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PATCH 01/10] virtio: Factor virtqueue_map_sg out |
Date: |
Mon, 30 Aug 2010 18:32:24 +0200 |
Separate the mapping of requests to host memory from the descriptor iteration.
The next patch will make use of it in a different context.
Signed-off-by: Kevin Wolf <address@hidden>
---
hw/virtio.c | 38 ++++++++++++++++++++++++--------------
hw/virtio.h | 3 +++
2 files changed, 27 insertions(+), 14 deletions(-)
diff --git a/hw/virtio.c b/hw/virtio.c
index 4475bb3..85312b3 100644
--- a/hw/virtio.c
+++ b/hw/virtio.c
@@ -360,11 +360,26 @@ int virtqueue_avail_bytes(VirtQueue *vq, int in_bytes,
int out_bytes)
return 0;
}
+void virtqueue_map_sg(struct iovec *sg, target_phys_addr_t *addr,
+ size_t num_sg, int is_write)
+{
+ unsigned int i;
+ target_phys_addr_t len;
+
+ for (i = 0; i < num_sg; i++) {
+ len = sg[i].iov_len;
+ sg[i].iov_base = cpu_physical_memory_map(addr[i], &len, is_write);
+ if (sg[i].iov_base == NULL || len != sg[i].iov_len) {
+ fprintf(stderr, "virtio: trying to map MMIO memory\n");
+ exit(1);
+ }
+ }
+}
+
int virtqueue_pop(VirtQueue *vq, VirtQueueElement *elem)
{
unsigned int i, head, max;
target_phys_addr_t desc_pa = vq->vring.desc;
- target_phys_addr_t len;
if (!virtqueue_num_heads(vq, vq->last_avail_idx))
return 0;
@@ -388,28 +403,19 @@ int virtqueue_pop(VirtQueue *vq, VirtQueueElement *elem)
i = 0;
}
+ /* Collect all the descriptors */
do {
struct iovec *sg;
- int is_write = 0;
if (vring_desc_flags(desc_pa, i) & VRING_DESC_F_WRITE) {
elem->in_addr[elem->in_num] = vring_desc_addr(desc_pa, i);
sg = &elem->in_sg[elem->in_num++];
- is_write = 1;
- } else
+ } else {
+ elem->out_addr[elem->out_num] = vring_desc_addr(desc_pa, i);
sg = &elem->out_sg[elem->out_num++];
+ }
- /* Grab the first descriptor, and check it's OK. */
sg->iov_len = vring_desc_len(desc_pa, i);
- len = sg->iov_len;
-
- sg->iov_base = cpu_physical_memory_map(vring_desc_addr(desc_pa, i),
- &len, is_write);
-
- if (sg->iov_base == NULL || len != sg->iov_len) {
- fprintf(stderr, "virtio: trying to map MMIO memory\n");
- exit(1);
- }
/* If we've got too many, that implies a descriptor loop. */
if ((elem->in_num + elem->out_num) > max) {
@@ -418,6 +424,10 @@ int virtqueue_pop(VirtQueue *vq, VirtQueueElement *elem)
}
} while ((i = virtqueue_next_desc(desc_pa, i, max)) != max);
+ /* Now map what we have collected */
+ virtqueue_map_sg(elem->in_sg, elem->in_addr, elem->in_num, 1);
+ virtqueue_map_sg(elem->out_sg, elem->out_addr, elem->out_num, 0);
+
elem->index = head;
vq->inuse++;
diff --git a/hw/virtio.h b/hw/virtio.h
index 5836ab6..1deeb2c 100644
--- a/hw/virtio.h
+++ b/hw/virtio.h
@@ -81,6 +81,7 @@ typedef struct VirtQueueElement
unsigned int out_num;
unsigned int in_num;
target_phys_addr_t in_addr[VIRTQUEUE_MAX_SIZE];
+ target_phys_addr_t out_addr[VIRTQUEUE_MAX_SIZE];
struct iovec in_sg[VIRTQUEUE_MAX_SIZE];
struct iovec out_sg[VIRTQUEUE_MAX_SIZE];
} VirtQueueElement;
@@ -142,6 +143,8 @@ void virtqueue_flush(VirtQueue *vq, unsigned int count);
void virtqueue_fill(VirtQueue *vq, const VirtQueueElement *elem,
unsigned int len, unsigned int idx);
+void virtqueue_map_sg(struct iovec *sg, target_phys_addr_t *addr,
+ size_t num_sg, int is_write);
int virtqueue_pop(VirtQueue *vq, VirtQueueElement *elem);
int virtqueue_avail_bytes(VirtQueue *vq, int in_bytes, int out_bytes);
--
1.7.2.2
- [Qemu-devel] [PULL 00/10] Block patches, Kevin Wolf, 2010/08/30
- [Qemu-devel] [PATCH 08/10] posix-aio-compat: Fix async_conmtext for ioctl, Kevin Wolf, 2010/08/30
- [Qemu-devel] [PATCH 03/10] block: Fix image re-open in bdrv_commit, Kevin Wolf, 2010/08/30
- [Qemu-devel] [PATCH 10/10] savevm: Generate a name when run without one, Kevin Wolf, 2010/08/30
- [Qemu-devel] [PATCH 07/10] nbd: Introduce NBD named exports., Kevin Wolf, 2010/08/30
- [Qemu-devel] [PATCH 01/10] virtio: Factor virtqueue_map_sg out,
Kevin Wolf <=
- [Qemu-devel] [PATCH 05/10] qemu-img rebase: Open new backing file read-only, Kevin Wolf, 2010/08/30
- [Qemu-devel] [PATCH 04/10] sheepdog: remove unnecessary includes, Kevin Wolf, 2010/08/30
- [Qemu-devel] [PATCH 09/10] monitor: make 'info snapshots' show only fully available snapshots, Kevin Wolf, 2010/08/30
- [Qemu-devel] [PATCH 02/10] virtio-blk: Fix migration of queued requests, Kevin Wolf, 2010/08/30
- [Qemu-devel] [PATCH 06/10] vvfat: fat_chksum(): fix access above array bounds, Kevin Wolf, 2010/08/30