@@ -473,22 +473,10 @@ impl<'a> Persist<'a> for MMIODeviceManager {
473473 as_subscriber : Arc < Mutex < dyn MutEventSubscriber > > ,
474474 id : & String ,
475475 state : & MmioTransportState ,
476+ interrupt : Arc < IrqTrigger > ,
476477 device_info : & MMIODeviceInfo ,
477478 event_manager : & mut EventManager |
478479 -> Result < ( ) , Self :: Error > {
479- // If the device was already activated, an interrupt was created and assigned to it. In
480- // that case grab a reference to it and pass it to the transport state. Otherwise,
481- // create a fresh one. Like this both the transport and the device will hold a
482- // reference to the same interrupt object, at all times.
483- let interrupt = {
484- let locked_dev = device. lock ( ) . expect ( "Poisoned lock" ) ;
485- if locked_dev. is_activated ( ) {
486- locked_dev. interrupt_trigger ( )
487- } else {
488- Arc :: new ( IrqTrigger :: new ( ) . expect ( "Could not create IRQ for MMIO device" ) )
489- }
490- } ;
491-
492480 let restore_args = MmioTransportConstructorArgs {
493481 mem : mem. clone ( ) ,
494482 interrupt,
@@ -526,9 +514,12 @@ impl<'a> Persist<'a> for MMIODeviceManager {
526514 } ;
527515
528516 if let Some ( balloon_state) = & state. balloon_device {
517+ let interrupt =
518+ Arc :: new ( IrqTrigger :: new ( ) . expect ( "Could not create interrupt for MMIO device" ) ) ;
529519 let device = Arc :: new ( Mutex :: new ( Balloon :: restore (
530520 BalloonConstructorArgs {
531521 mem : mem. clone ( ) ,
522+ interrupt : interrupt. clone ( ) ,
532523 restored_from_file : constructor_args. restored_from_file ,
533524 } ,
534525 & balloon_state. device_state ,
@@ -544,14 +535,20 @@ impl<'a> Persist<'a> for MMIODeviceManager {
544535 device,
545536 & balloon_state. device_id ,
546537 & balloon_state. transport_state ,
538+ interrupt,
547539 & balloon_state. device_info ,
548540 constructor_args. event_manager ,
549541 ) ?;
550542 }
551543
552544 for block_state in & state. block_devices {
545+ let interrupt =
546+ Arc :: new ( IrqTrigger :: new ( ) . expect ( "Could not create interrupt for MMIO device" ) ) ;
553547 let device = Arc :: new ( Mutex :: new ( Block :: restore (
554- BlockConstructorArgs { mem : mem. clone ( ) } ,
548+ BlockConstructorArgs {
549+ mem : mem. clone ( ) ,
550+ interrupt : interrupt. clone ( ) ,
551+ } ,
555552 & block_state. device_state ,
556553 ) ?) ) ;
557554
@@ -565,6 +562,7 @@ impl<'a> Persist<'a> for MMIODeviceManager {
565562 device,
566563 & block_state. device_id ,
567564 & block_state. transport_state ,
565+ interrupt,
568566 & block_state. device_info ,
569567 constructor_args. event_manager ,
570568 ) ?;
@@ -587,9 +585,12 @@ impl<'a> Persist<'a> for MMIODeviceManager {
587585 }
588586
589587 for net_state in & state. net_devices {
588+ let interrupt =
589+ Arc :: new ( IrqTrigger :: new ( ) . expect ( "Could not create interrupt for MMIO device" ) ) ;
590590 let device = Arc :: new ( Mutex :: new ( Net :: restore (
591591 NetConstructorArgs {
592592 mem : mem. clone ( ) ,
593+ interrupt : interrupt. clone ( ) ,
593594 mmds : constructor_args
594595 . vm_resources
595596 . mmds
@@ -610,6 +611,7 @@ impl<'a> Persist<'a> for MMIODeviceManager {
610611 device,
611612 & net_state. device_id ,
612613 & net_state. transport_state ,
614+ interrupt,
613615 & net_state. device_info ,
614616 constructor_args. event_manager ,
615617 ) ?;
@@ -620,9 +622,12 @@ impl<'a> Persist<'a> for MMIODeviceManager {
620622 cid : vsock_state. device_state . frontend . cid ,
621623 } ;
622624 let backend = VsockUnixBackend :: restore ( ctor_args, & vsock_state. device_state . backend ) ?;
625+ let interrupt =
626+ Arc :: new ( IrqTrigger :: new ( ) . expect ( "Could not create interrupt for MMIO device" ) ) ;
623627 let device = Arc :: new ( Mutex :: new ( Vsock :: restore (
624628 VsockConstructorArgs {
625629 mem : mem. clone ( ) ,
630+ interrupt : interrupt. clone ( ) ,
626631 backend,
627632 } ,
628633 & vsock_state. device_state . frontend ,
@@ -638,13 +643,16 @@ impl<'a> Persist<'a> for MMIODeviceManager {
638643 device,
639644 & vsock_state. device_id ,
640645 & vsock_state. transport_state ,
646+ interrupt,
641647 & vsock_state. device_info ,
642648 constructor_args. event_manager ,
643649 ) ?;
644650 }
645651
646652 if let Some ( entropy_state) = & state. entropy_device {
647- let ctor_args = EntropyConstructorArgs :: new ( mem. clone ( ) ) ;
653+ let interrupt =
654+ Arc :: new ( IrqTrigger :: new ( ) . expect ( "Could not create interrupt for MMIO device" ) ) ;
655+ let ctor_args = EntropyConstructorArgs :: new ( mem. clone ( ) , interrupt. clone ( ) ) ;
648656
649657 let device = Arc :: new ( Mutex :: new ( Entropy :: restore (
650658 ctor_args,
@@ -661,6 +669,7 @@ impl<'a> Persist<'a> for MMIODeviceManager {
661669 device,
662670 & entropy_state. device_id ,
663671 & entropy_state. transport_state ,
672+ interrupt,
664673 & entropy_state. device_info ,
665674 constructor_args. event_manager ,
666675 ) ?;
0 commit comments