On Sat, May 15, 2010 at 01:29:39PM -0400, Kevin O'Connor wrote:
Hi Gleb,
Is it okay for irqs to trigger during the wait for a read to complete? I would think a read could take some time for the host to complete and allowing the guest to handle irqs would be useful.
Processing irqs while waiting shouldn't be a problem.
Also, the code looks to be manually obtaining a page aligned buffer - seabios can do this natively. Using the aligned allocation functions reduces the memory pressure on the permanent low memory area.
Looks good. Thanks!
-Kevin
diff --git a/src/virtio-blk.c b/src/virtio-blk.c index 6c3f8a5..7cc2edb 100644 --- a/src/virtio-blk.c +++ b/src/virtio-blk.c @@ -58,7 +58,7 @@ virtio_blk_read(struct disk_op_s *op)
/* Wait for reply */ while (!vring_more_used(vq))
udelay(5);
usleep(5);
/* Reclaim virtqueue element */ vring_get_buf(vq, NULL);
@@ -104,7 +104,7 @@ virtio_blk_setup(void) pci_bdf_to_dev(bdf)); char *desc = malloc_tmphigh(MAXDESCSIZE); struct virtiodrive_s *vdrive_g = malloc_fseg(sizeof(*vdrive_g));
struct vring_virtqueue *vq = malloc_low(sizeof(*vq));
struct vring_virtqueue *vq = memalign_low(PAGE_SIZE, sizeof(*vq)); if (!vdrive_g || !desc || !vq) { free(vdrive_g); free(desc);
diff --git a/src/virtio-ring.h b/src/virtio-ring.h index 95ae85b..3fb86fe 100644 --- a/src/virtio-ring.h +++ b/src/virtio-ring.h @@ -72,7 +72,7 @@ struct vring { + PAGE_MASK) & ~PAGE_MASK) + \ (sizeof(struct vring_used) + sizeof(struct vring_used_elem) * num))
-typedef unsigned char virtio_queue_t[PAGE_MASK + vring_size(MAX_QUEUE_NUM)]; +typedef unsigned char virtio_queue_t[vring_size(MAX_QUEUE_NUM)];
struct vring_virtqueue { virtio_queue_t queue;
-- Gleb.