Snap for 12765415 from 0ef69786fa139b3f84643bf3404ee0e07aea1fb1 to 25Q1-release
Change-Id: I304bbd60f1897887617101049b4ed6cee9966574
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/SettingsDiskResizeActivity.kt b/android/TerminalApp/java/com/android/virtualization/terminal/SettingsDiskResizeActivity.kt
index b893d9e..8ea4b25 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/SettingsDiskResizeActivity.kt
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/SettingsDiskResizeActivity.kt
@@ -21,6 +21,7 @@
import android.icu.util.Measure
import android.icu.util.MeasureUnit
import android.os.Bundle
+import android.os.Environment
import android.text.SpannableString
import android.text.Spanned
import android.text.TextUtils
@@ -35,9 +36,8 @@
import java.util.regex.Pattern
class SettingsDiskResizeActivity : AppCompatActivity() {
- // TODO(b/382191950): Calculate the maxDiskSizeMb based on the device storage usage
- private val maxDiskSizeMb: Long = 16 shl 10
private val numberPattern: Pattern = Pattern.compile("[\\d]*[\\٫.,]?[\\d]+")
+ private val defaultMaxDiskSizeMb: Long = 16 shl 10
private var diskSizeStepMb: Long = 0
private var diskSizeMb: Long = 0
@@ -72,6 +72,10 @@
val image = InstalledImage.getDefault(this)
diskSizeMb = bytesToMb(image.getSize())
val minDiskSizeMb = bytesToMb(image.getSmallestSizePossible()).coerceAtMost(diskSizeMb)
+ val usableSpaceMb =
+ bytesToMb(Environment.getDataDirectory().getUsableSpace()) and
+ (diskSizeStepMb - 1).inv()
+ val maxDiskSizeMb = defaultMaxDiskSizeMb.coerceAtMost(diskSizeMb + usableSpaceMb)
diskSizeText = findViewById<TextView>(R.id.settings_disk_resize_resize_gb_assigned)!!
val diskMaxSizeText = findViewById<TextView>(R.id.settings_disk_resize_resize_gb_max)
diff --git a/libs/libvmbase/src/memory.rs b/libs/libvmbase/src/memory.rs
index fd4706f..9153706 100644
--- a/libs/libvmbase/src/memory.rs
+++ b/libs/libvmbase/src/memory.rs
@@ -26,9 +26,9 @@
pub use page_table::PageTable;
pub use shared::MemoryRange;
pub use tracker::{
- deactivate_dynamic_page_tables, init_shared_pool, map_data, map_device, map_image_footer,
- map_rodata, map_rodata_outside_main_memory, resize_available_memory, unshare_all_memory,
- unshare_all_mmio_except_uart, unshare_uart,
+ deactivate_dynamic_page_tables, init_shared_pool, map_data, map_data_noflush, map_device,
+ map_image_footer, map_rodata, map_rodata_outside_main_memory, resize_available_memory,
+ unshare_all_memory, unshare_all_mmio_except_uart, unshare_uart,
};
pub use util::{
flush, flushed_zeroize, page_4kb_of, PAGE_SIZE, SIZE_128KB, SIZE_16KB, SIZE_2MB, SIZE_4KB,
diff --git a/libs/libvmbase/src/memory/tracker.rs b/libs/libvmbase/src/memory/tracker.rs
index 3416dc6..bbff254 100644
--- a/libs/libvmbase/src/memory/tracker.rs
+++ b/libs/libvmbase/src/memory/tracker.rs
@@ -132,6 +132,18 @@
Ok(())
}
+/// Map the provided range as normal memory, with R/W permissions.
+///
+/// Unlike `map_data()`, `deactivate_dynamic_page_tables()` will not flush caches for the range.
+///
+/// This fails if the range has already been (partially) mapped.
+pub fn map_data_noflush(addr: usize, size: NonZeroUsize) -> Result<()> {
+ let mut locked_tracker = try_lock_memory_tracker()?;
+ let tracker = locked_tracker.as_mut().ok_or(MemoryTrackerError::Unavailable)?;
+ let _ = tracker.alloc_mut_noflush(addr, size)?;
+ Ok(())
+}
+
/// Map the region potentially holding data appended to the image, with read-write permissions.
///
/// This fails if the footer has already been mapped.
@@ -294,7 +306,17 @@
self.add(region)
}
- /// Maps the image footer read-write, with permissions.
+ fn alloc_range_mut_noflush(&mut self, range: &MemoryRange) -> Result<MemoryRange> {
+ let region = MemoryRegion { range: range.clone(), mem_type: MemoryType::ReadWrite };
+ self.check_allocatable(®ion)?;
+ self.page_table.map_data(&get_va_range(range)).map_err(|e| {
+ error!("Error during non-flushed mutable range allocation: {e}");
+ MemoryTrackerError::FailedToMap
+ })?;
+ self.add(region)
+ }
+
+ /// Maps the image footer, with read-write permissions.
fn map_image_footer(&mut self) -> Result<MemoryRange> {
if self.image_footer_mapped {
return Err(MemoryTrackerError::FooterAlreadyMapped);
@@ -318,6 +340,10 @@
self.alloc_range_mut(&(base..(base + size.get())))
}
+ fn alloc_mut_noflush(&mut self, base: usize, size: NonZeroUsize) -> Result<MemoryRange> {
+ self.alloc_range_mut_noflush(&(base..(base + size.get())))
+ }
+
/// Checks that the given range of addresses is within the MMIO region, and then maps it
/// appropriately.
fn map_mmio_range(&mut self, range: MemoryRange) -> Result<()> {