diff options
author | Alec Murphy <alec@checksum.fail> | 2019-09-24 13:13:40 -0400 |
---|---|---|
committer | Alec Murphy <alec@checksum.fail> | 2019-09-24 13:13:40 -0400 |
commit | 527b324d1fc28620d795e387d208996f2ceda405 (patch) | |
tree | 8f17b56bb70c48dff044a2d1fac2aa41e55d021f | |
parent | 03e697708087ef71dce9b905572614cd9bf86f66 (diff) |
Flush cache after write request; Limit max_blk to 2G by default
-rw-r--r-- | DskVIO.HC | 35 | ||||
-rw-r--r-- | Virtio-blk.HC | 7 |
2 files changed, 39 insertions, 3 deletions
@@ -1,3 +1,28 @@ +U0 VIOFlush() +{ + I64 j; + I64 vq_idx; + CVirtioBlkRequest *brq = CAlloc(sizeof(CVirtioBlkRequest)); + brq->type = VIRTIO_BLK_T_FLUSH; + brq->sector = NULL; + vq_idx = virtio_blk.vq->available.index % 128; + virtio_blk.vq->buffers[virtio_blk.vq_index%128].address = brq; + virtio_blk.vq->buffers[virtio_blk.vq_index%128].length = sizeof(CVirtioBlkRequest); + virtio_blk.vq->buffers[virtio_blk.vq_index%128].flags = VRING_DESC_F_NEXT; + virtio_blk.vq->buffers[virtio_blk.vq_index%128].next = (virtio_blk.vq_index+1)%128; + virtio_blk.vq->buffers[(virtio_blk.vq_index+1)%128].address = &virtio_blk.status; + virtio_blk.vq->buffers[(virtio_blk.vq_index+1)%128].length = 1; + virtio_blk.vq->buffers[(virtio_blk.vq_index+1)%128].flags = VRING_DESC_F_WRITE; + virtio_blk.vq->buffers[(virtio_blk.vq_index+1)%128].next = 0; + virtio_blk.vq->available.ring[vq_idx] = virtio_blk.vq_index%128; + virtio_blk.vq_index += 2; + j = virtio_blk.vq->used.index; + virtio_blk.vq->available.index++; + OutU16(virtio_blk.port + VIRTIO_PCI_QUEUE_NOTIFY, 0); + while (j==virtio_blk.vq->used.index){Yield;} + Free(brq); +} + Bool VIORBlks(CDrv *dv, U8 *buf, I64 blk, I64 cnt) { I64 i, j; @@ -65,6 +90,7 @@ Bool VIOWBlks(CDrv *dv, U8 *buf, I64 blk, I64 cnt) while (j==virtio_blk.vq->used.index){Yield;} } Free(brq); + VIOFlush; return TRUE; } @@ -76,7 +102,14 @@ U8 MountVirtioBlk() bd->max_blk = 512; BlkDevAdd(bd,,TRUE,TRUE); bd->type = BDT_VIRTIO_BLK; - bd->max_blk = virtio_blk.blks; + if (VIRTIO_BLK_MAX_BLK) + { + bd->max_blk = VIRTIO_BLK_MAX_BLK; + } + else + { + bd->max_blk = virtio_blk.blks; + } Free(bd->RAM_dsk); dv->size=bd->max_blk+1-bd->drv_offset; VIORBlks(dv,bs,0,1); diff --git a/Virtio-blk.HC b/Virtio-blk.HC index 78cccc5..1f6ee4f 100644 --- a/Virtio-blk.HC +++ b/Virtio-blk.HC @@ -1,5 +1,8 @@ -#define VIRTIO_BLK_T_IN 0 -#define VIRTIO_BLK_T_OUT 1 +#define VIRTIO_BLK_T_IN 0 +#define VIRTIO_BLK_T_OUT 1 +#define VIRTIO_BLK_T_FLUSH 4 + +#define VIRTIO_BLK_MAX_BLK 0x400000 // Limit blkdev to 2G max, set to NULL to use entire disk (not recommended for RedSea) class CVirtioBlk { |