*/
}
+unsigned long libxl__get_required_paging_memory(unsigned long maxmem_kb,
+ unsigned int smp_cpus,
+ libxl_domain_type type,
+ bool hap)
+{
+ /*
+ * 256 pages (1MB) per vcpu,
+ * plus 1 page per MiB of RAM for the P2M map (for non-PV guests),
+ * plus 1 page per MiB of RAM to shadow the resident processes (for shadow
+ * mode guests).
+ * This is higher than the minimum that Xen would allocate if no value
+ * were given (but the Xen minimum is for safety, not performance).
+ */
+ return 4 * (256 * smp_cpus +
+ ((type != LIBXL_DOMAIN_TYPE_PV) + !hap) *
+ (maxmem_kb / 1024));
+}
+
static unsigned long libxl__get_required_iommu_memory(unsigned long maxmem_kb)
{
unsigned long iommu_pages = 0, mem_pages = maxmem_kb / 4;
}
if (d_config->b_info.shadow_memkb == LIBXL_MEMKB_DEFAULT
- && ok_to_default_memkb_in_create(gc))
+ && ok_to_default_memkb_in_create(gc)) {
+ bool hap = d_config->c_info.type != LIBXL_DOMAIN_TYPE_PV &&
+ libxl_defbool_val(d_config->c_info.hap);
+
d_config->b_info.shadow_memkb =
- libxl_get_required_shadow_memory(d_config->b_info.max_memkb,
- d_config->b_info.max_vcpus);
+ libxl__get_required_paging_memory(d_config->b_info.max_memkb,
+ d_config->b_info.max_vcpus,
+ d_config->c_info.type,
+ hap);
+ }
/* No IOMMU reservation is needed if passthrough mode is not 'sync_pt' */
if (d_config->b_info.iommu_memkb == LIBXL_MEMKB_DEFAULT
libxl_domain_build_info *b_info,
uint64_t *need_memkb);
+_hidden unsigned long libxl__get_required_paging_memory(unsigned long maxmem_kb,
+ unsigned int smp_cpus,
+ libxl_domain_type type,
+ bool hap);
+
_hidden const char *libxl__device_nic_devname(libxl__gc *gc,
uint32_t domid,
uint32_t devid,
unsigned long libxl_get_required_shadow_memory(unsigned long maxmem_kb, unsigned int smp_cpus)
{
- /* 256 pages (1MB) per vcpu,
- plus 1 page per MiB of RAM for the P2M map,
- plus 1 page per MiB of RAM to shadow the resident processes.
- This is higher than the minimum that Xen would allocate if no value
- were given (but the Xen minimum is for safety, not performance).
- */
- return 4 * (256 * smp_cpus + 2 * (maxmem_kb / 1024));
+ return libxl__get_required_paging_memory(maxmem_kb, smp_cpus,
+ LIBXL_DOMAIN_TYPE_INVALID, false);
}
char *libxl_domid_to_name(libxl_ctx *ctx, uint32_t domid)
unsigned long __init dom0_paging_pages(const struct domain *d,
unsigned long nr_pages)
{
- /* Copied from: libxl_get_required_shadow_memory() */
+ /* Keep in sync with libxl__get_required_paging_memory(). */
unsigned long memkb = nr_pages * (PAGE_SIZE / 1024);
- memkb = 4 * (256 * d->max_vcpus + 2 * (memkb / 1024));
+ memkb = 4 * (256 * d->max_vcpus +
+ (is_pv_domain(d) ? opt_dom0_shadow || opt_pv_l1tf_hwdom
+ : 1 + opt_dom0_shadow) *
+ (memkb / 1024));
- return ((memkb + 1023) / 1024) << (20 - PAGE_SHIFT);
+ return DIV_ROUND_UP(memkb, 1024) << (20 - PAGE_SHIFT);
}