attribution_processing/
kernel_statistics.rs

1// Copyright 2025 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use 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}