From 7a9096299832856a42477851e6ac76569d9fbf1e Mon Sep 17 00:00:00 2001 From: RustyRiscv <155590345+ping-long-github@users.noreply.github.com> Date: Mon, 9 Mar 2026 11:13:46 -0700 Subject: [PATCH] fix(virtio): sync descriptor indices to resolve stressfs read hang --- src/devices/virtio_blk.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/devices/virtio_blk.rs b/src/devices/virtio_blk.rs index 86260a4..49f737c 100644 --- a/src/devices/virtio_blk.rs +++ b/src/devices/virtio_blk.rs @@ -524,14 +524,20 @@ impl Virtio { // "Used Buffer Notification // - bit 0 - the interrupt was asserted because the device has used a buffer in at // least one of the active virtual queues." - cpu.bus.virtio.interrupt_status |= 0x1; + //cpu.bus.virtio.interrupt_status |= 0x1; //move this to the end of this function after processing the disk access. let virtq = cpu.bus.virtio.virtqueue(); let avail = VirtqAvail::new(cpu, virtq.avail_addr)?; + // let head_index = cpu.bus.read( + // avail.ring_start_addr + avail.idx as u64 % QUEUE_SIZE, + // HALFWORD, + // )?; + + // Use the device's internal ID to find the next available descriptor let head_index = cpu.bus.read( - avail.ring_start_addr + avail.idx as u64 % QUEUE_SIZE, + avail.ring_start_addr + (cpu.bus.virtio.id as u64 % QUEUE_SIZE) * 2, HALFWORD, )?; @@ -612,6 +618,7 @@ impl Virtio { cpu.bus .write(virtq.used_addr.wrapping_add(2), cpu.bus.virtio.id, HALFWORD)?; + cpu.bus.virtio.interrupt_status |= 0x1; Ok(()) } }