@@ -19,9 +19,9 @@ use devices::virtio::net::Net;
1919use devices:: virtio:: persist:: { MmioTransportConstructorArgs , MmioTransportState } ;
2020use devices:: virtio:: vsock:: persist:: { VsockConstructorArgs , VsockState , VsockUdsConstructorArgs } ;
2121use 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 } ;
2323use kvm_ioctls:: VmFd ;
24- use polly:: event_manager:: { Error as EventMgrError , EventManager } ;
24+ use polly:: event_manager:: { Error as EventMgrError , EventManager , Subscriber } ;
2525use snapshot:: Persist ;
2626use versionize:: { VersionMap , Versionize , VersionizeResult } ;
2727use 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