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 use serde::Deserialize; 6*bb4ee6a4SAndroid Build Coastguard Worker use serde::Serialize; 7*bb4ee6a4SAndroid Build Coastguard Worker 8*bb4ee6a4SAndroid Build Coastguard Worker // Balloon commands that are send on the balloon command tube. 9*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Serialize, Deserialize, Debug)] 10*bb4ee6a4SAndroid Build Coastguard Worker pub enum BalloonTubeCommand { 11*bb4ee6a4SAndroid Build Coastguard Worker // Set the size of the VM's balloon. 12*bb4ee6a4SAndroid Build Coastguard Worker Adjust { 13*bb4ee6a4SAndroid Build Coastguard Worker num_bytes: u64, 14*bb4ee6a4SAndroid Build Coastguard Worker // When this flag is set, adjust attempts can fail. After adjustment, the final 15*bb4ee6a4SAndroid Build Coastguard Worker // size of the balloon is returned via a BalloonTubeResult::Adjust message. 16*bb4ee6a4SAndroid Build Coastguard Worker // 17*bb4ee6a4SAndroid Build Coastguard Worker // The flag changes the semantics of inflating the balloon. By default, the driver 18*bb4ee6a4SAndroid Build Coastguard Worker // will indefinitely retry if it fails to allocate pages when inflating the 19*bb4ee6a4SAndroid Build Coastguard Worker // balloon. However, when this flag is set, the balloon device responds to page 20*bb4ee6a4SAndroid Build Coastguard Worker // allocation failures in the guest by stopping inflation at the balloon's current 21*bb4ee6a4SAndroid Build Coastguard Worker // size. 22*bb4ee6a4SAndroid Build Coastguard Worker allow_failure: bool, 23*bb4ee6a4SAndroid Build Coastguard Worker }, 24*bb4ee6a4SAndroid Build Coastguard Worker // Fetch balloon stats. 25*bb4ee6a4SAndroid Build Coastguard Worker Stats, 26*bb4ee6a4SAndroid Build Coastguard Worker // Fetch balloon ws. 27*bb4ee6a4SAndroid Build Coastguard Worker WorkingSet, 28*bb4ee6a4SAndroid Build Coastguard Worker // Send balloon ws config to guest. 29*bb4ee6a4SAndroid Build Coastguard Worker WorkingSetConfig { 30*bb4ee6a4SAndroid Build Coastguard Worker bins: Vec<u32>, 31*bb4ee6a4SAndroid Build Coastguard Worker refresh_threshold: u32, 32*bb4ee6a4SAndroid Build Coastguard Worker report_threshold: u32, 33*bb4ee6a4SAndroid Build Coastguard Worker }, 34*bb4ee6a4SAndroid Build Coastguard Worker } 35*bb4ee6a4SAndroid Build Coastguard Worker 36*bb4ee6a4SAndroid Build Coastguard Worker // BalloonStats holds stats returned from the stats_queue. 37*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Default, Serialize, Deserialize, Debug, Clone)] 38*bb4ee6a4SAndroid Build Coastguard Worker pub struct BalloonStats { 39*bb4ee6a4SAndroid Build Coastguard Worker pub swap_in: Option<u64>, 40*bb4ee6a4SAndroid Build Coastguard Worker pub swap_out: Option<u64>, 41*bb4ee6a4SAndroid Build Coastguard Worker pub major_faults: Option<u64>, 42*bb4ee6a4SAndroid Build Coastguard Worker pub minor_faults: Option<u64>, 43*bb4ee6a4SAndroid Build Coastguard Worker pub free_memory: Option<u64>, 44*bb4ee6a4SAndroid Build Coastguard Worker pub total_memory: Option<u64>, 45*bb4ee6a4SAndroid Build Coastguard Worker pub available_memory: Option<u64>, 46*bb4ee6a4SAndroid Build Coastguard Worker pub disk_caches: Option<u64>, 47*bb4ee6a4SAndroid Build Coastguard Worker pub hugetlb_allocations: Option<u64>, 48*bb4ee6a4SAndroid Build Coastguard Worker pub hugetlb_failures: Option<u64>, 49*bb4ee6a4SAndroid Build Coastguard Worker pub shared_memory: Option<u64>, 50*bb4ee6a4SAndroid Build Coastguard Worker pub unevictable_memory: Option<u64>, 51*bb4ee6a4SAndroid Build Coastguard Worker } 52*bb4ee6a4SAndroid Build Coastguard Worker 53*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_BALLOON_WS_MIN_NUM_BINS: usize = 2; 54*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_BALLOON_WS_MAX_NUM_BINS: usize = 16; 55*bb4ee6a4SAndroid Build Coastguard Worker 56*bb4ee6a4SAndroid Build Coastguard Worker // WSBucket stores information about a bucket (or bin) of the working set. 57*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Default, Serialize, Deserialize, Debug, Clone, Copy)] 58*bb4ee6a4SAndroid Build Coastguard Worker pub struct WSBucket { 59*bb4ee6a4SAndroid Build Coastguard Worker pub age: u64, 60*bb4ee6a4SAndroid Build Coastguard Worker pub bytes: [u64; 2], 61*bb4ee6a4SAndroid Build Coastguard Worker } 62*bb4ee6a4SAndroid Build Coastguard Worker 63*bb4ee6a4SAndroid Build Coastguard Worker // BalloonWS holds WS returned from the ws_queue. 64*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Default, Serialize, Deserialize, Debug, Clone)] 65*bb4ee6a4SAndroid Build Coastguard Worker pub struct BalloonWS { 66*bb4ee6a4SAndroid Build Coastguard Worker /// working set, separated per histogram bucket. 67*bb4ee6a4SAndroid Build Coastguard Worker pub ws: Vec<WSBucket>, 68*bb4ee6a4SAndroid Build Coastguard Worker } 69*bb4ee6a4SAndroid Build Coastguard Worker 70*bb4ee6a4SAndroid Build Coastguard Worker impl BalloonWS { new() -> Self71*bb4ee6a4SAndroid Build Coastguard Worker pub fn new() -> Self { 72*bb4ee6a4SAndroid Build Coastguard Worker BalloonWS { ws: vec![] } 73*bb4ee6a4SAndroid Build Coastguard Worker } 74*bb4ee6a4SAndroid Build Coastguard Worker } 75*bb4ee6a4SAndroid Build Coastguard Worker 76*bb4ee6a4SAndroid Build Coastguard Worker // BalloonTubeResult are results to BalloonTubeCommand defined above. 77*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Serialize, Deserialize, Debug)] 78*bb4ee6a4SAndroid Build Coastguard Worker pub enum BalloonTubeResult { 79*bb4ee6a4SAndroid Build Coastguard Worker Stats { 80*bb4ee6a4SAndroid Build Coastguard Worker stats: BalloonStats, 81*bb4ee6a4SAndroid Build Coastguard Worker balloon_actual: u64, 82*bb4ee6a4SAndroid Build Coastguard Worker }, 83*bb4ee6a4SAndroid Build Coastguard Worker Adjusted { 84*bb4ee6a4SAndroid Build Coastguard Worker num_bytes: u64, 85*bb4ee6a4SAndroid Build Coastguard Worker }, 86*bb4ee6a4SAndroid Build Coastguard Worker WorkingSet { 87*bb4ee6a4SAndroid Build Coastguard Worker ws: BalloonWS, 88*bb4ee6a4SAndroid Build Coastguard Worker /// size of the balloon in bytes. 89*bb4ee6a4SAndroid Build Coastguard Worker balloon_actual: u64, 90*bb4ee6a4SAndroid Build Coastguard Worker }, 91*bb4ee6a4SAndroid Build Coastguard Worker } 92