@@ -30,14 +30,8 @@ use crate::devices::legacy::RTCDevice;
3030use  crate :: devices:: legacy:: serial:: SerialOut ; 
3131use  crate :: devices:: legacy:: { IER_RDA_BIT ,  IER_RDA_OFFSET ,  SerialDevice } ; 
3232use  crate :: devices:: pseudo:: BootTimer ; 
33- use  crate :: devices:: virtio:: balloon:: Balloon ; 
34- use  crate :: devices:: virtio:: block:: device:: Block ; 
3533use  crate :: devices:: virtio:: device:: VirtioDevice ; 
36- use  crate :: devices:: virtio:: net:: Net ; 
37- use  crate :: devices:: virtio:: rng:: Entropy ; 
3834use  crate :: devices:: virtio:: transport:: mmio:: { IrqTrigger ,  MmioTransport } ; 
39- use  crate :: devices:: virtio:: vsock:: { TYPE_VSOCK ,  Vsock ,  VsockUnixBackend } ; 
40- use  crate :: devices:: virtio:: { TYPE_BALLOON ,  TYPE_BLOCK ,  TYPE_NET ,  TYPE_RNG } ; 
4135use  crate :: resources:: VmResources ; 
4236use  crate :: snapshot:: Persist ; 
4337use  crate :: vstate:: memory:: GuestMemoryMmap ; 
@@ -265,85 +259,28 @@ impl DeviceManager {
265259        self . pci_devices . attach_pci_segment ( vm) 
266260    } 
267261
268-     fn  do_kick_device ( virtio_device :  Arc < Mutex < dyn  VirtioDevice > > )  { 
269-         let  mut  device = virtio_device. lock ( ) . expect ( "Poisoned lock" ) ; 
270-         match  device. device_type ( )  { 
271-             TYPE_BALLOON  => { 
272-                 let  balloon = device. as_mut_any ( ) . downcast_mut :: < Balloon > ( ) . unwrap ( ) ; 
273-                 // If device is activated, kick the balloon queue(s) to make up for any 
274-                 // pending or in-flight epoll events we may have not captured in snapshot. 
275-                 // Stats queue doesn't need kicking as it is notified via a `timer_fd`. 
276-                 if  balloon. is_activated ( )  { 
277-                     info ! ( "kick balloon {}." ,  balloon. id( ) ) ; 
278-                     balloon. process_virtio_queues ( ) ; 
279-                 } 
280-             } 
281-             TYPE_BLOCK  => { 
282-                 // We only care about kicking virtio block. 
283-                 // If we need to kick vhost-user-block we can do nothing. 
284-                 if  let  Some ( block)  = device. as_mut_any ( ) . downcast_mut :: < Block > ( )  { 
285-                     // If device is activated, kick the block queue(s) to make up for any 
286-                     // pending or in-flight epoll events we may have not captured in 
287-                     // snapshot. No need to kick Ratelimiters 
288-                     // because they are restored 'unblocked' so 
289-                     // any inflight `timer_fd` events can be safely discarded. 
290-                     if  block. is_activated ( )  { 
291-                         info ! ( "kick block {}." ,  block. id( ) ) ; 
292-                         block. process_virtio_queues ( ) ; 
293-                     } 
294-                 } 
295-             } 
296-             TYPE_NET  => { 
297-                 let  net = device. as_mut_any ( ) . downcast_mut :: < Net > ( ) . unwrap ( ) ; 
298-                 // If device is activated, kick the net queue(s) to make up for any 
299-                 // pending or in-flight epoll events we may have not captured in snapshot. 
300-                 // No need to kick Ratelimiters because they are restored 'unblocked' so 
301-                 // any inflight `timer_fd` events can be safely discarded. 
302-                 if  net. is_activated ( )  { 
303-                     info ! ( "kick net {}." ,  net. id( ) ) ; 
304-                     net. process_virtio_queues ( ) ; 
305-                 } 
306-             } 
307-             TYPE_VSOCK  => { 
308-                 // Vsock has complicated protocol that isn't resilient to any packet loss, 
309-                 // so for Vsock we don't support connection persistence through snapshot. 
310-                 // Any in-flight packets or events are simply lost. 
311-                 // Vsock is restored 'empty'. 
312-                 // The only reason we still `kick` it is to make guest process 
313-                 // `TRANSPORT_RESET_EVENT` event we sent during snapshot creation. 
314-                 let  vsock = device
315-                     . as_mut_any ( ) 
316-                     . downcast_mut :: < Vsock < VsockUnixBackend > > ( ) 
317-                     . unwrap ( ) ; 
318-                 if  vsock. is_activated ( )  { 
319-                     info ! ( "kick vsock {}." ,  vsock. id( ) ) ; 
320-                     vsock. signal_used_queue ( 0 ) . unwrap ( ) ; 
321-                 } 
322-             } 
323-             TYPE_RNG  => { 
324-                 let  entropy = device. as_mut_any ( ) . downcast_mut :: < Entropy > ( ) . unwrap ( ) ; 
325-                 if  entropy. is_activated ( )  { 
326-                     info ! ( "kick entropy {}." ,  entropy. id( ) ) ; 
327-                     entropy. process_virtio_queues ( ) ; 
328-                 } 
329-             } 
330-             _ => ( ) , 
331-         } 
332-     } 
333- 
334262    /// Artificially kick VirtIO devices as if they had external events. 
335263     pub  fn  kick_virtio_devices ( & self )  { 
336264        info ! ( "Artificially kick devices" ) ; 
337265        // Go through MMIO VirtIO devices 
338266        let  _:  Result < ( ) ,  MmioError >  = self . mmio_devices . for_each_virtio_device ( |_,  _,  device| { 
339267            let  mmio_transport_locked = device. inner . lock ( ) . expect ( "Poisoned lock" ) ; 
340-             Self :: do_kick_device ( mmio_transport_locked. device ( ) ) ; 
268+             mmio_transport_locked
269+                 . device ( ) 
270+                 . lock ( ) 
271+                 . expect ( "Poisoned lock" ) 
272+                 . kick ( ) ; 
341273            Ok ( ( ) ) 
342274        } ) ; 
343275        // Go through PCI VirtIO devices 
344-         for  device in  self . pci_devices . virtio_devices . values ( )  { 
345-             let  virtio_device = device. lock ( ) . expect ( "Poisoned lock" ) . virtio_device ( ) ; 
346-             Self :: do_kick_device ( virtio_device) ; 
276+         for  virtio_pci_device in  self . pci_devices . virtio_devices . values ( )  { 
277+             virtio_pci_device
278+                 . lock ( ) 
279+                 . expect ( "Poisoned lock" ) 
280+                 . virtio_device ( ) 
281+                 . lock ( ) 
282+                 . expect ( "Poisoned lock" ) 
283+                 . kick ( ) ; 
347284        } 
348285    } 
349286
0 commit comments