vmm/devices/virtio/balloon/
mod.rs1pub mod device;
7mod event_handler;
8pub mod metrics;
9pub mod persist;
10pub mod test_utils;
11mod util;
12
13use log::error;
14
15pub use self::device::{Balloon, BalloonConfig, BalloonStats};
16use super::queue::{InvalidAvailIdx, QueueError};
17use crate::devices::virtio::balloon::metrics::METRICS;
18use crate::devices::virtio::queue::FIRECRACKER_MAX_QUEUE_SIZE;
19use crate::logger::IncMetric;
20use crate::vstate::interrupts::InterruptError;
21
22pub const BALLOON_DEV_ID: &str = "balloon";
25pub const BALLOON_CONFIG_SPACE_SIZE: usize = 12;
27pub const BALLOON_MIN_NUM_QUEUES: usize = 2;
29pub const BALLOON_QUEUE_SIZE: u16 = FIRECRACKER_MAX_QUEUE_SIZE;
31pub const MIB_TO_4K_PAGES: u32 = 256;
33pub const MAX_PAGES_IN_DESC: usize = 256;
35pub const MAX_PAGE_COMPACT_BUFFER: usize = 2048;
38pub const VIRTIO_BALLOON_PFN_SHIFT: u32 = 12;
40pub const INFLATE_INDEX: usize = 0;
42pub const DEFLATE_INDEX: usize = 1;
44pub const STATS_INDEX: usize = 2;
46
47pub const FREE_PAGE_HINT_STOP: u32 = 0;
49pub const FREE_PAGE_HINT_DONE: u32 = 1;
51
52const VIRTIO_BALLOON_F_STATS_VQ: u32 = 1; const VIRTIO_BALLOON_F_DEFLATE_ON_OOM: u32 = 2; const VIRTIO_BALLOON_F_FREE_PAGE_HINTING: u32 = 3; const VIRTIO_BALLOON_F_FREE_PAGE_REPORTING: u32 = 5; const VIRTIO_BALLOON_S_SWAP_IN: u16 = 0;
60const VIRTIO_BALLOON_S_SWAP_OUT: u16 = 1;
61const VIRTIO_BALLOON_S_MAJFLT: u16 = 2;
62const VIRTIO_BALLOON_S_MINFLT: u16 = 3;
63const VIRTIO_BALLOON_S_MEMFREE: u16 = 4;
64const VIRTIO_BALLOON_S_MEMTOT: u16 = 5;
65const VIRTIO_BALLOON_S_AVAIL: u16 = 6;
66const VIRTIO_BALLOON_S_CACHES: u16 = 7;
67const VIRTIO_BALLOON_S_HTLB_PGALLOC: u16 = 8;
68const VIRTIO_BALLOON_S_HTLB_PGFAIL: u16 = 9;
69const VIRTIO_BALLOON_S_OOM_KILL: u16 = 10;
70const VIRTIO_BALLOON_S_ALLOC_STALL: u16 = 11;
71const VIRTIO_BALLOON_S_ASYNC_SCAN: u16 = 12;
72const VIRTIO_BALLOON_S_DIRECT_SCAN: u16 = 13;
73const VIRTIO_BALLOON_S_ASYNC_RECLAIM: u16 = 14;
74const VIRTIO_BALLOON_S_DIRECT_RECLAIM: u16 = 15;
75
76#[derive(Debug, thiserror::Error, displaydoc::Display)]
78pub enum BalloonError {
79 DeviceNotActive,
81 HintingNotEnabled,
83 EventFd(std::io::Error),
85 InterruptError(InterruptError),
87 MalformedDescriptor,
89 MalformedPayload,
91 QueueRestoreError,
93 StatisticsDisabled,
95 StatisticsStateChange,
97 TooMuchMemoryRequested(u32),
99 Queue(#[from] QueueError),
101 InvalidAvailIdx(#[from] InvalidAvailIdx),
103 Timer(std::io::Error),
105}
106
107#[derive(Debug, thiserror::Error, displaydoc::Display)]
108pub enum RemoveRegionError {
109 AddressTranslation,
111 MalformedRange,
113 MadviseFail(std::io::Error),
115 MmapFail(std::io::Error),
117 RegionNotFound,
119}
120
121pub(super) fn report_balloon_event_fail(err: BalloonError) {
122 if let BalloonError::InvalidAvailIdx(err) = err {
123 panic!("{}", err);
124 }
125 error!("{:?}", err);
126 METRICS.event_fails.inc();
127}