Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 79c5342

Browse files
committed
vmm: Implement basic reset capability for net device
Signed-off-by: Adam Jensen <adam@acj.sh>
1 parent 08385e0 commit 79c5342

File tree

2 files changed

+45
-10
lines changed

2 files changed

+45
-10
lines changed

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

Lines changed: 4 additions & 1 deletion
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

Lines changed: 41 additions & 9 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /