(
&mut self,
start_addr: GuestAddress,
size: usize,
)
| 2156 | } |
| 2157 | |
| 2158 | pub fn add_ram_region( |
| 2159 | &mut self, |
| 2160 | start_addr: GuestAddress, |
| 2161 | size: usize, |
| 2162 | ) -> Result<Arc<GuestRegionMmap>, Error> { |
| 2163 | // Allocate memory for the region |
| 2164 | let region = MemoryManager::create_ram_region( |
| 2165 | &None, |
| 2166 | 0, |
| 2167 | start_addr, |
| 2168 | size, |
| 2169 | self.prefault, |
| 2170 | self.shared, |
| 2171 | self.hugepages, |
| 2172 | self.hugepage_size, |
| 2173 | None, |
| 2174 | None, |
| 2175 | self.thp, |
| 2176 | )?; |
| 2177 | |
| 2178 | // Map it into the guest |
| 2179 | // SAFETY: guaranteed by GuestMmapRegion invariants |
| 2180 | let slot = unsafe { |
| 2181 | self.create_userspace_mapping( |
| 2182 | region.start_addr().0, |
| 2183 | region.len().try_into().unwrap(), |
| 2184 | region.as_ptr(), |
| 2185 | self.memory_zones |
| 2186 | .get(DEFAULT_MEMORY_ZONE) |
| 2187 | .map_or(self.mergeable, |z| z.mergeable), |
| 2188 | false, |
| 2189 | self.log_dirty, |
| 2190 | ) |
| 2191 | }?; |
| 2192 | self.guest_ram_mappings.push(GuestRamMapping { |
| 2193 | gpa: region.start_addr().raw_value(), |
| 2194 | size: region.len(), |
| 2195 | slot, |
| 2196 | zone_id: DEFAULT_MEMORY_ZONE.to_string(), |
| 2197 | virtio_mem: false, |
| 2198 | file_offset: 0, |
| 2199 | }); |
| 2200 | |
| 2201 | self.add_region(Arc::clone(®ion))?; |
| 2202 | |
| 2203 | Ok(region) |
| 2204 | } |
| 2205 | |
| 2206 | fn hotplug_ram_region(&mut self, size: usize) -> Result<Arc<GuestRegionMmap>, Error> { |
| 2207 | info!("Hotplugging new RAM: {size}"); |
no test coverage detected