7
7
#![ cfg( target_arch = "x86_64" ) ]
8
8
9
9
use std:: io;
10
+ use std:: result:: Result ;
10
11
use std:: sync:: { Arc , Mutex } ;
11
12
12
13
use super :: mmio:: * ;
13
14
14
- use devices:: pseudo:: BootTimer ;
15
15
use devices:: virtio:: block:: persist:: { BlockConstructorArgs , BlockState } ;
16
16
use devices:: virtio:: block:: Block ;
17
17
use devices:: virtio:: net:: persist:: { Error as NetError , NetConstructorArgs , NetState } ;
@@ -106,20 +106,14 @@ impl<'a> Persist<'a> for MMIODeviceManager {
106
106
net_devices : Vec :: new ( ) ,
107
107
vsock_device : None ,
108
108
} ;
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 {
118
111
// No need to save BootTimer state.
119
- continue ;
112
+ return Ok ( ( ) ) ;
120
113
}
121
114
122
- let mmio_transport = bus_device
115
+ let locked_bus_dev = bus_dev. lock ( ) . expect ( "Poisoned lock" ) ;
116
+ let mmio_transport = locked_bus_dev
123
117
. as_any ( )
124
118
// Only MmioTransport implements BusDevice on x86_64 at this point.
125
119
. downcast_ref :: < MmioTransport > ( )
@@ -136,19 +130,19 @@ impl<'a> Persist<'a> for MMIODeviceManager {
136
130
. unwrap ( )
137
131
. save ( ) ;
138
132
states. block_devices . push ( ConnectedBlockState {
139
- device_id : device_id . clone ( ) ,
133
+ device_id : devid . clone ( ) ,
140
134
device_state : block_state,
141
135
transport_state,
142
- mmio_slot : device_info . clone ( ) ,
136
+ mmio_slot : devinfo . clone ( ) ,
143
137
} ) ;
144
138
}
145
139
TYPE_NET => {
146
140
let net_state = locked_device. as_any ( ) . downcast_ref :: < Net > ( ) . unwrap ( ) . save ( ) ;
147
141
states. net_devices . push ( ConnectedNetState {
148
- device_id : device_id . clone ( ) ,
142
+ device_id : devid . clone ( ) ,
149
143
device_state : net_state,
150
144
transport_state,
151
- mmio_slot : device_info . clone ( ) ,
145
+ mmio_slot : devinfo . clone ( ) ,
152
146
} ) ;
153
147
}
154
148
TYPE_VSOCK => {
@@ -162,22 +156,24 @@ impl<'a> Persist<'a> for MMIODeviceManager {
162
156
frontend : vsock. save ( ) ,
163
157
} ;
164
158
states. vsock_device = Some ( ConnectedVsockState {
165
- device_id : device_id . clone ( ) ,
159
+ device_id : devid . clone ( ) ,
166
160
device_state : vsock_state,
167
161
transport_state,
168
- mmio_slot : device_info . clone ( ) ,
162
+ mmio_slot : devinfo . clone ( ) ,
169
163
} ) ;
170
164
}
171
165
_ => unreachable ! ( ) ,
172
166
} ;
173
- }
167
+
168
+ Ok ( ( ) )
169
+ } ) ;
174
170
states
175
171
}
176
172
177
173
fn restore (
178
174
constructor_args : Self :: ConstructorArgs ,
179
175
state : & Self :: State ,
180
- ) -> std :: result :: Result < Self , Self :: Error > {
176
+ ) -> Result < Self , Self :: Error > {
181
177
let mut dev_manager =
182
178
MMIODeviceManager :: new ( arch:: MMIO_MEM_START , ( arch:: IRQ_BASE , arch:: IRQ_MAX ) ) ;
183
179
let mem = & constructor_args. mem ;
0 commit comments