@@ -32,8 +32,6 @@ enum Commands {
3232 Stop ,
3333 /// Show swap status information
3434 Status ,
35- /// List available compression algorithms
36- Compression ,
3735}
3836
3937/// Swap strategy based on filesystem detection
@@ -49,11 +47,17 @@ enum SwapMode {
4947fn main ( ) {
5048 let cli = Cli :: parse ( ) ;
5149
52- let result = match cli. command . unwrap_or ( Commands :: Status ) {
53- Commands :: Start => start ( ) ,
54- Commands :: Stop => stop ( false ) ,
55- Commands :: Status => status ( ) ,
56- Commands :: Compression => compression ( ) ,
50+ let result = match cli. command {
51+ Some ( Commands :: Start ) => start ( ) ,
52+ Some ( Commands :: Stop ) => stop ( false ) ,
53+ Some ( Commands :: Status ) => status ( ) ,
54+ None => {
55+ // No subcommand provided, show help
56+ use clap:: CommandFactory ;
57+ Cli :: command ( ) . print_help ( ) . ok ( ) ;
58+ println ! ( ) ;
59+ return ;
60+ }
5761 } ;
5862
5963 if let Err ( e) = result {
@@ -368,7 +372,7 @@ fn status() -> Result<(), Box<dyn std::error::Error>> {
368372 }
369373
370374 let swap_stats = get_mem_stats ( & [ "MemTotal" , "SwapTotal" , "SwapFree" ] ) ?;
371- let mem_total = swap_stats[ "MemTotal" ] ;
375+ let _mem_total = swap_stats[ "MemTotal" ] ;
372376 let swap_total = swap_stats[ "SwapTotal" ] ;
373377 let swap_used = swap_total - swap_stats[ "SwapFree" ] ;
374378
@@ -380,59 +384,50 @@ fn status() -> Result<(), Box<dyn std::error::Error>> {
380384 println ! ( " zpool: {}" , zswap. zpool) ;
381385 println ! ( " max_pool_percent: {}%" , zswap. max_pool_percent) ;
382386
383- if is_root && ( zswap. pool_size > 0 || zswap. stored_pages > 0 ) {
384- let page_size = get_page_size ( ) ;
385- let stored_bytes = zswap. stored_pages * page_size;
386- let ratio = zswap. compression_ratio ( page_size) ;
387- let pool_util = zswap. pool_utilization_percent ( mem_total) ;
388-
389- println ! ( ) ;
390- println ! ( " === Pool Statistics (debugfs) ===" ) ;
391- println ! ( " pool_size: {} ({:.1} MiB)" , zswap. pool_size, zswap. pool_size as f64 / 1024.0 / 1024.0 ) ;
392- println ! ( " stored_pages: {} ({:.1} MiB uncompressed)" , zswap. stored_pages, stored_bytes as f64 / 1024.0 / 1024.0 ) ;
393- println ! ( " pool_utilization: {}%" , pool_util) ;
394- println ! ( " compress_ratio: {:.0}%" , ratio * 100.0 ) ;
395- println ! ( " same_filled_pages: {}" , zswap. same_filled_pages) ;
396- println ! ( ) ;
397- println ! ( " === Writeback Statistics ===" ) ;
398- println ! ( " written_back_pages: {} ({:.1} MiB)" ,
399- zswap. written_back_pages,
400- ( zswap. written_back_pages * page_size) as f64 / 1024.0 / 1024.0 ) ;
401- println ! ( " pool_limit_hit: {}" , zswap. pool_limit_hit) ;
402- println ! ( " reject_reclaim_fail: {}" , zswap. reject_reclaim_fail) ;
403-
404- // Show effective swap usage
405- if swap_used > 0 {
406- let disk_used = swap_used. saturating_sub ( stored_bytes) ;
407- println ! ( ) ;
408- println ! ( " === Effective Swap Usage ===" ) ;
409- println ! ( " kernel_reported_used: {:.1} MiB" , swap_used as f64 / 1024.0 / 1024.0 ) ;
410- println ! ( " in_zswap_pool (RAM): {:.1} MiB" , stored_bytes as f64 / 1024.0 / 1024.0 ) ;
411- println ! ( " actual_disk_used: {:.1} MiB" , disk_used as f64 / 1024.0 / 1024.0 ) ;
412- let percent_in_ram = if swap_used > 0 {
413- ( stored_bytes as f64 / swap_used as f64 ) * 100.0
387+ // Try to get basic stats from /proc/meminfo (works without root!)
388+ if let Ok ( usage) = systemd_swap:: meminfo:: get_effective_swap_usage ( ) {
389+ if usage. zswap_active {
390+ let zswap_original = swap_used. saturating_sub ( usage. swap_used_disk ) ;
391+ let zswap_compressed = usage. zswap_pool_bytes ;
392+
393+ let ratio = if zswap_original > 0 {
394+ ( zswap_compressed as f64 / zswap_original as f64 ) * 100.0
414395 } else {
415396 0.0
416397 } ;
417- println ! ( " swap_in_ram: {:.0}%" , percent_in_ram) ;
418- }
419- } else if zswap. pool_size > 0 || zswap. stored_pages > 0 {
420- // Non-root, basic info only
421- let page_size = get_page_size ( ) ;
422- let stored_bytes = zswap. stored_pages * page_size;
423- let ratio = if zswap. stored_pages > 0 {
424- ( zswap. pool_size as f64 / stored_bytes as f64 ) * 100.0
425- } else {
426- 0.0
427- } ;
428398
429- println ! ( " pool_size: {} bytes" , zswap. pool_size) ;
430- println ! ( " stored_pages: {}" , zswap. stored_pages) ;
431- println ! ( " compress_ratio: {:.0}%" , ratio) ;
399+ println ! ( ) ;
400+ println ! ( " === Pool Statistics ===" ) ;
401+ println ! ( " pool_size: {:.1} MiB (compressed)" , zswap_compressed as f64 / 1024.0 / 1024.0 ) ;
402+ println ! ( " stored_data: {:.1} MiB (original)" , zswap_original as f64 / 1024.0 / 1024.0 ) ;
403+ println ! ( " pool_utilization: {}%" , usage. zswap_pool_percent) ;
404+ println ! ( " compress_ratio: {:.0}%" , ratio) ;
405+
406+ // If running as root, show additional debugfs stats
407+ if is_root && ( zswap. stored_pages > 0 || zswap. written_back_pages > 0 ) {
408+ let page_size = get_page_size ( ) ;
409+
410+ println ! ( ) ;
411+ println ! ( " === Writeback Statistics (debugfs) ===" ) ;
412+ println ! ( " stored_pages: {}" , zswap. stored_pages) ;
413+ println ! ( " same_filled_pages: {}" , zswap. same_filled_pages) ;
414+ println ! ( " written_back_pages: {} ({:.1} MiB)" ,
415+ zswap. written_back_pages,
416+ ( zswap. written_back_pages * page_size) as f64 / 1024.0 / 1024.0 ) ;
417+ println ! ( " pool_limit_hit: {}" , zswap. pool_limit_hit) ;
418+ println ! ( " reject_reclaim_fail: {}" , zswap. reject_reclaim_fail) ;
419+ }
432420
433- if swap_used > 0 {
434- let percent = ( stored_bytes as f64 / swap_used as f64 ) * 100.0 ;
435- println ! ( " zswap_store/swap_store: {}/{} ({:.0}%)" , stored_bytes, swap_used, percent) ;
421+ // Show effective swap usage
422+ if swap_used > 0 {
423+ println ! ( ) ;
424+ println ! ( " === Effective Swap Usage ===" ) ;
425+ println ! ( " kernel_reported_used: {:.1} MiB" , swap_used as f64 / 1024.0 / 1024.0 ) ;
426+ println ! ( " in_zswap_pool (RAM): {:.1} MiB" , zswap_original as f64 / 1024.0 / 1024.0 ) ;
427+ println ! ( " actual_disk_used: {:.1} MiB" , usage. swap_used_disk as f64 / 1024.0 / 1024.0 ) ;
428+ let percent_in_ram = ( zswap_original as f64 / swap_used as f64 ) * 100.0 ;
429+ println ! ( " swap_in_ram: {:.0}%" , percent_in_ram) ;
430+ }
436431 }
437432 }
438433 }
@@ -473,33 +468,3 @@ fn status() -> Result<(), Box<dyn std::error::Error>> {
473468 Ok ( ( ) )
474469}
475470
476- /// Show available compression algorithms
477- fn compression ( ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
478- let crypto = fs:: read_to_string ( "/proc/crypto" ) ?;
479-
480- print ! ( "Found loaded compression algorithms: " ) ;
481-
482- let mut first = true ;
483- let mut current_name = String :: new ( ) ;
484-
485- for line in crypto. lines ( ) {
486- let line = line. trim ( ) ;
487- if let Some ( name) = line. strip_prefix ( "name" ) {
488- current_name = name. trim_start_matches ( ':' ) . trim ( ) . to_string ( ) ;
489- } else if let Some ( typ) = line. strip_prefix ( "type" ) {
490- let current_type = typ. trim_start_matches ( ':' ) . trim ( ) ;
491-
492- if current_type == "compression" && !current_name. is_empty ( ) {
493- if first {
494- first = false ;
495- } else {
496- print ! ( ", " ) ;
497- }
498- print ! ( "{}" , current_name) ;
499- }
500- }
501- }
502-
503- println ! ( ) ;
504- Ok ( ( ) )
505- }
0 commit comments