Skip to content

Commit 8c95f5e

Browse files
authored
Merge branch 'feature/pcie' into more-debug
2 parents c91280a + 2e0459c commit 8c95f5e

File tree

2 files changed

+30
-23
lines changed

2 files changed

+30
-23
lines changed

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

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -179,21 +179,18 @@ impl MmioTransport {
179179
}
180180
DRIVER_OK if self.device_status == (ACKNOWLEDGE | DRIVER | FEATURES_OK) => {
181181
self.device_status = status;
182-
let device_activated = self.locked_device().is_activated();
182+
let mut locked_device = self.device.lock().expect("Poisoned lock");
183+
let device_activated = locked_device.is_activated();
183184
if !device_activated {
184185
// temporary variable needed for borrow checker
185-
let activate_result = self
186-
.locked_device()
187-
.activate(self.mem.clone(), self.interrupt.clone());
186+
let activate_result =
187+
locked_device.activate(self.mem.clone(), self.interrupt.clone());
188188
if let Err(err) = activate_result {
189189
self.device_status |= DEVICE_NEEDS_RESET;
190190

191191
// Section 2.1.2 of the specification states that we need to send a device
192192
// configuration change interrupt
193-
let _ = self
194-
.locked_device()
195-
.interrupt_trigger()
196-
.trigger(VirtioInterruptType::Config);
193+
let _ = self.interrupt.trigger(VirtioInterruptType::Config);
197194

198195
error!("Failed to activate virtio device: {}", err)
199196
}
@@ -204,16 +201,19 @@ impl MmioTransport {
204201
self.device_status |= FAILED;
205202
}
206203
_ if status == 0 => {
207-
if self.locked_device().is_activated() {
208-
let mut device_status = self.device_status;
209-
let reset_result = self.locked_device().reset();
210-
match reset_result {
211-
Some((_interrupt_evt, mut _queue_evts)) => {}
212-
None => {
213-
device_status |= FAILED;
204+
{
205+
let mut locked_device = self.device.lock().expect("Poisoned lock");
206+
if locked_device.is_activated() {
207+
let mut device_status = self.device_status;
208+
let reset_result = locked_device.reset();
209+
match reset_result {
210+
Some((_interrupt_evt, mut _queue_evts)) => {}
211+
None => {
212+
device_status |= FAILED;
213+
}
214214
}
215+
self.device_status = device_status;
215216
}
216-
self.device_status = device_status;
217217
}
218218

219219
// If the backend device driver doesn't support reset,

src/vmm/src/devices/virtio/transport/pci/device.rs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1029,15 +1029,22 @@ impl PciDevice for VirtioPciDevice {
10291029
// Try and activate the device if the driver status has changed
10301030
if self.needs_activation() {
10311031
debug!("Activating device");
1032-
self.virtio_device()
1032+
let interrupt = Arc::clone(self.virtio_interrupt.as_ref().unwrap());
1033+
match self
1034+
.virtio_device()
10331035
.lock()
10341036
.unwrap()
1035-
.activate(
1036-
self.memory.clone(),
1037-
Arc::clone(self.virtio_interrupt.as_ref().unwrap()),
1038-
)
1039-
.unwrap_or_else(|err| error!("Error activating device: {err:?}"));
1040-
self.device_activated.store(true, Ordering::SeqCst);
1037+
.activate(self.memory.clone(), interrupt.clone())
1038+
{
1039+
Ok(()) => self.device_activated.store(true, Ordering::SeqCst),
1040+
Err(err) => {
1041+
error!("Error activating device: {err:?}");
1042+
1043+
// Section 2.1.2 of the specification states that we need to send a device
1044+
// configuration change interrupt
1045+
let _ = interrupt.trigger(VirtioInterruptType::Config);
1046+
}
1047+
}
10411048
} else {
10421049
debug!("Device doesn't need activation");
10431050
}

0 commit comments

Comments
 (0)