@@ -400,17 +400,15 @@ static u64 host_ram_size(void)
static u64 get_ram_size(int nr_cpus)
{
- u64 available;
- u64 ram_size;
+ long nr_pages_available = host_ram_nrpages() * RAM_SIZE_RATIO;
+ u64 ram_size = (u64)SZ_64M * (nr_cpus + 3);
+ u64 available = MIN_RAM_SIZE;
- ram_size = (u64)SZ_64M * (nr_cpus + 3);
-
- available = host_ram_size() * RAM_SIZE_RATIO;
- if (!available)
- available = MIN_RAM_SIZE;
+ if (nr_pages_available)
+ available = nr_pages_available * host_page_size();
if (ram_size > available)
- ram_size = available;
+ ram_size = available;
return ram_size;
}
Calculate the guest ram size based a ratio proportional to the number of pages available, rather than the amount of memory available in bytes, in the host. This is to ensure that the result is always page-aligned. If the result of get_ram_size() isn't aligned to the host page size, it triggers an error in __kvm_set_memory_region(), called via the KVM_SET_USER_MEMORY_REGION ioctl, which requires the size to be page-aligned. Fixes: 18bd8c3bd2a7 ("kvm tools: Don't use all of host RAM for guests by default") Signed-off-by: Fuad Tabba <tabba@google.com> --- builtin-run.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-)