Skip to content

Commit c48e4ed

Browse files
committed
virtio: Refactor base and virtio_gpu, virtio_net drivers
1 parent e165d72 commit c48e4ed

14 files changed

Lines changed: 2956 additions & 1135 deletions

File tree

drivers/common/virtio/src/lib.rs

Lines changed: 196 additions & 212 deletions
Large diffs are not rendered by default.

drivers/net/virtio_net/src/lib.rs

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#![no_std]
22

3-
use virtio::{VirtQueue, VirtioDevice};
3+
use virtio::{DescChain, VirtQueue, VirtioDevice};
44
use zinnia::{
55
alloc::{boxed::Box, sync::Arc, vec::Vec},
66
arch,
@@ -40,17 +40,17 @@ struct Controller {
4040
}
4141

4242
struct TxBuffer {
43-
desc_id: u32,
43+
chain: DescChain,
4444
_buffer: OwnedPhysPages,
4545
}
4646

4747
impl Controller {
4848
fn reap_tx(&self, queue: &mut VirtQueue) {
49-
while let Some((desc_id, _)) = queue.get_used() {
50-
queue.release_used_chain(desc_id);
49+
while let Some(used) = queue.get_used() {
50+
queue.release_used_chain(used.chain);
5151

5252
let mut buffers = self.tx_buffers.lock();
53-
if let Some(pos) = buffers.iter().position(|buf| buf.desc_id == desc_id) {
53+
if let Some(pos) = buffers.iter().position(|buf| buf.chain == used.chain) {
5454
buffers.swap_remove(pos);
5555
}
5656
}
@@ -66,7 +66,7 @@ impl NicDevice for Controller {
6666
// Block on rx_event until the IRQ wakes us with a used entry to claim.
6767
// The guard()-then-check pattern avoids missing an already-completed
6868
// descriptor before we put the task to sleep.
69-
let (desc_id, len) = loop {
69+
let used = loop {
7070
let guard = self.rx_event.guard();
7171
{
7272
let mut queue = self.recv_queue.lock();
@@ -77,12 +77,12 @@ impl NicDevice for Controller {
7777
guard.wait();
7878
};
7979

80-
debug_assert!((desc_id as usize) < self.rx_buffers.len());
81-
let slot = desc_id as usize;
82-
let buf = &self.rx_buffers[slot];
80+
let slot = used.chain.head() as usize;
81+
debug_assert!(slot < self.rx_buffers.len());
82+
let buf = self.rx_buffers.get(slot).ok_or(Errno::EIO)?;
8383

8484
// The first VIRTIO_NET_HDR_LEN bytes are the virtio-net header; skip them.
85-
let total = (len as usize).min(self.page_size);
85+
let total = (used.len as usize).min(self.page_size);
8686
let payload_len = total.saturating_sub(VIRTIO_NET_HDR_LEN);
8787
let n = payload_len.min(frame.len());
8888

@@ -94,9 +94,9 @@ impl NicDevice for Controller {
9494

9595
// Re-add the same physical buffer so the queue stays full.
9696
let mut queue = self.recv_queue.lock();
97-
queue.release_used_chain(desc_id);
97+
queue.release_used_chain(used.chain);
9898
queue.add_buffer(&[(buf.phys(), self.page_size, true)])?;
99-
self.virtio.lock().notify_queue(&queue);
99+
self.virtio.lock().notify_queue(&queue)?;
100100

101101
Ok(n)
102102
}
@@ -125,12 +125,12 @@ impl NicDevice for Controller {
125125
{
126126
let mut queue = self.send_queue.lock();
127127
self.reap_tx(&mut queue);
128-
let desc_id = queue.add_buffer(&[(buf.phys(), total_len, false)])?;
128+
let chain = queue.add_buffer(&[(buf.phys(), total_len, false)])?;
129129
self.tx_buffers.lock().push(TxBuffer {
130-
desc_id: desc_id as u32,
130+
chain,
131131
_buffer: buf,
132132
});
133-
self.virtio.lock().notify_queue(&queue);
133+
self.virtio.lock().notify_queue(&queue)?;
134134
}
135135

136136
Ok(())
@@ -168,8 +168,8 @@ fn probe(_variant: &PciVariant, mut access: DeviceView<'static>) -> EResult<()>
168168

169169
let mut dev = VirtioDevice::new_pci(access)?;
170170

171-
let dev_features_lo = dev.get_device_features(0);
172-
let dev_features_hi = dev.get_device_features(1);
171+
let dev_features_lo = dev.get_device_features(0)?;
172+
let dev_features_hi = dev.get_device_features(1)?;
173173

174174
let supported_lo = (spec::FeatureFlags::Mac
175175
| spec::FeatureFlags::MrgRxbuf
@@ -178,8 +178,8 @@ fn probe(_variant: &PciVariant, mut access: DeviceView<'static>) -> EResult<()>
178178
let driver_lo = dev_features_lo & supported_lo;
179179
let driver_hi = dev_features_hi & VIRTIO_F_VERSION_1_LO;
180180

181-
dev.set_driver_features(0, driver_lo);
182-
dev.set_driver_features(1, driver_hi);
181+
dev.set_driver_features(0, driver_lo)?;
182+
dev.set_driver_features(1, driver_hi)?;
183183

184184
log!(
185185
"Negotiated features lo=0x{:08x}, hi=0x{:08x}",
@@ -205,9 +205,9 @@ fn probe(_variant: &PciVariant, mut access: DeviceView<'static>) -> EResult<()>
205205

206206
// Wire both queues to MSI-X vector 0 (the one we configured above) and
207207
// disable config-change interrupts.
208-
let ack_rx = dev.set_queue_msix_vector(0, 0);
209-
let ack_tx = dev.set_queue_msix_vector(1, 0);
210-
let _ = dev.set_config_msix_vector(0xFFFF);
208+
let ack_rx = dev.set_queue_msix_vector(0, 0)?;
209+
let ack_tx = dev.set_queue_msix_vector(1, 0)?;
210+
let _ = dev.set_config_msix_vector(0xFFFF)?;
211211
if ack_rx != 0 || ack_tx != 0 {
212212
error!(
213213
"Device refused MSI-X vector assignment (rx={:#x}, tx={:#x})",
@@ -231,9 +231,9 @@ fn probe(_variant: &PciVariant, mut access: DeviceView<'static>) -> EResult<()>
231231
rx_buffers.push(buf);
232232
}
233233

234-
dev.set_driver_ok();
234+
dev.set_driver_ok()?;
235235

236-
dev.notify_queue(&recv_queue);
236+
dev.notify_queue(&recv_queue)?;
237237

238238
let controller = Arc::new(Controller {
239239
virtio: SpinMutex::new(dev),

0 commit comments

Comments
 (0)