dbs_address_space/memory/
mod.rs1use std::str::FromStr;
14use std::sync::Arc;
15use vm_memory::{GuestAddressSpace, GuestMemoryAtomic, GuestMemoryLoadGuard, GuestMemoryMmap};
16
17mod raw_region;
18pub use raw_region::GuestRegionRaw;
19
20mod hybrid;
21pub use hybrid::{GuestMemoryHybrid, GuestRegionHybrid};
22
23#[derive(Debug, Eq, PartialEq)]
25pub enum MemorySourceType {
26 FileOnHugeTlbFs,
28 MmapAnonymous,
30 MmapAnonymousHugeTlbFs,
32 MemFdShared,
34 MemFdOnHugeTlbFs,
36}
37
38impl MemorySourceType {
39 pub fn is_hugepage(&self) -> bool {
41 *self == Self::FileOnHugeTlbFs
42 || *self == Self::MmapAnonymousHugeTlbFs
43 || *self == Self::MemFdOnHugeTlbFs
44 }
45
46 pub fn is_mmap_anonymous(&self) -> bool {
48 *self == Self::MmapAnonymous || *self == Self::MmapAnonymousHugeTlbFs
49 }
50}
51
52impl FromStr for MemorySourceType {
53 type Err = String;
54
55 fn from_str(s: &str) -> Result<Self, Self::Err> {
56 match s {
57 "hugetlbfs" => Ok(MemorySourceType::FileOnHugeTlbFs),
58 "memfd" => Ok(MemorySourceType::MemFdShared),
59 "shmem" => Ok(MemorySourceType::MemFdShared),
60 "hugememfd" => Ok(MemorySourceType::MemFdOnHugeTlbFs),
61 "hugeshmem" => Ok(MemorySourceType::MemFdOnHugeTlbFs),
62 "anon" => Ok(MemorySourceType::MmapAnonymous),
63 "mmap" => Ok(MemorySourceType::MmapAnonymous),
64 "hugeanon" => Ok(MemorySourceType::MmapAnonymousHugeTlbFs),
65 "hugemmap" => Ok(MemorySourceType::MmapAnonymousHugeTlbFs),
66 _ => Err(format!("unknown memory source type {s}")),
67 }
68 }
69}
70
71#[derive(Debug, Default)]
72struct GuestMemoryHotplugManager {}
73
74#[allow(unused)]
84#[derive(Debug, Clone)]
85pub struct GuestMemoryManager {
86 default: GuestMemoryAtomic<GuestMemoryHybrid>,
87 hybrid: GuestMemoryAtomic<GuestMemoryHybrid>,
89 iommu: GuestMemoryAtomic<GuestMemoryHybrid>,
91 normal: GuestMemoryAtomic<GuestMemoryMmap>,
93 hotplug: Arc<GuestMemoryHotplugManager>,
94}
95
96impl GuestMemoryManager {
97 pub fn new() -> Self {
99 Self::default()
100 }
101
102 pub fn get_normal_guest_memory(&self) -> &GuestMemoryAtomic<GuestMemoryMmap> {
104 &self.normal
105 }
106
107 pub fn to_manager<AS: GuestAddressSpace>(_m: &AS) -> Option<&Self> {
109 None
110 }
111}
112
113impl Default for GuestMemoryManager {
114 fn default() -> Self {
115 let hybrid = GuestMemoryAtomic::new(GuestMemoryHybrid::new());
116 let iommu = GuestMemoryAtomic::new(GuestMemoryHybrid::new());
117 let normal = GuestMemoryAtomic::new(GuestMemoryMmap::new());
118 let default = hybrid.clone();
120
121 GuestMemoryManager {
122 default,
123 hybrid,
124 iommu,
125 normal,
126 hotplug: Arc::new(GuestMemoryHotplugManager::default()),
127 }
128 }
129}
130
131impl GuestAddressSpace for GuestMemoryManager {
132 type M = GuestMemoryHybrid;
133 type T = GuestMemoryLoadGuard<GuestMemoryHybrid>;
134
135 fn memory(&self) -> Self::T {
136 self.default.memory()
137 }
138}
139
140#[cfg(test)]
141mod tests {
142 use super::*;
143
144 #[test]
145 fn test_memory_source_type() {
146 assert_eq!(
147 MemorySourceType::from_str("hugetlbfs").unwrap(),
148 MemorySourceType::FileOnHugeTlbFs
149 );
150 assert_eq!(
151 MemorySourceType::from_str("memfd").unwrap(),
152 MemorySourceType::MemFdShared
153 );
154 assert_eq!(
155 MemorySourceType::from_str("shmem").unwrap(),
156 MemorySourceType::MemFdShared
157 );
158 assert_eq!(
159 MemorySourceType::from_str("hugememfd").unwrap(),
160 MemorySourceType::MemFdOnHugeTlbFs
161 );
162 assert_eq!(
163 MemorySourceType::from_str("hugeshmem").unwrap(),
164 MemorySourceType::MemFdOnHugeTlbFs
165 );
166 assert_eq!(
167 MemorySourceType::from_str("anon").unwrap(),
168 MemorySourceType::MmapAnonymous
169 );
170 assert_eq!(
171 MemorySourceType::from_str("mmap").unwrap(),
172 MemorySourceType::MmapAnonymous
173 );
174 assert_eq!(
175 MemorySourceType::from_str("hugeanon").unwrap(),
176 MemorySourceType::MmapAnonymousHugeTlbFs
177 );
178 assert_eq!(
179 MemorySourceType::from_str("hugemmap").unwrap(),
180 MemorySourceType::MmapAnonymousHugeTlbFs
181 );
182 assert!(MemorySourceType::from_str("test").is_err());
183 }
184
185 #[ignore]
186 #[test]
187 fn test_to_manager() {
188 let manager = GuestMemoryManager::new();
189 let mgr = GuestMemoryManager::to_manager(&manager).unwrap();
190
191 assert_eq!(&manager as *const _, mgr as *const _);
192 }
193}