@@ -216,12 +216,21 @@ impl<'a> Persist<'a> for MMIODeviceManager {
216216
217217 restore_helper (
218218 device. clone ( ) ,
219- device,
219+ device. clone ( ) ,
220220 & block_state. device_id ,
221221 & block_state. transport_state ,
222222 & block_state. mmio_slot ,
223223 constructor_args. event_manager ,
224224 ) ?;
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+ }
225234 }
226235 for net_state in & state. net_devices {
227236 let device = Arc :: new ( Mutex :: new (
@@ -234,12 +243,21 @@ impl<'a> Persist<'a> for MMIODeviceManager {
234243
235244 restore_helper (
236245 device. clone ( ) ,
237- device,
246+ device. clone ( ) ,
238247 & net_state. device_id ,
239248 & net_state. transport_state ,
240249 & net_state. mmio_slot ,
241250 constructor_args. event_manager ,
242251 ) ?;
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+ }
243261 }
244262 if let Some ( vsock_state) = & state. vsock_device {
245263 let ctor_args = VsockUdsConstructorArgs {
@@ -266,6 +284,10 @@ impl<'a> Persist<'a> for MMIODeviceManager {
266284 & vsock_state. mmio_slot ,
267285 constructor_args. event_manager ,
268286 ) ?;
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'.
269291 }
270292
271293 Ok ( dev_manager)
0 commit comments