77#![ cfg( target_arch = "x86_64" ) ]
88
99use std:: io;
10+ use std:: result:: Result ;
1011use std:: sync:: { Arc , Mutex } ;
1112
1213use super :: mmio:: * ;
1314
14- use devices:: pseudo:: BootTimer ;
1515use devices:: virtio:: block:: persist:: { BlockConstructorArgs , BlockState } ;
1616use devices:: virtio:: block:: Block ;
1717use devices:: virtio:: net:: persist:: { Error as NetError , NetConstructorArgs , NetState } ;
@@ -106,20 +106,14 @@ impl<'a> Persist<'a> for MMIODeviceManager {
106106 net_devices : Vec :: new ( ) ,
107107 vsock_device : None ,
108108 } ;
109- for ( ( device_type, device_id) , device_info) in self . get_device_info ( ) . iter ( ) {
110- let bus_device = self
111- . get_device ( * device_type, device_id)
112- // Safe to unwrap() because we know the device exists.
113- . unwrap ( )
114- . lock ( )
115- . expect ( "Poisoned lock" ) ;
116-
117- if bus_device. as_any ( ) . downcast_ref :: < BootTimer > ( ) . is_some ( ) {
109+ let _: Result < ( ) , ( ) > = self . for_each_device ( |devtype, devid, devinfo, bus_dev| {
110+ if * devtype == arch:: DeviceType :: BootTimer {
118111 // No need to save BootTimer state.
119- continue ;
112+ return Ok ( ( ) ) ;
120113 }
121114
122- let mmio_transport = bus_device
115+ let locked_bus_dev = bus_dev. lock ( ) . expect ( "Poisoned lock" ) ;
116+ let mmio_transport = locked_bus_dev
123117 . as_any ( )
124118 // Only MmioTransport implements BusDevice on x86_64 at this point.
125119 . downcast_ref :: < MmioTransport > ( )
@@ -136,19 +130,19 @@ impl<'a> Persist<'a> for MMIODeviceManager {
136130 . unwrap ( )
137131 . save ( ) ;
138132 states. block_devices . push ( ConnectedBlockState {
139- device_id : device_id . clone ( ) ,
133+ device_id : devid . clone ( ) ,
140134 device_state : block_state,
141135 transport_state,
142- mmio_slot : device_info . clone ( ) ,
136+ mmio_slot : devinfo . clone ( ) ,
143137 } ) ;
144138 }
145139 TYPE_NET => {
146140 let net_state = locked_device. as_any ( ) . downcast_ref :: < Net > ( ) . unwrap ( ) . save ( ) ;
147141 states. net_devices . push ( ConnectedNetState {
148- device_id : device_id . clone ( ) ,
142+ device_id : devid . clone ( ) ,
149143 device_state : net_state,
150144 transport_state,
151- mmio_slot : device_info . clone ( ) ,
145+ mmio_slot : devinfo . clone ( ) ,
152146 } ) ;
153147 }
154148 TYPE_VSOCK => {
@@ -162,22 +156,24 @@ impl<'a> Persist<'a> for MMIODeviceManager {
162156 frontend : vsock. save ( ) ,
163157 } ;
164158 states. vsock_device = Some ( ConnectedVsockState {
165- device_id : device_id . clone ( ) ,
159+ device_id : devid . clone ( ) ,
166160 device_state : vsock_state,
167161 transport_state,
168- mmio_slot : device_info . clone ( ) ,
162+ mmio_slot : devinfo . clone ( ) ,
169163 } ) ;
170164 }
171165 _ => unreachable ! ( ) ,
172166 } ;
173- }
167+
168+ Ok ( ( ) )
169+ } ) ;
174170 states
175171 }
176172
177173 fn restore (
178174 constructor_args : Self :: ConstructorArgs ,
179175 state : & Self :: State ,
180- ) -> std :: result :: Result < Self , Self :: Error > {
176+ ) -> Result < Self , Self :: Error > {
181177 let mut dev_manager =
182178 MMIODeviceManager :: new ( arch:: MMIO_MEM_START , ( arch:: IRQ_BASE , arch:: IRQ_MAX ) ) ;
183179 let mem = & constructor_args. mem ;
0 commit comments