1use serde::Serialize;
6use {fidl_fuchsia_kernel as fkernel, fidl_fuchsia_memory_attribution_plugin as fplugin};
7
8#[derive(Serialize)]
9#[serde(remote = "fkernel::MemoryStats")]
10pub struct MemoryStatsDef {
11 pub total_bytes: Option<u64>,
12 pub free_bytes: Option<u64>,
13 pub wired_bytes: Option<u64>,
14 pub total_heap_bytes: Option<u64>,
15 pub free_heap_bytes: Option<u64>,
16 pub vmo_bytes: Option<u64>,
17 pub mmu_overhead_bytes: Option<u64>,
18 pub ipc_bytes: Option<u64>,
19 pub other_bytes: Option<u64>,
20 pub free_loaned_bytes: Option<u64>,
21 pub cache_bytes: Option<u64>,
22 pub slab_bytes: Option<u64>,
23 pub zram_bytes: Option<u64>,
24 pub vmo_reclaim_total_bytes: Option<u64>,
25 pub vmo_reclaim_newest_bytes: Option<u64>,
26 pub vmo_reclaim_oldest_bytes: Option<u64>,
27 pub vmo_reclaim_disabled_bytes: Option<u64>,
28 pub vmo_discardable_locked_bytes: Option<u64>,
29 pub vmo_discardable_unlocked_bytes: Option<u64>,
30 #[doc(hidden)]
31 #[serde(skip_serializing)]
32 pub __source_breaking: fidl::marker::SourceBreaking,
33}
34#[derive(Serialize)]
35#[serde(remote = "fkernel::MemoryStatsCompression")]
36pub struct MemoryStatsCompressionDef {
37 pub uncompressed_storage_bytes: Option<u64>,
38 pub compressed_storage_bytes: Option<u64>,
39 pub compressed_fragmentation_bytes: Option<u64>,
40 pub compression_time: Option<i64>,
41 pub decompression_time: Option<i64>,
42 pub total_page_compression_attempts: Option<u64>,
43 pub failed_page_compression_attempts: Option<u64>,
44 pub total_page_decompressions: Option<u64>,
45 pub compressed_page_evictions: Option<u64>,
46 pub eager_page_compressions: Option<u64>,
47 pub memory_pressure_page_compressions: Option<u64>,
48 pub critical_memory_page_compressions: Option<u64>,
49 pub pages_decompressed_unit_ns: Option<u64>,
50 pub pages_decompressed_within_log_time: Option<[u64; 8]>,
51 #[doc(hidden)]
52 #[serde(skip_serializing)]
53 pub __source_breaking: fidl::marker::SourceBreaking,
54}
55
56#[derive(Default, PartialEq, Debug, Clone, Serialize)]
57pub struct KernelStatistics {
58 #[serde(with = "MemoryStatsDef")]
59 pub memory_statistics: fkernel::MemoryStats,
60 #[serde(with = "MemoryStatsCompressionDef")]
61 pub compression_statistics: fkernel::MemoryStatsCompression,
62}
63
64impl From<fplugin::KernelStatistics> for KernelStatistics {
65 fn from(value: fplugin::KernelStatistics) -> KernelStatistics {
66 KernelStatistics {
67 memory_statistics: value.memory_stats.unwrap(),
68 compression_statistics: value.compression_stats.unwrap(),
69 }
70 }
71}
72
73impl Into<fplugin::KernelStatistics> for KernelStatistics {
74 fn into(self) -> fplugin::KernelStatistics {
75 fplugin::KernelStatistics {
76 memory_stats: Some(self.memory_statistics),
77 compression_stats: Some(self.compression_statistics),
78 ..Default::default()
79 }
80 }
81}
82
83#[cfg(test)]
84mod test {
85 use super::*;
86
87 #[test]
88 fn test_convert() {
89 let fplugin_kernel_statistics = fplugin::KernelStatistics {
90 memory_stats: Some(fidl_fuchsia_kernel::MemoryStats {
91 total_bytes: Some(1),
92 free_bytes: Some(2),
93 free_loaned_bytes: Some(3),
94 wired_bytes: Some(4),
95 total_heap_bytes: Some(5),
96 free_heap_bytes: Some(6),
97 vmo_bytes: Some(7),
98 mmu_overhead_bytes: Some(8),
99 ipc_bytes: Some(9),
100 cache_bytes: Some(10),
101 slab_bytes: Some(11),
102 zram_bytes: Some(12),
103 other_bytes: Some(13),
104 vmo_reclaim_total_bytes: Some(14),
105 vmo_reclaim_newest_bytes: Some(15),
106 vmo_reclaim_oldest_bytes: Some(16),
107 vmo_reclaim_disabled_bytes: Some(17),
108 vmo_discardable_locked_bytes: Some(18),
109 vmo_discardable_unlocked_bytes: Some(19),
110 ..Default::default()
111 }),
112 compression_stats: Some(fidl_fuchsia_kernel::MemoryStatsCompression {
113 uncompressed_storage_bytes: Some(15),
114 compressed_storage_bytes: Some(16),
115 compressed_fragmentation_bytes: Some(17),
116 compression_time: Some(18),
117 decompression_time: Some(19),
118 total_page_compression_attempts: Some(20),
119 failed_page_compression_attempts: Some(21),
120 total_page_decompressions: Some(22),
121 compressed_page_evictions: Some(23),
122 eager_page_compressions: Some(24),
123 memory_pressure_page_compressions: Some(25),
124 critical_memory_page_compressions: Some(26),
125 pages_decompressed_unit_ns: Some(27),
126 pages_decompressed_within_log_time: Some([0, 1, 2, 3, 4, 5, 6, 7]),
127 ..Default::default()
128 }),
129 ..Default::default()
130 };
131
132 let kernel_statistics: KernelStatistics = fplugin_kernel_statistics.clone().into();
133
134 assert_eq!(kernel_statistics.memory_statistics.total_bytes, Some(1));
135 assert_eq!(kernel_statistics.memory_statistics.free_bytes, Some(2));
136
137 assert_eq!(kernel_statistics.compression_statistics.uncompressed_storage_bytes, Some(15));
138
139 assert_eq!(fplugin_kernel_statistics, kernel_statistics.into());
140 }
141}