Skip to content

Commit 5eaab90

Browse files
acatangiusandreim
authored andcommitted
device-manager: dedup Persist::restore() code
Signed-off-by: Adrian Catangiu <[email protected]>
1 parent bc22b43 commit 5eaab90

File tree

1 file changed

+51
-61
lines changed

1 file changed

+51
-61
lines changed

src/vmm/src/device_manager/persist.rs

Lines changed: 51 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ use devices::virtio::net::Net;
1919
use devices::virtio::persist::{MmioTransportConstructorArgs, MmioTransportState};
2020
use devices::virtio::vsock::persist::{VsockConstructorArgs, VsockState, VsockUdsConstructorArgs};
2121
use devices::virtio::vsock::{Vsock, VsockError, VsockUnixBackend, VsockUnixBackendError};
22-
use devices::virtio::{MmioTransport, TYPE_BLOCK, TYPE_NET, TYPE_VSOCK};
22+
use devices::virtio::{MmioTransport, VirtioDevice, TYPE_BLOCK, TYPE_NET, TYPE_VSOCK};
2323
use kvm_ioctls::VmFd;
24-
use polly::event_manager::{Error as EventMgrError, EventManager};
24+
use polly::event_manager::{Error as EventMgrError, EventManager, Subscriber};
2525
use snapshot::Persist;
2626
use versionize::{VersionMap, Versionize, VersionizeResult};
2727
use versionize_derive::Versionize;
@@ -178,37 +178,50 @@ impl<'a> Persist<'a> for MMIODeviceManager {
178178
MMIODeviceManager::new(arch::MMIO_MEM_START, (arch::IRQ_BASE, arch::IRQ_MAX));
179179
let mem = &constructor_args.mem;
180180
let vm = constructor_args.vm;
181-
let event_manager = constructor_args.event_manager;
182181

183-
for block_state in &state.block_devices {
184-
let device = Arc::new(Mutex::new(
185-
Block::restore(
186-
BlockConstructorArgs { mem: mem.clone() },
187-
&block_state.device_state,
188-
)
189-
.map_err(Error::Block)?,
190-
));
191-
192-
let device_id = block_state.device_id.clone();
193-
let transport_state = &block_state.transport_state;
194-
let mmio_slot = &block_state.mmio_slot;
182+
let mut restore_helper = |device: Arc<Mutex<dyn VirtioDevice>>,
183+
as_subscriber: Arc<Mutex<dyn Subscriber>>,
184+
id: &String,
185+
state: &MmioTransportState,
186+
slot: &MMIODeviceInfo,
187+
event_manager: &mut EventManager|
188+
-> Result<(), Self::Error> {
195189
dev_manager
196-
.slot_sanity_check(mmio_slot)
190+
.slot_sanity_check(slot)
197191
.map_err(Error::DeviceManager)?;
198192

199193
let restore_args = MmioTransportConstructorArgs {
200194
mem: mem.clone(),
201-
device: device.clone(),
195+
device,
202196
};
203-
let mmio_transport = MmioTransport::restore(restore_args, transport_state)
204-
.map_err(|()| Error::MmioTransport)?;
197+
let mmio_transport =
198+
MmioTransport::restore(restore_args, state).map_err(|()| Error::MmioTransport)?;
205199
dev_manager
206-
.register_virtio_mmio_device(vm, device_id, mmio_transport, &mmio_slot)
200+
.register_virtio_mmio_device(vm, id.clone(), mmio_transport, slot)
207201
.map_err(Error::DeviceManager)?;
208202

209203
event_manager
210-
.add_subscriber(device)
211-
.map_err(Error::EventManager)?;
204+
.add_subscriber(as_subscriber)
205+
.map_err(Error::EventManager)
206+
};
207+
208+
for block_state in &state.block_devices {
209+
let device = Arc::new(Mutex::new(
210+
Block::restore(
211+
BlockConstructorArgs { mem: mem.clone() },
212+
&block_state.device_state,
213+
)
214+
.map_err(Error::Block)?,
215+
));
216+
217+
restore_helper(
218+
device.clone(),
219+
device,
220+
&block_state.device_id,
221+
&block_state.transport_state,
222+
&block_state.mmio_slot,
223+
constructor_args.event_manager,
224+
)?;
212225
}
213226
for net_state in &state.net_devices {
214227
let device = Arc::new(Mutex::new(
@@ -219,26 +232,14 @@ impl<'a> Persist<'a> for MMIODeviceManager {
219232
.map_err(Error::Net)?,
220233
));
221234

222-
let device_id = net_state.device_id.clone();
223-
let transport_state = &net_state.transport_state;
224-
let mmio_slot = &net_state.mmio_slot;
225-
dev_manager
226-
.slot_sanity_check(mmio_slot)
227-
.map_err(Error::DeviceManager)?;
228-
229-
let restore_args = MmioTransportConstructorArgs {
230-
mem: mem.clone(),
231-
device: device.clone(),
232-
};
233-
let mmio_transport = MmioTransport::restore(restore_args, transport_state)
234-
.map_err(|()| Error::MmioTransport)?;
235-
dev_manager
236-
.register_virtio_mmio_device(vm, device_id, mmio_transport, &mmio_slot)
237-
.map_err(Error::DeviceManager)?;
238-
239-
event_manager
240-
.add_subscriber(device)
241-
.map_err(Error::EventManager)?;
235+
restore_helper(
236+
device.clone(),
237+
device,
238+
&net_state.device_id,
239+
&net_state.transport_state,
240+
&net_state.mmio_slot,
241+
constructor_args.event_manager,
242+
)?;
242243
}
243244
if let Some(vsock_state) = &state.vsock_device {
244245
let ctor_args = VsockUdsConstructorArgs {
@@ -257,25 +258,14 @@ impl<'a> Persist<'a> for MMIODeviceManager {
257258
.map_err(Error::Vsock)?,
258259
));
259260

260-
let device_id = vsock_state.device_id.clone();
261-
let transport_state = &vsock_state.transport_state;
262-
let mmio_slot = &vsock_state.mmio_slot;
263-
dev_manager
264-
.slot_sanity_check(mmio_slot)
265-
.map_err(Error::DeviceManager)?;
266-
267-
let restore_args = MmioTransportConstructorArgs {
268-
mem: mem.clone(),
269-
device: device.clone(),
270-
};
271-
let mmio_transport = MmioTransport::restore(restore_args, transport_state)
272-
.map_err(|()| Error::MmioTransport)?;
273-
dev_manager
274-
.register_virtio_mmio_device(vm, device_id, mmio_transport, &mmio_slot)
275-
.map_err(Error::DeviceManager)?;
276-
event_manager
277-
.add_subscriber(device)
278-
.map_err(Error::EventManager)?;
261+
restore_helper(
262+
device.clone(),
263+
device,
264+
&vsock_state.device_id,
265+
&vsock_state.transport_state,
266+
&vsock_state.mmio_slot,
267+
constructor_args.event_manager,
268+
)?;
279269
}
280270

281271
Ok(dev_manager)

0 commit comments

Comments
 (0)