From ea8ac63a06bf621408d65fbfc17d77fa4a19be6f Mon Sep 17 00:00:00 2001 From: Kevin O'Connor Date: Sun, 16 May 2010 11:34:38 -0400 Subject: [PATCH] Minor improvements to virtio (allow irqs, allocate page aligned). Allow irqs to be handled while waiting for virtio reads to complete. Use native page aligned allocations instead of manually aligning the data. This reduces the amount of low memory virtio requires. Also, some minor white space cleanups. --- src/virtio-blk.c | 9 ++++----- src/virtio-ring.h | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) 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); @@ -131,7 +131,7 @@ virtio_blk_setup(void) free(desc); free(vq); dprintf(1, "fail to find vq for virtio-blk %x:%x\n", - pci_bdf_to_bus (bdf), pci_bdf_to_dev(bdf)); + pci_bdf_to_bus(bdf), pci_bdf_to_dev(bdf)); continue; } @@ -141,7 +141,7 @@ virtio_blk_setup(void) vdrive_g->drive.blksize = cfg.blk_size; vdrive_g->drive.sectors = cfg.capacity; dprintf(3, "virtio-blk %x:%x blksize=%d sectors=%u\n", - pci_bdf_to_bus (bdf), pci_bdf_to_dev(bdf), + pci_bdf_to_bus(bdf), pci_bdf_to_dev(bdf), vdrive_g->drive.blksize, (u32)vdrive_g->drive.sectors); vdrive_g->drive.pchs.cylinders = cfg.cylinders; @@ -160,4 +160,3 @@ virtio_blk_setup(void) VIRTIO_CONFIG_S_DRIVER | VIRTIO_CONFIG_S_DRIVER_OK); } } - 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; -- 2.39.5