@@ -9,6 +9,7 @@ use process_descendents::ProcessDescendentsIterator;
99mod pfnset;
1010use pfnset:: PfnSet ;
1111
12+ // From https://github.com/torvalds/linux/blob/c62f4b82d57155f35befb5c8bbae176614b87623/arch/x86/include/asm/page_64_types.h#L42
1213const PAGE_OFFSET : u64 = 0xffff_8800_0000_0000 ;
1314
1415#[ derive( thiserror:: Error , Debug ) ]
@@ -24,13 +25,22 @@ pub enum Error {
2425#[ derive( Debug ) ]
2526pub ( crate ) struct Sampler {
2627 parent_pid : i32 ,
28+ page_idle_bitmap : std:: fs:: File ,
2729}
2830
2931impl Sampler {
3032 pub ( crate ) fn new ( parent_pid : i32 ) -> Result < Self , Error > {
31- Ok ( Self { parent_pid } )
33+ Ok ( Self {
34+ parent_pid,
35+ // See https://www.kernel.org/doc/html/latest/admin-guide/mm/idle_page_tracking.html
36+ page_idle_bitmap : std:: fs:: OpenOptions :: new ( )
37+ . read ( true )
38+ . write ( true )
39+ . open ( "/sys/kernel/mm/page_idle/bitmap" ) ?,
40+ } )
3241 }
3342
43+ #[ allow( clippy:: unused_async) ]
3444 pub ( crate ) async fn poll ( & mut self ) -> Result < ( ) , Error > {
3545 let page_size = page_size:: get ( ) ;
3646 let mut pfn_set = PfnSet :: new ( ) ;
@@ -47,7 +57,9 @@ impl Sampler {
4757 continue ; // page idle tracking is user mem only
4858 }
4959 debug ! ( "Memory region: {:#x} — {:#x}" , begin, end) ;
60+ #[ allow( clippy:: cast_possible_truncation) ]
5061 let begin = begin as usize / page_size;
62+ #[ allow( clippy:: cast_possible_truncation) ]
5163 let end = end as usize / page_size;
5264 for page in pagemap. get_range_info ( begin..end) ? {
5365 if let PageInfo :: MemoryPage ( memory_page_flags) = page {
@@ -61,23 +73,17 @@ impl Sampler {
6173
6274 let mut nb_pages = 0 ;
6375
64- // See https://www.kernel.org/doc/html/latest/admin-guide/mm/idle_page_tracking.html
65- let mut page_idle_bitmap = std:: fs:: OpenOptions :: new ( )
66- . read ( true )
67- . write ( true )
68- . open ( "/sys/kernel/mm/page_idle/bitmap" ) ?;
69-
7076 for ( pfn_block, pfn_bitset) in pfn_set {
71- page_idle_bitmap. seek ( SeekFrom :: Start ( pfn_block * 8 ) ) ?;
77+ self . page_idle_bitmap . seek ( SeekFrom :: Start ( pfn_block * 8 ) ) ?;
7278
7379 let mut buffer = [ 0 ; 8 ] ;
74- page_idle_bitmap. read_exact ( & mut buffer) ?;
80+ self . page_idle_bitmap . read_exact ( & mut buffer) ?;
7581 let bitset = u64:: from_ne_bytes ( buffer) ;
7682
7783 nb_pages += ( !bitset & pfn_bitset) . count_ones ( ) as usize ;
7884
79- page_idle_bitmap. seek ( SeekFrom :: Start ( pfn_block * 8 ) ) ?;
80- page_idle_bitmap. write_all ( & pfn_bitset. to_ne_bytes ( ) ) ?;
85+ self . page_idle_bitmap . seek ( SeekFrom :: Start ( pfn_block * 8 ) ) ?;
86+ self . page_idle_bitmap . write_all ( & pfn_bitset. to_ne_bytes ( ) ) ?;
8187 }
8288
8389 gauge ! ( "total_wss_bytes" ) . set ( ( nb_pages * page_size) as f64 ) ;
0 commit comments