aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2010-05-16 11:34:38 -0400
committerKevin O'Connor <kevin@koconnor.net>2010-05-16 11:34:38 -0400
commitea8ac63a06bf621408d65fbfc17d77fa4a19be6f (patch)
treee532a8f0a74c30b54faf739a4451629f7f91f9da
parent7d09d0e3ba11310e973d4302c7fcc3fc2184e04c (diff)
downloadseabios-ea8ac63a06bf621408d65fbfc17d77fa4a19be6f.tar.gz
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.
-rw-r--r--src/virtio-blk.c9
-rw-r--r--src/virtio-ring.h2
2 files changed, 5 insertions, 6 deletions
diff --git a/src/virtio-blk.c b/src/virtio-blk.c
index 6c3f8a5a..7cc2edbf 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 95ae85b5..3fb86fe4 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;