@@ -25,7 +25,7 @@ use super::{
25
25
} ;
26
26
use crate :: devices:: virtio:: balloon:: BalloonError ;
27
27
use 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 } ;
29
29
use crate :: logger:: IncMetric ;
30
30
use crate :: utils:: u64_to_usize;
31
31
use crate :: vstate:: memory:: { Address , ByteValued , Bytes , GuestAddress , GuestMemoryMmap } ;
@@ -339,7 +339,7 @@ impl Balloon {
339
339
}
340
340
341
341
if needs_interrupt {
342
- self . signal_used_queue ( ) ?;
342
+ self . signal_used_queue ( INFLATE_INDEX ) ?;
343
343
}
344
344
345
345
Ok ( ( ) )
@@ -357,7 +357,7 @@ impl Balloon {
357
357
}
358
358
359
359
if needs_interrupt {
360
- self . signal_used_queue ( )
360
+ self . signal_used_queue ( DEFLATE_INDEX )
361
361
} else {
362
362
Ok ( ( ) )
363
363
}
@@ -401,9 +401,12 @@ impl Balloon {
401
401
Ok ( ( ) )
402
402
}
403
403
404
- pub ( crate ) fn signal_used_queue ( & self ) -> Result < ( ) , BalloonError > {
404
+ pub ( crate ) fn signal_used_queue ( & self , qidx : usize ) -> Result < ( ) , BalloonError > {
405
405
self . interrupt_trigger ( )
406
- . trigger_irq ( IrqType :: Vring )
406
+ . trigger ( VirtioInterruptType :: Queue (
407
+ qidx. try_into ( )
408
+ . unwrap_or_else ( |_| panic ! ( "balloon: invalid queue id: {qidx}" ) ) ,
409
+ ) )
407
410
. map_err ( |err| {
408
411
METRICS . event_fails . inc ( ) ;
409
412
BalloonError :: InterruptError ( err)
@@ -428,7 +431,7 @@ impl Balloon {
428
431
self . queues [ STATS_INDEX ]
429
432
. add_used ( index, 0 )
430
433
. map_err ( BalloonError :: Queue ) ?;
431
- self . signal_used_queue ( )
434
+ self . signal_used_queue ( STATS_INDEX )
432
435
} else {
433
436
error ! ( "Failed to update balloon stats, missing descriptor." ) ;
434
437
Ok ( ( ) )
@@ -440,7 +443,7 @@ impl Balloon {
440
443
if self . is_activated ( ) {
441
444
self . config_space . num_pages = mib_to_pages ( amount_mib) ?;
442
445
self . interrupt_trigger ( )
443
- . trigger_irq ( IrqType :: Config )
446
+ . trigger ( VirtioInterruptType :: Config )
444
447
. map_err ( BalloonError :: InterruptError )
445
448
} else {
446
449
Err ( BalloonError :: DeviceNotActive )
@@ -551,7 +554,7 @@ impl VirtioDevice for Balloon {
551
554
& self . queue_evts
552
555
}
553
556
554
- fn interrupt_trigger ( & self ) -> Arc < IrqTrigger > {
557
+ fn interrupt_trigger ( & self ) -> Arc < dyn VirtioInterrupt > {
555
558
self . device_state
556
559
. active_state ( )
557
560
. expect ( "Device is not activated" )
@@ -585,7 +588,7 @@ impl VirtioDevice for Balloon {
585
588
fn activate (
586
589
& mut self ,
587
590
mem : GuestMemoryMmap ,
588
- interrupt : Arc < IrqTrigger > ,
591
+ interrupt : Arc < dyn VirtioInterrupt > ,
589
592
) -> Result < ( ) , ActivateError > {
590
593
for q in self . queues . iter_mut ( ) {
591
594
q. initialize ( & mem)
@@ -621,7 +624,7 @@ pub(crate) mod tests {
621
624
check_request_completion, invoke_handler_for_queue_event, set_request,
622
625
} ;
623
626
use crate :: devices:: virtio:: queue:: { VIRTQ_DESC_F_NEXT , VIRTQ_DESC_F_WRITE } ;
624
- use crate :: devices:: virtio:: test_utils:: { VirtQueue , default_mem} ;
627
+ use crate :: devices:: virtio:: test_utils:: { VirtQueue , default_interrupt , default_mem} ;
625
628
use crate :: test_utils:: single_region_mem;
626
629
use crate :: vstate:: memory:: GuestAddress ;
627
630
@@ -798,11 +801,10 @@ pub(crate) mod tests {
798
801
fn test_invalid_request ( ) {
799
802
let mut balloon = Balloon :: new ( 0 , true , 0 , false ) . unwrap ( ) ;
800
803
let mem = default_mem ( ) ;
801
- let interrupt = Arc :: new ( IrqTrigger :: new ( ) . unwrap ( ) ) ;
802
804
// Only initialize the inflate queue to demonstrate invalid request handling.
803
805
let infq = VirtQueue :: new ( GuestAddress ( 0 ) , & mem, 16 ) ;
804
806
balloon. set_queue ( INFLATE_INDEX , infq. create_queue ( ) ) ;
805
- balloon. activate ( mem. clone ( ) , interrupt ) . unwrap ( ) ;
807
+ balloon. activate ( mem. clone ( ) , default_interrupt ( ) ) . unwrap ( ) ;
806
808
807
809
// Fill the second page with non-zero bytes.
808
810
for i in 0 ..0x1000 {
@@ -858,10 +860,9 @@ pub(crate) mod tests {
858
860
fn test_inflate ( ) {
859
861
let mut balloon = Balloon :: new ( 0 , true , 0 , false ) . unwrap ( ) ;
860
862
let mem = default_mem ( ) ;
861
- let interrupt = Arc :: new ( IrqTrigger :: new ( ) . unwrap ( ) ) ;
862
863
let infq = VirtQueue :: new ( GuestAddress ( 0 ) , & mem, 16 ) ;
863
864
balloon. set_queue ( INFLATE_INDEX , infq. create_queue ( ) ) ;
864
- balloon. activate ( mem. clone ( ) , interrupt ) . unwrap ( ) ;
865
+ balloon. activate ( mem. clone ( ) , default_interrupt ( ) ) . unwrap ( ) ;
865
866
866
867
// Fill the third page with non-zero bytes.
867
868
for i in 0 ..0x1000 {
@@ -929,10 +930,9 @@ pub(crate) mod tests {
929
930
fn test_deflate ( ) {
930
931
let mut balloon = Balloon :: new ( 0 , true , 0 , false ) . unwrap ( ) ;
931
932
let mem = default_mem ( ) ;
932
- let interrupt = Arc :: new ( IrqTrigger :: new ( ) . unwrap ( ) ) ;
933
933
let defq = VirtQueue :: new ( GuestAddress ( 0 ) , & mem, 16 ) ;
934
934
balloon. set_queue ( DEFLATE_INDEX , defq. create_queue ( ) ) ;
935
- balloon. activate ( mem. clone ( ) , interrupt ) . unwrap ( ) ;
935
+ balloon. activate ( mem. clone ( ) , default_interrupt ( ) ) . unwrap ( ) ;
936
936
937
937
let page_addr = 0x10 ;
938
938
@@ -978,10 +978,9 @@ pub(crate) mod tests {
978
978
fn test_stats ( ) {
979
979
let mut balloon = Balloon :: new ( 0 , true , 1 , false ) . unwrap ( ) ;
980
980
let mem = default_mem ( ) ;
981
- let interrupt = Arc :: new ( IrqTrigger :: new ( ) . unwrap ( ) ) ;
982
981
let statsq = VirtQueue :: new ( GuestAddress ( 0 ) , & mem, 16 ) ;
983
982
balloon. set_queue ( STATS_INDEX , statsq. create_queue ( ) ) ;
984
- balloon. activate ( mem. clone ( ) , interrupt ) . unwrap ( ) ;
983
+ balloon. activate ( mem. clone ( ) , default_interrupt ( ) ) . unwrap ( ) ;
985
984
986
985
let page_addr = 0x100 ;
987
986
@@ -1057,7 +1056,9 @@ pub(crate) mod tests {
1057
1056
assert!( balloon. stats_desc_index. is_some( ) ) ;
1058
1057
balloon. process_stats_timer_event( ) . unwrap( ) ;
1059
1058
assert!( balloon. stats_desc_index. is_none( ) ) ;
1060
- assert!( balloon. interrupt_trigger( ) . has_pending_irq( IrqType :: Vring ) ) ;
1059
+ assert!( balloon. interrupt_trigger( ) . has_pending_interrupt(
1060
+ VirtioInterruptType :: Queue ( STATS_INDEX . try_into( ) . unwrap( ) )
1061
+ ) ) ;
1061
1062
} ) ;
1062
1063
}
1063
1064
}
@@ -1066,23 +1067,21 @@ pub(crate) mod tests {
1066
1067
fn test_process_balloon_queues ( ) {
1067
1068
let mut balloon = Balloon :: new ( 0x10 , true , 0 , false ) . unwrap ( ) ;
1068
1069
let mem = default_mem ( ) ;
1069
- let interrupt = Arc :: new ( IrqTrigger :: new ( ) . unwrap ( ) ) ;
1070
1070
let infq = VirtQueue :: new ( GuestAddress ( 0 ) , & mem, 16 ) ;
1071
1071
let defq = VirtQueue :: new ( GuestAddress ( 0 ) , & mem, 16 ) ;
1072
1072
1073
1073
balloon. set_queue ( INFLATE_INDEX , infq. create_queue ( ) ) ;
1074
1074
balloon. set_queue ( DEFLATE_INDEX , defq. create_queue ( ) ) ;
1075
1075
1076
- balloon. activate ( mem, interrupt ) . unwrap ( ) ;
1076
+ balloon. activate ( mem, default_interrupt ( ) ) . unwrap ( ) ;
1077
1077
balloon. process_virtio_queues ( )
1078
1078
}
1079
1079
1080
1080
#[ test]
1081
1081
fn test_update_stats_interval ( ) {
1082
1082
let mut balloon = Balloon :: new ( 0 , true , 0 , false ) . unwrap ( ) ;
1083
1083
let mem = default_mem ( ) ;
1084
- let interrupt = Arc :: new ( IrqTrigger :: new ( ) . unwrap ( ) ) ;
1085
- balloon. activate ( mem, interrupt) . unwrap ( ) ;
1084
+ balloon. activate ( mem, default_interrupt ( ) ) . unwrap ( ) ;
1086
1085
assert_eq ! (
1087
1086
format!( "{:?}" , balloon. update_stats_polling_interval( 1 ) ) ,
1088
1087
"Err(StatisticsStateChange)"
@@ -1091,8 +1090,7 @@ pub(crate) mod tests {
1091
1090
1092
1091
let mut balloon = Balloon :: new ( 0 , true , 1 , false ) . unwrap ( ) ;
1093
1092
let mem = default_mem ( ) ;
1094
- let interrupt = Arc :: new ( IrqTrigger :: new ( ) . unwrap ( ) ) ;
1095
- balloon. activate ( mem, interrupt) . unwrap ( ) ;
1093
+ balloon. activate ( mem, default_interrupt ( ) ) . unwrap ( ) ;
1096
1094
assert_eq ! (
1097
1095
format!( "{:?}" , balloon. update_stats_polling_interval( 0 ) ) ,
1098
1096
"Err(StatisticsStateChange)"
@@ -1113,7 +1111,7 @@ pub(crate) mod tests {
1113
1111
let mut balloon = Balloon :: new ( 0 , true , 0 , false ) . unwrap ( ) ;
1114
1112
// Switch the state to active.
1115
1113
balloon. device_state =
1116
- DeviceState :: Activated ( ( single_region_mem ( 0x1 ) , Arc :: new ( IrqTrigger :: new ( ) . unwrap ( ) ) ) ) ;
1114
+ DeviceState :: Activated ( ( single_region_mem ( 0x1 ) , default_interrupt ( ) ) ) ;
1117
1115
1118
1116
assert_eq ! ( balloon. num_pages( ) , 0 ) ;
1119
1117
assert_eq ! ( balloon. actual_pages( ) , 0 ) ;
0 commit comments