xref: /aosp_15_r20/external/crosvm/common/balloon_control/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 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