@@ -216,12 +216,21 @@ impl<'a> Persist<'a> for MMIODeviceManager {
216
216
217
217
restore_helper (
218
218
device. clone ( ) ,
219
- device,
219
+ device. clone ( ) ,
220
220
& block_state. device_id ,
221
221
& block_state. transport_state ,
222
222
& block_state. mmio_slot ,
223
223
constructor_args. event_manager ,
224
224
) ?;
225
+
226
+ // If device is activated, kick the block queue(s) to make up for any
227
+ // pending or in-flight epoll events we may have not captured in snapshot.
228
+ // No need to kick Ratelimiters because they are restored 'unblocked' so
229
+ // any inflight `timer_fd` events can be safely discarded.
230
+ let mut dev = device. lock ( ) . expect ( "Poisoned lock" ) ;
231
+ if dev. is_activated ( ) {
232
+ dev. process_virtio_queues ( ) ;
233
+ }
225
234
}
226
235
for net_state in & state. net_devices {
227
236
let device = Arc :: new ( Mutex :: new (
@@ -234,12 +243,21 @@ impl<'a> Persist<'a> for MMIODeviceManager {
234
243
235
244
restore_helper (
236
245
device. clone ( ) ,
237
- device,
246
+ device. clone ( ) ,
238
247
& net_state. device_id ,
239
248
& net_state. transport_state ,
240
249
& net_state. mmio_slot ,
241
250
constructor_args. event_manager ,
242
251
) ?;
252
+
253
+ // If device is activated, kick the net queue(s) to make up for any
254
+ // pending or in-flight epoll events we may have not captured in snapshot.
255
+ // No need to kick Ratelimiters because they are restored 'unblocked' so
256
+ // any inflight `timer_fd` events can be safely discarded.
257
+ let mut dev = device. lock ( ) . expect ( "Poisoned lock" ) ;
258
+ if dev. is_activated ( ) {
259
+ dev. process_virtio_queues ( ) ;
260
+ }
243
261
}
244
262
if let Some ( vsock_state) = & state. vsock_device {
245
263
let ctor_args = VsockUdsConstructorArgs {
@@ -266,6 +284,10 @@ impl<'a> Persist<'a> for MMIODeviceManager {
266
284
& vsock_state. mmio_slot ,
267
285
constructor_args. event_manager ,
268
286
) ?;
287
+
288
+ // Vsock has complicated protocol that isn't resilient to any packet loss,
289
+ // so for Vsock we don't support connection persistence through snapshot.
290
+ // Any in-flight packets or events are simply lost. Vsock is restored 'empty'.
269
291
}
270
292
271
293
Ok ( dev_manager)
0 commit comments