Skip to content

Commit 1d1d916

Browse files
committed
vmm: Implement basic reset capability for net device
Signed-off-by: Adam Jensen <[email protected]>
1 parent 6791d55 commit 1d1d916

File tree

2 files changed

+45
-10
lines changed

2 files changed

+45
-10
lines changed

src/vmm/src/devices/virtio/mmio.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,10 @@ impl MmioTransport {
201201
let mut device_status = self.device_status;
202202
let reset_result = self.locked_device().reset();
203203
match reset_result {
204-
Some((_interrupt_evt, mut _queue_evts)) => {}
204+
Some((_interrupt_evt, mut _queue_evts)) => {
205+
// The device MUST initialize device status to 0 upon reset.
206+
device_status = INIT;
207+
}
205208
None => {
206209
device_status |= FAILED;
207210
}

src/vmm/src/devices/virtio/net/device.rs

+41-9
Original file line numberDiff line numberDiff line change
@@ -870,6 +870,26 @@ impl VirtioDevice for Net {
870870
fn is_activated(&self) -> bool {
871871
self.device_state.is_activated()
872872
}
873+
874+
fn reset(&mut self) -> Option<(EventFd, Vec<EventFd>)> {
875+
self.device_state = DeviceState::Inactive;
876+
self.rx_bytes_read = 0;
877+
self.rx_deferred_frame = false;
878+
self.rx_frame_buf = [0u8; MAX_BUFFER_SIZE];
879+
self.metrics = NetMetricsPerDevice::alloc(self.id.clone());
880+
881+
let queue_evts: Vec<_> = self
882+
.queue_evts
883+
.iter()
884+
.filter_map(|q| q.try_clone().ok())
885+
.collect();
886+
887+
if let Ok(irq_evt) = self.irq_trigger.irq_evt.try_clone() {
888+
Some((irq_evt, queue_evts))
889+
} else {
890+
None
891+
}
892+
}
873893
}
874894

875895
#[cfg(test)]
@@ -2015,17 +2035,29 @@ pub mod tests {
20152035
th.activate_net();
20162036
let net = th.net.lock().unwrap();
20172037

2018-
// Test queues count (TX and RX).
2019-
let queues = net.queues();
2020-
assert_eq!(queues.len(), NET_QUEUE_SIZES.len());
2021-
assert_eq!(queues[RX_INDEX].size, th.rxq.size());
2022-
assert_eq!(queues[TX_INDEX].size, th.txq.size());
2038+
let validate = |net: &Net| {
2039+
// Test queues count (TX and RX).
2040+
let queues = net.queues();
2041+
assert_eq!(queues.len(), NET_QUEUE_SIZES.len());
2042+
assert_eq!(queues[RX_INDEX].size, th.rxq.size());
2043+
assert_eq!(queues[TX_INDEX].size, th.txq.size());
2044+
2045+
// Test corresponding queues events.
2046+
assert_eq!(net.queue_events().len(), NET_QUEUE_SIZES.len());
2047+
2048+
// Test interrupts.
2049+
assert!(!&net.irq_trigger.has_pending_irq(IrqType::Vring));
2050+
};
2051+
2052+
validate(&net);
20232053

2024-
// Test corresponding queues events.
2025-
assert_eq!(net.queue_events().len(), NET_QUEUE_SIZES.len());
2054+
// Test reset.
2055+
let mut net = net;
2056+
assert!(net.device_state.is_activated());
2057+
let (_interrupt_evt, _queue_evts) = net.reset().unwrap();
2058+
assert!(!net.device_state.is_activated());
20262059

2027-
// Test interrupts.
2028-
assert!(!&net.irq_trigger.has_pending_irq(IrqType::Vring));
2060+
validate(&net);
20292061
}
20302062

20312063
#[test]

0 commit comments

Comments
 (0)