Skip to content

Commit 2ee9583

Browse files
committed
TBS
Signed-off-by: Babis Chalios <[email protected]>
1 parent 61bd851 commit 2ee9583

File tree

8 files changed

+66
-59
lines changed

8 files changed

+66
-59
lines changed

src/vmm/src/device_manager/persist.rs

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -473,22 +473,10 @@ impl<'a> Persist<'a> for MMIODeviceManager {
473473
as_subscriber: Arc<Mutex<dyn MutEventSubscriber>>,
474474
id: &String,
475475
state: &MmioTransportState,
476+
interrupt: Arc<IrqTrigger>,
476477
device_info: &MMIODeviceInfo,
477478
event_manager: &mut EventManager|
478479
-> Result<(), Self::Error> {
479-
// If the device was already activated, an interrupt was created and assigned to it. In
480-
// that case grab a reference to it and pass it to the transport state. Otherwise,
481-
// create a fresh one. Like this both the transport and the device will hold a
482-
// reference to the same interrupt object, at all times.
483-
let interrupt = {
484-
let locked_dev = device.lock().expect("Poisoned lock");
485-
if locked_dev.is_activated() {
486-
locked_dev.interrupt_trigger()
487-
} else {
488-
Arc::new(IrqTrigger::new().expect("Could not create IRQ for MMIO device"))
489-
}
490-
};
491-
492480
let restore_args = MmioTransportConstructorArgs {
493481
mem: mem.clone(),
494482
interrupt,
@@ -526,9 +514,12 @@ impl<'a> Persist<'a> for MMIODeviceManager {
526514
};
527515

528516
if let Some(balloon_state) = &state.balloon_device {
517+
let interrupt =
518+
Arc::new(IrqTrigger::new().expect("Could not create interrupt for MMIO device"));
529519
let device = Arc::new(Mutex::new(Balloon::restore(
530520
BalloonConstructorArgs {
531521
mem: mem.clone(),
522+
interrupt: interrupt.clone(),
532523
restored_from_file: constructor_args.restored_from_file,
533524
},
534525
&balloon_state.device_state,
@@ -544,14 +535,20 @@ impl<'a> Persist<'a> for MMIODeviceManager {
544535
device,
545536
&balloon_state.device_id,
546537
&balloon_state.transport_state,
538+
interrupt,
547539
&balloon_state.device_info,
548540
constructor_args.event_manager,
549541
)?;
550542
}
551543

552544
for block_state in &state.block_devices {
545+
let interrupt =
546+
Arc::new(IrqTrigger::new().expect("Could not create interrupt for MMIO device"));
553547
let device = Arc::new(Mutex::new(Block::restore(
554-
BlockConstructorArgs { mem: mem.clone() },
548+
BlockConstructorArgs {
549+
mem: mem.clone(),
550+
interrupt: interrupt.clone(),
551+
},
555552
&block_state.device_state,
556553
)?));
557554

@@ -565,6 +562,7 @@ impl<'a> Persist<'a> for MMIODeviceManager {
565562
device,
566563
&block_state.device_id,
567564
&block_state.transport_state,
565+
interrupt,
568566
&block_state.device_info,
569567
constructor_args.event_manager,
570568
)?;
@@ -587,9 +585,12 @@ impl<'a> Persist<'a> for MMIODeviceManager {
587585
}
588586

589587
for net_state in &state.net_devices {
588+
let interrupt =
589+
Arc::new(IrqTrigger::new().expect("Could not create interrupt for MMIO device"));
590590
let device = Arc::new(Mutex::new(Net::restore(
591591
NetConstructorArgs {
592592
mem: mem.clone(),
593+
interrupt: interrupt.clone(),
593594
mmds: constructor_args
594595
.vm_resources
595596
.mmds
@@ -610,6 +611,7 @@ impl<'a> Persist<'a> for MMIODeviceManager {
610611
device,
611612
&net_state.device_id,
612613
&net_state.transport_state,
614+
interrupt,
613615
&net_state.device_info,
614616
constructor_args.event_manager,
615617
)?;
@@ -620,9 +622,12 @@ impl<'a> Persist<'a> for MMIODeviceManager {
620622
cid: vsock_state.device_state.frontend.cid,
621623
};
622624
let backend = VsockUnixBackend::restore(ctor_args, &vsock_state.device_state.backend)?;
625+
let interrupt =
626+
Arc::new(IrqTrigger::new().expect("Could not create interrupt for MMIO device"));
623627
let device = Arc::new(Mutex::new(Vsock::restore(
624628
VsockConstructorArgs {
625629
mem: mem.clone(),
630+
interrupt: interrupt.clone(),
626631
backend,
627632
},
628633
&vsock_state.device_state.frontend,
@@ -638,13 +643,16 @@ impl<'a> Persist<'a> for MMIODeviceManager {
638643
device,
639644
&vsock_state.device_id,
640645
&vsock_state.transport_state,
646+
interrupt,
641647
&vsock_state.device_info,
642648
constructor_args.event_manager,
643649
)?;
644650
}
645651

646652
if let Some(entropy_state) = &state.entropy_device {
647-
let ctor_args = EntropyConstructorArgs::new(mem.clone());
653+
let interrupt =
654+
Arc::new(IrqTrigger::new().expect("Could not create interrupt for MMIO device"));
655+
let ctor_args = EntropyConstructorArgs::new(mem.clone(), interrupt.clone());
648656

649657
let device = Arc::new(Mutex::new(Entropy::restore(
650658
ctor_args,
@@ -661,6 +669,7 @@ impl<'a> Persist<'a> for MMIODeviceManager {
661669
device,
662670
&entropy_state.device_id,
663671
&entropy_state.transport_state,
672+
interrupt,
664673
&entropy_state.device_info,
665674
constructor_args.event_manager,
666675
)?;

src/vmm/src/devices/virtio/balloon/persist.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
//! Defines the structures needed for saving/restoring balloon devices.
55
66
use std::sync::Arc;
7-
use std::sync::atomic::AtomicU32;
87
use std::time::Duration;
98

109
use serde::{Deserialize, Serialize};
@@ -96,6 +95,8 @@ pub struct BalloonState {
9695
pub struct BalloonConstructorArgs {
9796
/// Pointer to guest memory.
9897
pub mem: GuestMemoryMmap,
98+
/// Interrupt used from the device.
99+
pub interrupt: Arc<IrqTrigger>,
99100
pub restored_from_file: bool,
100101
}
101102

@@ -154,10 +155,8 @@ impl Persist<'_> for Balloon {
154155
};
155156

156157
if state.virtio_state.activated {
157-
let mut interrupt = IrqTrigger::new().expect("Could not create IRQ for VirtIO device");
158-
interrupt.irq_status = Arc::new(AtomicU32::new(state.virtio_state.interrupt_status));
159158
balloon.device_state =
160-
DeviceState::Activated((constructor_args.mem, Arc::new(interrupt)));
159+
DeviceState::Activated((constructor_args.mem, constructor_args.interrupt));
161160

162161
if balloon.stats_enabled() {
163162
// Restore the stats descriptor.
@@ -184,7 +183,7 @@ mod tests {
184183
use super::*;
185184
use crate::devices::virtio::TYPE_BALLOON;
186185
use crate::devices::virtio::device::VirtioDevice;
187-
use crate::devices::virtio::test_utils::default_mem;
186+
use crate::devices::virtio::test_utils::{default_interrupt, default_mem};
188187
use crate::snapshot::Snapshot;
189188

190189
#[test]
@@ -201,6 +200,7 @@ mod tests {
201200
let restored_balloon = Balloon::restore(
202201
BalloonConstructorArgs {
203202
mem: guest_mem,
203+
interrupt: default_interrupt(),
204204
restored_from_file: true,
205205
},
206206
&Snapshot::deserialize(&mut mem.as_slice()).unwrap(),

src/vmm/src/devices/virtio/block/persist.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
// Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
// SPDX-License-Identifier: Apache-2.0
33

4+
use std::sync::Arc;
5+
46
use serde::{Deserialize, Serialize};
57

68
use super::vhost_user::persist::VhostUserBlockState;
79
use super::virtio::persist::VirtioBlockState;
10+
use crate::devices::virtio::transport::mmio::IrqTrigger;
811
use crate::vstate::memory::GuestMemoryMmap;
912

1013
/// Block device state.
@@ -18,4 +21,5 @@ pub enum BlockState {
1821
#[derive(Debug)]
1922
pub struct BlockConstructorArgs {
2023
pub mem: GuestMemoryMmap,
24+
pub interrupt: Arc<IrqTrigger>,
2125
}

src/vmm/src/devices/virtio/block/virtio/persist.rs

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@
33

44
//! Defines the structures needed for saving/restoring block devices.
55
6-
use std::sync::Arc;
7-
use std::sync::atomic::AtomicU32;
8-
96
use device::ConfigSpace;
107
use serde::{Deserialize, Serialize};
118
use vmm_sys_util::eventfd::EventFd;
@@ -19,7 +16,6 @@ use crate::devices::virtio::block::virtio::metrics::BlockMetricsPerDevice;
1916
use crate::devices::virtio::device::DeviceState;
2017
use crate::devices::virtio::generated::virtio_blk::VIRTIO_BLK_F_RO;
2118
use crate::devices::virtio::persist::VirtioDeviceState;
22-
use crate::devices::virtio::transport::mmio::IrqTrigger;
2319
use crate::rate_limiter::RateLimiter;
2420
use crate::rate_limiter::persist::RateLimiterState;
2521
use crate::snapshot::Persist;
@@ -112,16 +108,11 @@ impl Persist<'_> for VirtioBlock {
112108
)
113109
.map_err(VirtioBlockError::Persist)?;
114110

115-
let mut irq_trigger = IrqTrigger::new().map_err(VirtioBlockError::IrqTrigger)?;
116-
irq_trigger.irq_status = Arc::new(AtomicU32::new(state.virtio_state.interrupt_status));
117-
118111
let avail_features = state.virtio_state.avail_features;
119112
let acked_features = state.virtio_state.acked_features;
120113

121114
let device_state = if state.virtio_state.activated {
122-
let mut interrupt = IrqTrigger::new().expect("Could not create IRQ for VirtIO device");
123-
interrupt.irq_status = Arc::new(AtomicU32::new(state.virtio_state.interrupt_status));
124-
DeviceState::Activated((constructor_args.mem, Arc::new(interrupt)))
115+
DeviceState::Activated((constructor_args.mem, constructor_args.interrupt))
125116
} else {
126117
DeviceState::Inactive
127118
};
@@ -161,7 +152,7 @@ mod tests {
161152
use super::*;
162153
use crate::devices::virtio::block::virtio::device::VirtioBlockConfig;
163154
use crate::devices::virtio::device::VirtioDevice;
164-
use crate::devices::virtio::test_utils::default_mem;
155+
use crate::devices::virtio::test_utils::{default_interrupt, default_mem};
165156
use crate::snapshot::Snapshot;
166157

167158
#[test]
@@ -233,7 +224,10 @@ mod tests {
233224

234225
// Restore the block device.
235226
let restored_block = VirtioBlock::restore(
236-
BlockConstructorArgs { mem: guest_mem },
227+
BlockConstructorArgs {
228+
mem: guest_mem,
229+
interrupt: default_interrupt(),
230+
},
237231
&Snapshot::deserialize(&mut mem.as_slice()).unwrap(),
238232
)
239233
.unwrap();

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
//! Defines the structures needed for saving/restoring net devices.
55
66
use std::io;
7-
use std::sync::atomic::AtomicU32;
87
use std::sync::{Arc, Mutex};
98

109
use serde::{Deserialize, Serialize};
@@ -72,6 +71,8 @@ pub struct NetState {
7271
pub struct NetConstructorArgs {
7372
/// Pointer to guest memory.
7473
pub mem: GuestMemoryMmap,
74+
/// Interrupt for the device.
75+
pub interrupt: Arc<IrqTrigger>,
7576
/// Pointer to the MMDS data store.
7677
pub mmds: Option<Arc<Mutex<Mmds>>>,
7778
}
@@ -158,9 +159,8 @@ impl Persist<'_> for Net {
158159
.set_offload(supported_flags)
159160
.map_err(NetPersistError::TapSetOffload)?;
160161

161-
let mut interrupt = IrqTrigger::new().expect("Could not create IRQ for VirtIO device");
162-
interrupt.irq_status = Arc::new(AtomicU32::new(state.virtio_state.interrupt_status));
163-
net.device_state = DeviceState::Activated((constructor_args.mem, Arc::new(interrupt)));
162+
net.device_state =
163+
DeviceState::Activated((constructor_args.mem, constructor_args.interrupt));
164164

165165
// Recreate `Net::rx_buffer`. We do it by re-parsing the RX queue. We're temporarily
166166
// rolling back `next_avail` in the RX queue and call `parse_rx_descriptors`.
@@ -180,7 +180,7 @@ mod tests {
180180
use super::*;
181181
use crate::devices::virtio::device::VirtioDevice;
182182
use crate::devices::virtio::net::test_utils::{default_net, default_net_no_mmds};
183-
use crate::devices::virtio::test_utils::default_mem;
183+
use crate::devices::virtio::test_utils::{default_interrupt, default_mem};
184184
use crate::snapshot::Snapshot;
185185

186186
fn validate_save_and_restore(net: Net, mmds_ds: Option<Arc<Mutex<Mmds>>>) {
@@ -213,6 +213,7 @@ mod tests {
213213
match Net::restore(
214214
NetConstructorArgs {
215215
mem: guest_mem,
216+
interrupt: default_interrupt(),
216217
mmds: mmds_ds,
217218
},
218219
&Snapshot::deserialize(&mut mem.as_slice()).unwrap(),

src/vmm/src/devices/virtio/persist.rs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -122,27 +122,18 @@ pub struct VirtioDeviceState {
122122
pub acked_features: u64,
123123
/// List of queues.
124124
pub queues: Vec<QueueState>,
125-
/// The MMIO interrupt status.
126-
pub interrupt_status: u32,
127125
/// Flag for activated status.
128126
pub activated: bool,
129127
}
130128

131129
impl VirtioDeviceState {
132130
/// Construct the virtio state of a device.
133131
pub fn from_device(device: &dyn VirtioDevice) -> Self {
134-
let interrupt_status = if device.is_activated() {
135-
device.interrupt_status().load(Ordering::Relaxed)
136-
} else {
137-
0
138-
};
139-
140132
VirtioDeviceState {
141133
device_type: device.device_type(),
142134
avail_features: device.avail_features(),
143135
acked_features: device.acked_features(),
144136
queues: device.queues().iter().map(Persist::save).collect(),
145-
interrupt_status,
146137
activated: device.is_activated(),
147138
}
148139
}
@@ -214,6 +205,7 @@ pub struct MmioTransportState {
214205
queue_select: u32,
215206
device_status: u32,
216207
config_generation: u32,
208+
interrupt_status: u32,
217209
}
218210

219211
/// Auxiliary structure for initializing the transport when resuming from a snapshot.
@@ -241,6 +233,7 @@ impl Persist<'_> for MmioTransport {
241233
queue_select: self.queue_select,
242234
device_status: self.device_status,
243235
config_generation: self.config_generation,
236+
interrupt_status: self.interrupt.irq_status.load(Ordering::SeqCst),
244237
}
245238
}
246239

@@ -259,6 +252,10 @@ impl Persist<'_> for MmioTransport {
259252
transport.queue_select = state.queue_select;
260253
transport.device_status = state.device_status;
261254
transport.config_generation = state.config_generation;
255+
transport
256+
.interrupt
257+
.irq_status
258+
.store(state.interrupt_status, Ordering::SeqCst);
262259
Ok(transport)
263260
}
264261
}

0 commit comments

Comments
 (0)