@@ -19,9 +19,11 @@ use super::{
1919 BALLOON_DEV_ID , BALLOON_NUM_QUEUES , BALLOON_QUEUE_SIZES , DEFLATE_INDEX , INFLATE_INDEX ,
2020 MAX_PAGE_COMPACT_BUFFER , MAX_PAGES_IN_DESC , MIB_TO_4K_PAGES , STATS_INDEX ,
2121 VIRTIO_BALLOON_F_DEFLATE_ON_OOM , VIRTIO_BALLOON_F_STATS_VQ , VIRTIO_BALLOON_PFN_SHIFT ,
22- VIRTIO_BALLOON_S_AVAIL , VIRTIO_BALLOON_S_CACHES , VIRTIO_BALLOON_S_HTLB_PGALLOC ,
23- VIRTIO_BALLOON_S_HTLB_PGFAIL , VIRTIO_BALLOON_S_MAJFLT , VIRTIO_BALLOON_S_MEMFREE ,
24- VIRTIO_BALLOON_S_MEMTOT , VIRTIO_BALLOON_S_MINFLT , VIRTIO_BALLOON_S_SWAP_IN ,
22+ VIRTIO_BALLOON_S_ALLOC_STALL , VIRTIO_BALLOON_S_ASYNC_RECLAIM , VIRTIO_BALLOON_S_ASYNC_SCAN ,
23+ VIRTIO_BALLOON_S_AVAIL , VIRTIO_BALLOON_S_CACHES , VIRTIO_BALLOON_S_DIRECT_RECLAIM ,
24+ VIRTIO_BALLOON_S_DIRECT_SCAN , VIRTIO_BALLOON_S_HTLB_PGALLOC , VIRTIO_BALLOON_S_HTLB_PGFAIL ,
25+ VIRTIO_BALLOON_S_MAJFLT , VIRTIO_BALLOON_S_MEMFREE , VIRTIO_BALLOON_S_MEMTOT ,
26+ VIRTIO_BALLOON_S_MINFLT , VIRTIO_BALLOON_S_OOM_KILL , VIRTIO_BALLOON_S_SWAP_IN ,
2527 VIRTIO_BALLOON_S_SWAP_OUT ,
2628} ;
2729use crate :: devices:: virtio:: balloon:: BalloonError ;
@@ -133,6 +135,24 @@ pub struct BalloonStats {
133135 /// in the guest.
134136 #[ serde( skip_serializing_if = "Option::is_none" ) ]
135137 pub hugetlb_failures : Option < u64 > ,
138+ /// OOM killer invocations. since linux v6.12.
139+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
140+ pub oom_kill : Option < u64 > ,
141+ /// Stall count of memory allocatoin. since linux v6.12.
142+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
143+ pub alloc_stall : Option < u64 > ,
144+ /// Amount of memory scanned asynchronously. since linux v6.12.
145+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
146+ pub async_scan : Option < u64 > ,
147+ /// Amount of memory scanned directly. since linux v6.12.
148+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
149+ pub direct_scan : Option < u64 > ,
150+ /// Amount of memory reclaimed asynchronously. since linux v6.12.
151+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
152+ pub async_reclaim : Option < u64 > ,
153+ /// Amount of memory reclaimed directly. since linux v6.12.
154+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
155+ pub direct_reclaim : Option < u64 > ,
136156}
137157
138158impl BalloonStats {
@@ -149,6 +169,12 @@ impl BalloonStats {
149169 VIRTIO_BALLOON_S_CACHES => self . disk_caches = val,
150170 VIRTIO_BALLOON_S_HTLB_PGALLOC => self . hugetlb_allocations = val,
151171 VIRTIO_BALLOON_S_HTLB_PGFAIL => self . hugetlb_failures = val,
172+ VIRTIO_BALLOON_S_OOM_KILL => self . oom_kill = val,
173+ VIRTIO_BALLOON_S_ALLOC_STALL => self . alloc_stall = val,
174+ VIRTIO_BALLOON_S_ASYNC_SCAN => self . async_scan = val,
175+ VIRTIO_BALLOON_S_DIRECT_SCAN => self . direct_scan = val,
176+ VIRTIO_BALLOON_S_ASYNC_RECLAIM => self . async_reclaim = val,
177+ VIRTIO_BALLOON_S_DIRECT_RECLAIM => self . direct_reclaim = val,
152178 _ => {
153179 return Err ( BalloonError :: MalformedPayload ) ;
154180 }
@@ -694,6 +720,12 @@ pub(crate) mod tests {
694720 disk_caches : Some ( 0 ) ,
695721 hugetlb_allocations : Some ( 0 ) ,
696722 hugetlb_failures : Some ( 0 ) ,
723+ oom_kill : None ,
724+ alloc_stall : None ,
725+ async_scan : None ,
726+ direct_scan : None ,
727+ async_reclaim : None ,
728+ direct_reclaim : None ,
697729 } ;
698730
699731 let mut stat = BalloonStat {
@@ -730,6 +762,24 @@ pub(crate) mod tests {
730762 stat. tag = VIRTIO_BALLOON_S_HTLB_PGFAIL ;
731763 stats. update_with_stat ( & stat) . unwrap ( ) ;
732764 assert_eq ! ( stats. hugetlb_failures, Some ( 1 ) ) ;
765+ stat. tag = VIRTIO_BALLOON_S_OOM_KILL ;
766+ stats. update_with_stat ( & stat) . unwrap ( ) ;
767+ assert_eq ! ( stats. oom_kill, Some ( 1 ) ) ;
768+ stat. tag = VIRTIO_BALLOON_S_ALLOC_STALL ;
769+ stats. update_with_stat ( & stat) . unwrap ( ) ;
770+ assert_eq ! ( stats. alloc_stall, Some ( 1 ) ) ;
771+ stat. tag = VIRTIO_BALLOON_S_ASYNC_SCAN ;
772+ stats. update_with_stat ( & stat) . unwrap ( ) ;
773+ assert_eq ! ( stats. async_scan, Some ( 1 ) ) ;
774+ stat. tag = VIRTIO_BALLOON_S_DIRECT_SCAN ;
775+ stats. update_with_stat ( & stat) . unwrap ( ) ;
776+ assert_eq ! ( stats. direct_scan, Some ( 1 ) ) ;
777+ stat. tag = VIRTIO_BALLOON_S_ASYNC_RECLAIM ;
778+ stats. update_with_stat ( & stat) . unwrap ( ) ;
779+ assert_eq ! ( stats. async_reclaim, Some ( 1 ) ) ;
780+ stat. tag = VIRTIO_BALLOON_S_DIRECT_RECLAIM ;
781+ stats. update_with_stat ( & stat) . unwrap ( ) ;
782+ assert_eq ! ( stats. direct_reclaim, Some ( 1 ) ) ;
733783 }
734784
735785 #[ test]
0 commit comments