@@ -40,11 +40,13 @@ void Zraminfo::init_offset(){
40
40
field_init (zram,table);
41
41
field_init (zram,mem_pool);
42
42
field_init (zram,comp);
43
+ field_init (zram,comps);
43
44
field_init (zram,disk);
44
45
field_init (zram,limit_pages);
45
46
field_init (zram,stats);
46
47
field_init (zram,disksize);
47
48
field_init (zram,compressor);
49
+ field_init (zram,comp_algs);
48
50
field_init (zram,claim);
49
51
struct_init (zram);
50
52
@@ -71,6 +73,8 @@ void Zraminfo::init_offset(){
71
73
field_init (zspage,huge);
72
74
struct_init (zspage);
73
75
76
+ field_init (zs_size_stat,objs);
77
+
74
78
field_init (zram_stats,compr_data_size);
75
79
field_init (zram_stats,num_reads);
76
80
field_init (zram_stats,num_writes);
@@ -165,7 +169,9 @@ bool Zraminfo::get_zspage(ulong page,struct zspage* zp){
165
169
return false ;
166
170
}
167
171
if (field_offset (zspage, huge) != -1 ){
168
- if (THIS_KERNEL_VERSION >= LINUX (6 , 6 , 0 )){
172
+ if (THIS_KERNEL_VERSION >= LINUX (6 , 12 , 0 )){
173
+ zs_magic = zp->v6_12 .magic ;
174
+ }else if (THIS_KERNEL_VERSION >= LINUX (6 , 6 , 0 )){
169
175
zs_magic = zp->v6_6 .magic ;
170
176
}else {
171
177
zs_magic = zp->v5_17 .magic ;
@@ -476,35 +482,46 @@ std::shared_ptr<size_class> Zraminfo::parser_size_class(ulong addr){
476
482
class_ptr->pages_per_zspage = INT (class_buf + field_offset (size_class,pages_per_zspage));
477
483
class_ptr->index = UINT (class_buf + field_offset (size_class,index ));
478
484
class_ptr->zspage_parser = false ;
479
- // fprintf(fp, "\nsize_class(%lx) objs_per_zspage:%d size:%d\n", addr,class_ptr->objs_per_zspage,class_ptr->size);
480
- read_struct (addr + field_offset (size_class,stats),&class_ptr->stats ,sizeof (struct zs_size_stat )," size_class_stats" );
481
485
FREEBUF (class_buf);
486
+ // fprintf(fp, "\nsize_class(%lx) objs_per_zspage:%d size:%d\n", addr,class_ptr->objs_per_zspage,class_ptr->size);
487
+ int stats_cnt = field_size (zs_size_stat,objs)/sizeof (unsigned long );
488
+ ulong stats_addr = addr + field_offset (size_class,stats);
489
+ for (size_t i = 0 ; i < stats_cnt; i++){
490
+ class_ptr->stats .push_back (read_ulong (stats_addr + i * sizeof (unsigned long ), " size_class_stats" ));
491
+ }
482
492
return class_ptr;
483
493
}
484
494
485
495
void Zraminfo::parser_zpage (std::shared_ptr<size_class> class_ptr){
486
496
for (size_t i = 0 ; i < group_cnt; i++){
487
497
ulong group_addr = class_ptr->addr + field_offset (size_class,fullness_list) + i * sizeof (struct kernel_list_head );
488
498
int offset = field_offset (zspage,list);
489
- std::vector<ulong> zspage_list = for_each_list (group_addr,offset) ;
490
- for (const auto & zspage_addr : zspage_list ) {
491
- class_ptr-> fullness_list [i] .push_back (parser_zpage (zspage_addr,class_ptr));
499
+ std::vector<std::shared_ptr<zpage>> zspage_list;
500
+ for (const auto & zspage_addr : for_each_list (group_addr,offset) ) {
501
+ zspage_list .push_back (parser_zpage (zspage_addr,class_ptr));
492
502
}
503
+ class_ptr->fullness_list .push_back (zspage_list);
493
504
}
494
505
class_ptr->zspage_parser = true ;
495
506
}
496
507
497
508
std::shared_ptr<zs_pool> Zraminfo::parser_mem_pool (ulong addr){
498
- if (!is_kvaddr (addr))return nullptr ;
509
+ if (!is_kvaddr (addr)){
510
+ return nullptr ;
511
+ }
499
512
void *pool_buf = read_struct (addr," zs_pool" );
500
513
if (pool_buf == nullptr ) return nullptr ;
501
514
std::shared_ptr<zs_pool> pool_ptr = std::make_shared<zs_pool>();
502
515
pool_ptr->addr = addr;
503
516
pool_ptr->name = read_cstring (ULONG (pool_buf + field_offset (zs_pool,name)),64 ," pool_name" );
504
517
// fprintf(fp, "zs_pool(%lx) pool_name:%s\n", addr,pool_ptr->name.c_str());
505
518
pool_ptr->pages_allocated = INT (pool_buf + field_offset (zs_pool,pages_allocated));
506
- pool_ptr->isolated_pages = INT (pool_buf + field_offset (zs_pool,isolated_pages));
507
- pool_ptr->destroying = BOOL (pool_buf + field_offset (zs_pool,destroying));
519
+ if (field_offset (zs_pool,isolated_pages) != -1 ){
520
+ pool_ptr->isolated_pages = INT (pool_buf + field_offset (zs_pool,isolated_pages));
521
+ }
522
+ if (field_offset (zs_pool,destroying) != -1 ){
523
+ pool_ptr->destroying = BOOL (pool_buf + field_offset (zs_pool,destroying));
524
+ }
508
525
read_struct (addr + field_offset (zs_pool,stats),&pool_ptr->stats ,sizeof (struct zs_pool_stats )," zs_pool_stats" );
509
526
int class_cnt = field_size (zs_pool,size_class)/sizeof (void *);
510
527
for (size_t i = 0 ; i < class_cnt; i++){
@@ -517,34 +534,64 @@ std::shared_ptr<zs_pool> Zraminfo::parser_mem_pool(ulong addr){
517
534
}
518
535
519
536
std::shared_ptr<zram> Zraminfo::parser_zram (ulong addr){
537
+ if (debug)fprintf (fp, " zram:%lx \n " ,addr);
520
538
void *zram_buf = read_struct (addr," zram" );
521
539
if (zram_buf == nullptr ) return nullptr ;
540
+ ulong pool_addr = ULONG (zram_buf + field_offset (zram,mem_pool));
541
+ if (!is_kvaddr (pool_addr))return nullptr ;
522
542
std::shared_ptr<zram> zram_ptr = std::make_shared<zram>();
523
543
zram_ptr->addr = addr;
524
544
zram_ptr->table = ULONG (zram_buf + field_offset (zram,table));
525
545
zram_ptr->mem_pool = parser_mem_pool (ULONG (zram_buf + field_offset (zram,mem_pool)));
526
- ulong zcomp_addr = ULONG (zram_buf + field_offset (zram,comp));
527
- ulong zcomp_name_addr = read_pointer (zcomp_addr + field_offset (zcomp,name)," zcomp_name_addr" );
528
- zram_ptr->zcomp_name = read_cstring (zcomp_name_addr,64 ," zcomp_name" );
546
+ if (field_offset (zram,comp) != -1 ){
547
+ ulong zcomp_addr = ULONG (zram_buf + field_offset (zram,comp));
548
+ if (is_kvaddr (zcomp_addr)){
549
+ ulong zcomp_name_addr = read_pointer (zcomp_addr + field_offset (zcomp,name)," zcomp_name_addr" );
550
+ if (is_kvaddr (zcomp_name_addr)){
551
+ zram_ptr->zcomp_name = read_cstring (zcomp_name_addr,64 ," zcomp_name" );
552
+ }
553
+ }
554
+ }else if (field_offset (zram,comps) != -1 ){
555
+ ulong zcomp_addr = ULONG (zram_buf + field_offset (zram,comps));
556
+ if (is_kvaddr (zcomp_addr)){
557
+ ulong zcomp_name_addr = read_pointer (zcomp_addr + field_offset (zcomp,name)," zcomp_name_addr" );
558
+ if (is_kvaddr (zcomp_name_addr)){
559
+ zram_ptr->zcomp_name = read_cstring (zcomp_name_addr,64 ," zcomp_name" );
560
+ }
561
+ }
562
+ }
529
563
ulong disk_name_addr = ULONG (zram_buf + field_offset (zram,disk)) + field_offset (gendisk,disk_name);
530
564
zram_ptr->disk_name = read_cstring (disk_name_addr,32 ," disk_name" );;
531
565
// fprintf(fp, "disk_name:%s\n", zram_ptr->disk_name.c_str());
532
- char compressor_name[128 ];
533
- memcpy (&compressor_name,(void *)zram_buf + field_offset (zram,compressor),128 );
534
- zram_ptr->compressor = extract_string (compressor_name);
535
- // std::cout << "compressor_name:" << zram_ptr->compressor << std::endl;
566
+ if (field_offset (zram,compressor) != -1 ){
567
+ char compressor_name[128 ];
568
+ memcpy (&compressor_name,(void *)zram_buf + field_offset (zram,compressor),128 );
569
+ zram_ptr->compressor = extract_string (compressor_name);
570
+ // std::cout << "compressor_name:" << zram_ptr->compressor << std::endl;
571
+ }else if (field_offset (zram,comp_algs) != -1 ){
572
+ ulong name_addr = ULONG (zram_buf + field_offset (zram,comp_algs));
573
+ if (is_kvaddr (name_addr)){
574
+ zram_ptr->compressor = read_cstring (name_addr, 64 , " compressor name" );
575
+ }
576
+ }
536
577
zram_ptr->limit_pages = ULONG (zram_buf + field_offset (zram,limit_pages));
537
578
zram_ptr->disksize = ULONGLONG (zram_buf + field_offset (zram,disksize));
538
579
zram_ptr->claim = BOOL (zram_buf + field_offset (zram,claim));
539
580
FREEBUF (zram_buf);
540
581
void *stats_buf = read_struct (addr + field_offset (zram,stats)," zram_stats" );
541
582
if (stats_buf == nullptr ) return nullptr ;
542
583
zram_ptr->stats .compr_data_size = ULONGLONG (stats_buf + field_offset (zram_stats,compr_data_size));
543
- zram_ptr->stats .num_reads = ULONGLONG (stats_buf + field_offset (zram_stats,num_reads));
544
- zram_ptr->stats .num_writes = ULONGLONG (stats_buf + field_offset (zram_stats,num_writes));
584
+ if (field_offset (zram_stats,num_reads) != -1 ){
585
+ zram_ptr->stats .num_reads = ULONGLONG (stats_buf + field_offset (zram_stats,num_reads));
586
+ }
587
+ if (field_offset (zram_stats,num_writes) != -1 ){
588
+ zram_ptr->stats .num_writes = ULONGLONG (stats_buf + field_offset (zram_stats,num_writes));
589
+ }
545
590
zram_ptr->stats .failed_reads = ULONGLONG (stats_buf + field_offset (zram_stats,failed_reads));
546
591
zram_ptr->stats .failed_writes = ULONGLONG (stats_buf + field_offset (zram_stats,failed_writes));
547
- zram_ptr->stats .invalid_io = ULONGLONG (stats_buf + field_offset (zram_stats,invalid_io));
592
+ if (field_offset (zram_stats,invalid_io) != -1 ){
593
+ zram_ptr->stats .invalid_io = ULONGLONG (stats_buf + field_offset (zram_stats,invalid_io));
594
+ }
548
595
zram_ptr->stats .notify_free = ULONGLONG (stats_buf + field_offset (zram_stats,notify_free));
549
596
zram_ptr->stats .same_pages = ULONGLONG (stats_buf + field_offset (zram_stats,same_pages));
550
597
zram_ptr->stats .huge_pages = ULONGLONG (stats_buf + field_offset (zram_stats,huge_pages));
0 commit comments