xref: /aosp_15_r20/external/crosvm/swap/src/lib.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2022 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker 
5*bb4ee6a4SAndroid Build Coastguard Worker //! crate for the vmm-swap feature.
6*bb4ee6a4SAndroid Build Coastguard Worker 
7*bb4ee6a4SAndroid Build Coastguard Worker #![deny(missing_docs)]
8*bb4ee6a4SAndroid Build Coastguard Worker 
9*bb4ee6a4SAndroid Build Coastguard Worker cfg_if::cfg_if! {
10*bb4ee6a4SAndroid Build Coastguard Worker     if #[cfg(all(unix, feature = "enable"))] {
11*bb4ee6a4SAndroid Build Coastguard Worker         mod controller;
12*bb4ee6a4SAndroid Build Coastguard Worker         mod file;
13*bb4ee6a4SAndroid Build Coastguard Worker         mod file_truncator;
14*bb4ee6a4SAndroid Build Coastguard Worker         mod pagesize;
15*bb4ee6a4SAndroid Build Coastguard Worker         mod present_list;
16*bb4ee6a4SAndroid Build Coastguard Worker         // this is public only for integration tests.
17*bb4ee6a4SAndroid Build Coastguard Worker         pub mod page_handler;
18*bb4ee6a4SAndroid Build Coastguard Worker         mod processes;
19*bb4ee6a4SAndroid Build Coastguard Worker         mod staging;
20*bb4ee6a4SAndroid Build Coastguard Worker         mod uffd_list;
21*bb4ee6a4SAndroid Build Coastguard Worker         // this is public only for integration tests.
22*bb4ee6a4SAndroid Build Coastguard Worker         pub mod userfaultfd;
23*bb4ee6a4SAndroid Build Coastguard Worker         // this is public only for integration tests.
24*bb4ee6a4SAndroid Build Coastguard Worker         pub mod worker;
25*bb4ee6a4SAndroid Build Coastguard Worker 
26*bb4ee6a4SAndroid Build Coastguard Worker         pub use crate::controller::SwapDeviceHelper;
27*bb4ee6a4SAndroid Build Coastguard Worker         pub use crate::controller::PrepareFork;
28*bb4ee6a4SAndroid Build Coastguard Worker         pub use crate::controller::SwapController;
29*bb4ee6a4SAndroid Build Coastguard Worker         pub use crate::controller::SwapDeviceUffdSender;
30*bb4ee6a4SAndroid Build Coastguard Worker     }
31*bb4ee6a4SAndroid Build Coastguard Worker }
32*bb4ee6a4SAndroid Build Coastguard Worker 
33*bb4ee6a4SAndroid Build Coastguard Worker use serde::Deserialize;
34*bb4ee6a4SAndroid Build Coastguard Worker use serde::Serialize;
35*bb4ee6a4SAndroid Build Coastguard Worker 
36*bb4ee6a4SAndroid Build Coastguard Worker /// Current state of vmm-swap.
37*bb4ee6a4SAndroid Build Coastguard Worker ///
38*bb4ee6a4SAndroid Build Coastguard Worker /// This should not contain fields but be a plain enum because this will be displayed to user using
39*bb4ee6a4SAndroid Build Coastguard Worker /// `serde_json` crate.
40*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
41*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq)]
42*bb4ee6a4SAndroid Build Coastguard Worker pub enum SwapState {
43*bb4ee6a4SAndroid Build Coastguard Worker     /// vmm-swap is ready. userfaultfd is disabled until vmm-swap is enabled.
44*bb4ee6a4SAndroid Build Coastguard Worker     Ready = 0,
45*bb4ee6a4SAndroid Build Coastguard Worker     /// swap out failed.
46*bb4ee6a4SAndroid Build Coastguard Worker     Failed = 1,
47*bb4ee6a4SAndroid Build Coastguard Worker     /// Pages in guest memory are moved to the staging memory.
48*bb4ee6a4SAndroid Build Coastguard Worker     Pending = 2,
49*bb4ee6a4SAndroid Build Coastguard Worker     /// Trimming staging memory.
50*bb4ee6a4SAndroid Build Coastguard Worker     TrimInProgress = 3,
51*bb4ee6a4SAndroid Build Coastguard Worker     /// swap-out is in progress.
52*bb4ee6a4SAndroid Build Coastguard Worker     SwapOutInProgress = 4,
53*bb4ee6a4SAndroid Build Coastguard Worker     /// swap out succeeded.
54*bb4ee6a4SAndroid Build Coastguard Worker     Active = 5,
55*bb4ee6a4SAndroid Build Coastguard Worker     /// swap-in is in progress.
56*bb4ee6a4SAndroid Build Coastguard Worker     SwapInInProgress = 6,
57*bb4ee6a4SAndroid Build Coastguard Worker }
58*bb4ee6a4SAndroid Build Coastguard Worker 
59*bb4ee6a4SAndroid Build Coastguard Worker /// Latency and number of pages of swap operations (move to staging, swap out, swap in).
60*bb4ee6a4SAndroid Build Coastguard Worker ///
61*bb4ee6a4SAndroid Build Coastguard Worker /// The meaning of `StateTransition` depends on `State`.
62*bb4ee6a4SAndroid Build Coastguard Worker ///
63*bb4ee6a4SAndroid Build Coastguard Worker /// | `State`             | `StateTransition`                            |
64*bb4ee6a4SAndroid Build Coastguard Worker /// |---------------------|----------------------------------------------|
65*bb4ee6a4SAndroid Build Coastguard Worker /// | `Ready`             | empty or transition record of `swap disable` |
66*bb4ee6a4SAndroid Build Coastguard Worker /// | `Pending`           | transition record of `swap enable`           |
67*bb4ee6a4SAndroid Build Coastguard Worker /// | `SwapOutInProgress` | transition record of `swap out`              |
68*bb4ee6a4SAndroid Build Coastguard Worker /// | `Active`            | transition record of `swap out`              |
69*bb4ee6a4SAndroid Build Coastguard Worker /// | `SwapInInProgress`  | transition record of `swap disable`          |
70*bb4ee6a4SAndroid Build Coastguard Worker /// | `Failed`            | empty                                        |
71*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
72*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Serialize, Deserialize, Debug, Clone, Copy, Default)]
73*bb4ee6a4SAndroid Build Coastguard Worker pub struct SwapStateTransition {
74*bb4ee6a4SAndroid Build Coastguard Worker     /// The number of pages moved for the state transition.
75*bb4ee6a4SAndroid Build Coastguard Worker     pub pages: u64,
76*bb4ee6a4SAndroid Build Coastguard Worker     /// Time taken for the state transition.
77*bb4ee6a4SAndroid Build Coastguard Worker     pub time_ms: u64,
78*bb4ee6a4SAndroid Build Coastguard Worker }
79*bb4ee6a4SAndroid Build Coastguard Worker 
80*bb4ee6a4SAndroid Build Coastguard Worker /// Current metrics of vmm-swap.
81*bb4ee6a4SAndroid Build Coastguard Worker ///
82*bb4ee6a4SAndroid Build Coastguard Worker /// This is only available while vmm-swap is enabled.
83*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
84*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Serialize, Deserialize, Debug, Clone, Copy, Default)]
85*bb4ee6a4SAndroid Build Coastguard Worker pub struct SwapMetrics {
86*bb4ee6a4SAndroid Build Coastguard Worker     /// count of pages on RAM.
87*bb4ee6a4SAndroid Build Coastguard Worker     pub resident_pages: u64,
88*bb4ee6a4SAndroid Build Coastguard Worker     /// count of pages copied from the vmm-swap file.
89*bb4ee6a4SAndroid Build Coastguard Worker     pub copied_from_file_pages: u64,
90*bb4ee6a4SAndroid Build Coastguard Worker     /// count of pages copied from the staging memory.
91*bb4ee6a4SAndroid Build Coastguard Worker     pub copied_from_staging_pages: u64,
92*bb4ee6a4SAndroid Build Coastguard Worker     /// count of pages initialized with zero.
93*bb4ee6a4SAndroid Build Coastguard Worker     pub zeroed_pages: u64,
94*bb4ee6a4SAndroid Build Coastguard Worker     /// count of pages which were already initialized on page faults. This can happen when several
95*bb4ee6a4SAndroid Build Coastguard Worker     /// threads/processes access the uninitialized/removed page at the same time.
96*bb4ee6a4SAndroid Build Coastguard Worker     pub redundant_pages: u64,
97*bb4ee6a4SAndroid Build Coastguard Worker     /// count of pages in staging memory.
98*bb4ee6a4SAndroid Build Coastguard Worker     pub staging_pages: u64,
99*bb4ee6a4SAndroid Build Coastguard Worker     /// count of pages in swap files.
100*bb4ee6a4SAndroid Build Coastguard Worker     pub swap_pages: u64,
101*bb4ee6a4SAndroid Build Coastguard Worker }
102*bb4ee6a4SAndroid Build Coastguard Worker 
103*bb4ee6a4SAndroid Build Coastguard Worker /// The response to `crosvm swap status` command.
104*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
105*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Serialize, Deserialize, Debug, Clone, Copy)]
106*bb4ee6a4SAndroid Build Coastguard Worker pub struct SwapStatus {
107*bb4ee6a4SAndroid Build Coastguard Worker     /// Current vmm-swap [SwapState].
108*bb4ee6a4SAndroid Build Coastguard Worker     pub state: SwapState,
109*bb4ee6a4SAndroid Build Coastguard Worker     /// Current [SwapMetrics] of vmm-swap.
110*bb4ee6a4SAndroid Build Coastguard Worker     pub metrics: SwapMetrics,
111*bb4ee6a4SAndroid Build Coastguard Worker     /// Latency and number of pages for current [SwapState]. See [SwapStateTransition] for details.
112*bb4ee6a4SAndroid Build Coastguard Worker     pub state_transition: SwapStateTransition,
113*bb4ee6a4SAndroid Build Coastguard Worker }
114*bb4ee6a4SAndroid Build Coastguard Worker 
115*bb4ee6a4SAndroid Build Coastguard Worker impl SwapStatus {
116*bb4ee6a4SAndroid Build Coastguard Worker     /// Creates dummy [SwapStatus].
dummy() -> Self117*bb4ee6a4SAndroid Build Coastguard Worker     pub fn dummy() -> Self {
118*bb4ee6a4SAndroid Build Coastguard Worker         SwapStatus {
119*bb4ee6a4SAndroid Build Coastguard Worker             state: SwapState::Pending,
120*bb4ee6a4SAndroid Build Coastguard Worker             metrics: SwapMetrics::default(),
121*bb4ee6a4SAndroid Build Coastguard Worker             state_transition: SwapStateTransition::default(),
122*bb4ee6a4SAndroid Build Coastguard Worker         }
123*bb4ee6a4SAndroid Build Coastguard Worker     }
124*bb4ee6a4SAndroid Build Coastguard Worker }
125