@@ -19,9 +19,9 @@ use devices::virtio::net::Net;
19
19
use devices:: virtio:: persist:: { MmioTransportConstructorArgs , MmioTransportState } ;
20
20
use devices:: virtio:: vsock:: persist:: { VsockConstructorArgs , VsockState , VsockUdsConstructorArgs } ;
21
21
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 } ;
23
23
use kvm_ioctls:: VmFd ;
24
- use polly:: event_manager:: { Error as EventMgrError , EventManager } ;
24
+ use polly:: event_manager:: { Error as EventMgrError , EventManager , Subscriber } ;
25
25
use snapshot:: Persist ;
26
26
use versionize:: { VersionMap , Versionize , VersionizeResult } ;
27
27
use versionize_derive:: Versionize ;
@@ -178,37 +178,50 @@ impl<'a> Persist<'a> for MMIODeviceManager {
178
178
MMIODeviceManager :: new ( arch:: MMIO_MEM_START , ( arch:: IRQ_BASE , arch:: IRQ_MAX ) ) ;
179
179
let mem = & constructor_args. mem ;
180
180
let vm = constructor_args. vm ;
181
- let event_manager = constructor_args. event_manager ;
182
181
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 > {
195
189
dev_manager
196
- . slot_sanity_check ( mmio_slot )
190
+ . slot_sanity_check ( slot )
197
191
. map_err ( Error :: DeviceManager ) ?;
198
192
199
193
let restore_args = MmioTransportConstructorArgs {
200
194
mem : mem. clone ( ) ,
201
- device : device . clone ( ) ,
195
+ device,
202
196
} ;
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 ) ?;
205
199
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 )
207
201
. map_err ( Error :: DeviceManager ) ?;
208
202
209
203
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
+ ) ?;
212
225
}
213
226
for net_state in & state. net_devices {
214
227
let device = Arc :: new ( Mutex :: new (
@@ -219,26 +232,14 @@ impl<'a> Persist<'a> for MMIODeviceManager {
219
232
. map_err ( Error :: Net ) ?,
220
233
) ) ;
221
234
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
+ ) ?;
242
243
}
243
244
if let Some ( vsock_state) = & state. vsock_device {
244
245
let ctor_args = VsockUdsConstructorArgs {
@@ -257,25 +258,14 @@ impl<'a> Persist<'a> for MMIODeviceManager {
257
258
. map_err ( Error :: Vsock ) ?,
258
259
) ) ;
259
260
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
+ ) ?;
279
269
}
280
270
281
271
Ok ( dev_manager)
0 commit comments