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