@@ -20,10 +20,12 @@ use super::{
2020 FREE_PAGE_HINT_STOP , INFLATE_INDEX , MAX_PAGE_COMPACT_BUFFER , MAX_PAGES_IN_DESC ,
2121 MIB_TO_4K_PAGES , STATS_INDEX , VIRTIO_BALLOON_F_DEFLATE_ON_OOM ,
2222 VIRTIO_BALLOON_F_FREE_PAGE_HINTING , VIRTIO_BALLOON_F_FREE_PAGE_REPORTING ,
23- VIRTIO_BALLOON_F_STATS_VQ , VIRTIO_BALLOON_PFN_SHIFT , VIRTIO_BALLOON_S_AVAIL ,
24- VIRTIO_BALLOON_S_CACHES , 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_SWAP_IN , VIRTIO_BALLOON_S_SWAP_OUT ,
23+ VIRTIO_BALLOON_F_STATS_VQ , VIRTIO_BALLOON_PFN_SHIFT , VIRTIO_BALLOON_S_ALLOC_STALL ,
24+ VIRTIO_BALLOON_S_ASYNC_RECLAIM , VIRTIO_BALLOON_S_ASYNC_SCAN , VIRTIO_BALLOON_S_AVAIL ,
25+ VIRTIO_BALLOON_S_CACHES , VIRTIO_BALLOON_S_DIRECT_RECLAIM , VIRTIO_BALLOON_S_DIRECT_SCAN ,
26+ VIRTIO_BALLOON_S_HTLB_PGALLOC , VIRTIO_BALLOON_S_HTLB_PGFAIL , VIRTIO_BALLOON_S_MAJFLT ,
27+ VIRTIO_BALLOON_S_MEMFREE , VIRTIO_BALLOON_S_MEMTOT , VIRTIO_BALLOON_S_MINFLT ,
28+ VIRTIO_BALLOON_S_OOM_KILL , VIRTIO_BALLOON_S_SWAP_IN , VIRTIO_BALLOON_S_SWAP_OUT ,
2729} ;
2830use crate :: devices:: virtio:: balloon:: BalloonError ;
2931use crate :: devices:: virtio:: device:: ActiveState ;
@@ -184,6 +186,24 @@ pub struct BalloonStats {
184186 /// in the guest.
185187 #[ serde( skip_serializing_if = "Option::is_none" ) ]
186188 pub hugetlb_failures : Option < u64 > ,
189+ /// OOM killer invocations. since linux v6.12.
190+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
191+ pub oom_kill : Option < u64 > ,
192+ /// Stall count of memory allocatoin. since linux v6.12.
193+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
194+ pub alloc_stall : Option < u64 > ,
195+ /// Amount of memory scanned asynchronously. since linux v6.12.
196+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
197+ pub async_scan : Option < u64 > ,
198+ /// Amount of memory scanned directly. since linux v6.12.
199+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
200+ pub direct_scan : Option < u64 > ,
201+ /// Amount of memory reclaimed asynchronously. since linux v6.12.
202+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
203+ pub async_reclaim : Option < u64 > ,
204+ /// Amount of memory reclaimed directly. since linux v6.12.
205+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
206+ pub direct_reclaim : Option < u64 > ,
187207}
188208
189209impl BalloonStats {
@@ -200,6 +220,12 @@ impl BalloonStats {
200220 VIRTIO_BALLOON_S_CACHES => self . disk_caches = val,
201221 VIRTIO_BALLOON_S_HTLB_PGALLOC => self . hugetlb_allocations = val,
202222 VIRTIO_BALLOON_S_HTLB_PGFAIL => self . hugetlb_failures = val,
223+ VIRTIO_BALLOON_S_OOM_KILL => self . oom_kill = val,
224+ VIRTIO_BALLOON_S_ALLOC_STALL => self . alloc_stall = val,
225+ VIRTIO_BALLOON_S_ASYNC_SCAN => self . async_scan = val,
226+ VIRTIO_BALLOON_S_DIRECT_SCAN => self . direct_scan = val,
227+ VIRTIO_BALLOON_S_ASYNC_RECLAIM => self . async_reclaim = val,
228+ VIRTIO_BALLOON_S_DIRECT_RECLAIM => self . direct_reclaim = val,
203229 _ => {
204230 return Err ( BalloonError :: MalformedPayload ) ;
205231 }
@@ -1035,6 +1061,12 @@ pub(crate) mod tests {
10351061 disk_caches : Some ( 0 ) ,
10361062 hugetlb_allocations : Some ( 0 ) ,
10371063 hugetlb_failures : Some ( 0 ) ,
1064+ oom_kill : None ,
1065+ alloc_stall : None ,
1066+ async_scan : None ,
1067+ direct_scan : None ,
1068+ async_reclaim : None ,
1069+ direct_reclaim : None ,
10381070 } ;
10391071
10401072 let mut stat = BalloonStat {
@@ -1071,6 +1103,24 @@ pub(crate) mod tests {
10711103 stat. tag = VIRTIO_BALLOON_S_HTLB_PGFAIL ;
10721104 stats. update_with_stat ( & stat) . unwrap ( ) ;
10731105 assert_eq ! ( stats. hugetlb_failures, Some ( 1 ) ) ;
1106+ stat. tag = VIRTIO_BALLOON_S_OOM_KILL ;
1107+ stats. update_with_stat ( & stat) . unwrap ( ) ;
1108+ assert_eq ! ( stats. oom_kill, Some ( 1 ) ) ;
1109+ stat. tag = VIRTIO_BALLOON_S_ALLOC_STALL ;
1110+ stats. update_with_stat ( & stat) . unwrap ( ) ;
1111+ assert_eq ! ( stats. alloc_stall, Some ( 1 ) ) ;
1112+ stat. tag = VIRTIO_BALLOON_S_ASYNC_SCAN ;
1113+ stats. update_with_stat ( & stat) . unwrap ( ) ;
1114+ assert_eq ! ( stats. async_scan, Some ( 1 ) ) ;
1115+ stat. tag = VIRTIO_BALLOON_S_DIRECT_SCAN ;
1116+ stats. update_with_stat ( & stat) . unwrap ( ) ;
1117+ assert_eq ! ( stats. direct_scan, Some ( 1 ) ) ;
1118+ stat. tag = VIRTIO_BALLOON_S_ASYNC_RECLAIM ;
1119+ stats. update_with_stat ( & stat) . unwrap ( ) ;
1120+ assert_eq ! ( stats. async_reclaim, Some ( 1 ) ) ;
1121+ stat. tag = VIRTIO_BALLOON_S_DIRECT_RECLAIM ;
1122+ stats. update_with_stat ( & stat) . unwrap ( ) ;
1123+ assert_eq ! ( stats. direct_reclaim, Some ( 1 ) ) ;
10741124 }
10751125
10761126 #[ test]
0 commit comments