@@ -25,7 +25,7 @@ use super::{
2525} ;
2626use crate :: devices:: virtio:: balloon:: BalloonError ;
2727use crate :: devices:: virtio:: generated:: virtio_config:: VIRTIO_F_VERSION_1 ;
28- use crate :: devices:: virtio:: transport:: mmio :: { IrqTrigger , IrqType } ;
28+ use crate :: devices:: virtio:: transport:: { VirtioInterrupt , VirtioInterruptType } ;
2929use crate :: logger:: IncMetric ;
3030use crate :: utils:: u64_to_usize;
3131use crate :: vstate:: memory:: { Address , ByteValued , Bytes , GuestAddress , GuestMemoryMmap } ;
@@ -339,7 +339,7 @@ impl Balloon {
339339 }
340340
341341 if needs_interrupt {
342- self . signal_used_queue ( ) ?;
342+ self . signal_used_queue ( INFLATE_INDEX ) ?;
343343 }
344344
345345 Ok ( ( ) )
@@ -357,7 +357,7 @@ impl Balloon {
357357 }
358358
359359 if needs_interrupt {
360- self . signal_used_queue ( )
360+ self . signal_used_queue ( DEFLATE_INDEX )
361361 } else {
362362 Ok ( ( ) )
363363 }
@@ -401,9 +401,9 @@ impl Balloon {
401401 Ok ( ( ) )
402402 }
403403
404- pub ( crate ) fn signal_used_queue ( & self ) -> Result < ( ) , BalloonError > {
404+ pub ( crate ) fn signal_used_queue ( & self , qidx : usize ) -> Result < ( ) , BalloonError > {
405405 self . interrupt_trigger ( )
406- . trigger_irq ( IrqType :: Vring )
406+ . trigger ( VirtioInterruptType :: Queue ( qidx as u16 ) )
407407 . map_err ( |err| {
408408 METRICS . event_fails . inc ( ) ;
409409 BalloonError :: InterruptError ( err)
@@ -428,7 +428,7 @@ impl Balloon {
428428 self . queues [ STATS_INDEX ]
429429 . add_used ( index, 0 )
430430 . map_err ( BalloonError :: Queue ) ?;
431- self . signal_used_queue ( )
431+ self . signal_used_queue ( STATS_INDEX )
432432 } else {
433433 error ! ( "Failed to update balloon stats, missing descriptor." ) ;
434434 Ok ( ( ) )
@@ -440,7 +440,7 @@ impl Balloon {
440440 if self . is_activated ( ) {
441441 self . config_space . num_pages = mib_to_pages ( amount_mib) ?;
442442 self . interrupt_trigger ( )
443- . trigger_irq ( IrqType :: Config )
443+ . trigger ( VirtioInterruptType :: Config )
444444 . map_err ( BalloonError :: InterruptError )
445445 } else {
446446 Err ( BalloonError :: DeviceNotActive )
@@ -551,7 +551,7 @@ impl VirtioDevice for Balloon {
551551 & self . queue_evts
552552 }
553553
554- fn interrupt_trigger ( & self ) -> Arc < IrqTrigger > {
554+ fn interrupt_trigger ( & self ) -> Arc < dyn VirtioInterrupt > {
555555 self . device_state
556556 . active_state ( )
557557 . expect ( "Device is not activated" )
@@ -585,7 +585,7 @@ impl VirtioDevice for Balloon {
585585 fn activate (
586586 & mut self ,
587587 mem : GuestMemoryMmap ,
588- interrupt : Arc < IrqTrigger > ,
588+ interrupt : Arc < dyn VirtioInterrupt > ,
589589 ) -> Result < ( ) , ActivateError > {
590590 for q in self . queues . iter_mut ( ) {
591591 q. initialize ( & mem)
@@ -621,7 +621,7 @@ pub(crate) mod tests {
621621 check_request_completion, invoke_handler_for_queue_event, set_request,
622622 } ;
623623 use crate :: devices:: virtio:: queue:: { VIRTQ_DESC_F_NEXT , VIRTQ_DESC_F_WRITE } ;
624- use crate :: devices:: virtio:: test_utils:: { VirtQueue , default_mem} ;
624+ use crate :: devices:: virtio:: test_utils:: { VirtQueue , default_interrupt , default_mem} ;
625625 use crate :: test_utils:: single_region_mem;
626626 use crate :: vstate:: memory:: GuestAddress ;
627627
@@ -798,11 +798,10 @@ pub(crate) mod tests {
798798 fn test_invalid_request ( ) {
799799 let mut balloon = Balloon :: new ( 0 , true , 0 , false ) . unwrap ( ) ;
800800 let mem = default_mem ( ) ;
801- let interrupt = Arc :: new ( IrqTrigger :: new ( ) . unwrap ( ) ) ;
802801 // Only initialize the inflate queue to demonstrate invalid request handling.
803802 let infq = VirtQueue :: new ( GuestAddress ( 0 ) , & mem, 16 ) ;
804803 balloon. set_queue ( INFLATE_INDEX , infq. create_queue ( ) ) ;
805- balloon. activate ( mem. clone ( ) , interrupt ) . unwrap ( ) ;
804+ balloon. activate ( mem. clone ( ) , default_interrupt ( ) ) . unwrap ( ) ;
806805
807806 // Fill the second page with non-zero bytes.
808807 for i in 0 ..0x1000 {
@@ -858,10 +857,9 @@ pub(crate) mod tests {
858857 fn test_inflate ( ) {
859858 let mut balloon = Balloon :: new ( 0 , true , 0 , false ) . unwrap ( ) ;
860859 let mem = default_mem ( ) ;
861- let interrupt = Arc :: new ( IrqTrigger :: new ( ) . unwrap ( ) ) ;
862860 let infq = VirtQueue :: new ( GuestAddress ( 0 ) , & mem, 16 ) ;
863861 balloon. set_queue ( INFLATE_INDEX , infq. create_queue ( ) ) ;
864- balloon. activate ( mem. clone ( ) , interrupt ) . unwrap ( ) ;
862+ balloon. activate ( mem. clone ( ) , default_interrupt ( ) ) . unwrap ( ) ;
865863
866864 // Fill the third page with non-zero bytes.
867865 for i in 0 ..0x1000 {
@@ -929,10 +927,9 @@ pub(crate) mod tests {
929927 fn test_deflate ( ) {
930928 let mut balloon = Balloon :: new ( 0 , true , 0 , false ) . unwrap ( ) ;
931929 let mem = default_mem ( ) ;
932- let interrupt = Arc :: new ( IrqTrigger :: new ( ) . unwrap ( ) ) ;
933930 let defq = VirtQueue :: new ( GuestAddress ( 0 ) , & mem, 16 ) ;
934931 balloon. set_queue ( DEFLATE_INDEX , defq. create_queue ( ) ) ;
935- balloon. activate ( mem. clone ( ) , interrupt ) . unwrap ( ) ;
932+ balloon. activate ( mem. clone ( ) , default_interrupt ( ) ) . unwrap ( ) ;
936933
937934 let page_addr = 0x10 ;
938935
@@ -978,10 +975,9 @@ pub(crate) mod tests {
978975 fn test_stats ( ) {
979976 let mut balloon = Balloon :: new ( 0 , true , 1 , false ) . unwrap ( ) ;
980977 let mem = default_mem ( ) ;
981- let interrupt = Arc :: new ( IrqTrigger :: new ( ) . unwrap ( ) ) ;
982978 let statsq = VirtQueue :: new ( GuestAddress ( 0 ) , & mem, 16 ) ;
983979 balloon. set_queue ( STATS_INDEX , statsq. create_queue ( ) ) ;
984- balloon. activate ( mem. clone ( ) , interrupt ) . unwrap ( ) ;
980+ balloon. activate ( mem. clone ( ) , default_interrupt ( ) ) . unwrap ( ) ;
985981
986982 let page_addr = 0x100 ;
987983
@@ -1057,7 +1053,11 @@ pub(crate) mod tests {
10571053 assert!( balloon. stats_desc_index. is_some( ) ) ;
10581054 balloon. process_stats_timer_event( ) . unwrap( ) ;
10591055 assert!( balloon. stats_desc_index. is_none( ) ) ;
1060- assert!( balloon. interrupt_trigger( ) . has_pending_irq( IrqType :: Vring ) ) ;
1056+ assert!(
1057+ balloon
1058+ . interrupt_trigger( )
1059+ . has_pending_interrupt( VirtioInterruptType :: Queue ( STATS_INDEX as u16 ) )
1060+ ) ;
10611061 } ) ;
10621062 }
10631063 }
@@ -1066,23 +1066,21 @@ pub(crate) mod tests {
10661066 fn test_process_balloon_queues ( ) {
10671067 let mut balloon = Balloon :: new ( 0x10 , true , 0 , false ) . unwrap ( ) ;
10681068 let mem = default_mem ( ) ;
1069- let interrupt = Arc :: new ( IrqTrigger :: new ( ) . unwrap ( ) ) ;
10701069 let infq = VirtQueue :: new ( GuestAddress ( 0 ) , & mem, 16 ) ;
10711070 let defq = VirtQueue :: new ( GuestAddress ( 0 ) , & mem, 16 ) ;
10721071
10731072 balloon. set_queue ( INFLATE_INDEX , infq. create_queue ( ) ) ;
10741073 balloon. set_queue ( DEFLATE_INDEX , defq. create_queue ( ) ) ;
10751074
1076- balloon. activate ( mem, interrupt ) . unwrap ( ) ;
1075+ balloon. activate ( mem, default_interrupt ( ) ) . unwrap ( ) ;
10771076 balloon. process_virtio_queues ( )
10781077 }
10791078
10801079 #[ test]
10811080 fn test_update_stats_interval ( ) {
10821081 let mut balloon = Balloon :: new ( 0 , true , 0 , false ) . unwrap ( ) ;
10831082 let mem = default_mem ( ) ;
1084- let interrupt = Arc :: new ( IrqTrigger :: new ( ) . unwrap ( ) ) ;
1085- balloon. activate ( mem, interrupt) . unwrap ( ) ;
1083+ balloon. activate ( mem, default_interrupt ( ) ) . unwrap ( ) ;
10861084 assert_eq ! (
10871085 format!( "{:?}" , balloon. update_stats_polling_interval( 1 ) ) ,
10881086 "Err(StatisticsStateChange)"
@@ -1091,8 +1089,7 @@ pub(crate) mod tests {
10911089
10921090 let mut balloon = Balloon :: new ( 0 , true , 1 , false ) . unwrap ( ) ;
10931091 let mem = default_mem ( ) ;
1094- let interrupt = Arc :: new ( IrqTrigger :: new ( ) . unwrap ( ) ) ;
1095- balloon. activate ( mem, interrupt) . unwrap ( ) ;
1092+ balloon. activate ( mem, default_interrupt ( ) ) . unwrap ( ) ;
10961093 assert_eq ! (
10971094 format!( "{:?}" , balloon. update_stats_polling_interval( 0 ) ) ,
10981095 "Err(StatisticsStateChange)"
@@ -1113,7 +1110,7 @@ pub(crate) mod tests {
11131110 let mut balloon = Balloon :: new ( 0 , true , 0 , false ) . unwrap ( ) ;
11141111 // Switch the state to active.
11151112 balloon. device_state =
1116- DeviceState :: Activated ( ( single_region_mem ( 0x1 ) , Arc :: new ( IrqTrigger :: new ( ) . unwrap ( ) ) ) ) ;
1113+ DeviceState :: Activated ( ( single_region_mem ( 0x1 ) , default_interrupt ( ) ) ) ;
11171114
11181115 assert_eq ! ( balloon. num_pages( ) , 0 ) ;
11191116 assert_eq ! ( balloon. actual_pages( ) , 0 ) ;
0 commit comments