|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [RFCv2 10/38] x86/boot: generalize paging pages calculation
Modeling after libxl__get_required_paging_memory(), refactor
dom0_paging_pages() to calculate the number of paging pages required for a
domain that is not the control or hardware domain. As the function is being
refactored, rename to dom_paging_pages() and move under the domain builder.
Signed-off-by: Daniel P. Smith <dpsmith@xxxxxxxxxxxxxxxxxxxx>
---
xen/arch/x86/dom0_build.c | 17 +----------------
xen/arch/x86/domain-builder/domain.c | 20 ++++++++++++++++++++
xen/arch/x86/hvm/dom0_build.c | 3 ++-
xen/arch/x86/include/asm/dom0_build.h | 3 ---
xen/arch/x86/include/asm/domain-builder.h | 3 +++
xen/arch/x86/pv/dom0_build.c | 3 ++-
6 files changed, 28 insertions(+), 21 deletions(-)
diff --git a/xen/arch/x86/dom0_build.c b/xen/arch/x86/dom0_build.c
index a72064fbae80..0bcdfcb97e6c 100644
--- a/xen/arch/x86/dom0_build.c
+++ b/xen/arch/x86/dom0_build.c
@@ -305,21 +305,6 @@ boolean_param("ro-hpet", ro_hpet);
unsigned int __initdata dom0_memflags = MEMF_no_dma|MEMF_exact_node;
-unsigned long __init dom0_paging_pages(const struct domain *d,
- unsigned long nr_pages)
-{
- /* Keep in sync with libxl__get_required_paging_memory(). */
- unsigned long memkb = nr_pages * (PAGE_SIZE / 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 DIV_ROUND_UP(memkb, 1024) << (20 - PAGE_SHIFT);
-}
-
-
/*
* If allocation isn't specified, reserve 1/16th of available memory for
* things like DMA buffers. This reservation is clamped to a maximum of 128MB.
@@ -431,7 +416,7 @@ unsigned long __init dom0_compute_nr_pages(
*/
calculate_dom0_pages(bd, avail);
- cpu_pages = dom0_paging_pages(d, bd->mem_pages);
+ cpu_pages = dom_paging_pages(bd, bd->mem_pages);
if ( !iommu_use_hap_pt(d) )
avail -= cpu_pages;
diff --git a/xen/arch/x86/domain-builder/domain.c
b/xen/arch/x86/domain-builder/domain.c
index 0512dde54746..a2e5807b60a5 100644
--- a/xen/arch/x86/domain-builder/domain.c
+++ b/xen/arch/x86/domain-builder/domain.c
@@ -12,6 +12,8 @@
#include <asm/bootinfo.h>
#include <asm/dom0_build.h>
+#include <asm/paging.h>
+#include <asm/spec_ctrl.h>
unsigned int __init dom_max_vcpus(struct boot_domain *bd)
{
@@ -40,6 +42,24 @@ struct vcpu *__init domain_vcpu0_create(struct boot_domain
*bd)
return vcpu_create(bd->d, 0);
}
+unsigned long __init dom_paging_pages(
+ const struct boot_domain *bd, unsigned long nr_pages)
+{
+ /* Keep in sync with libxl__get_required_paging_memory(). */
+ unsigned long memkb = bd->mem_pages * (PAGE_SIZE / 1024);
+ unsigned long factor = 0;
+
+ if ( has_dom0_caps(bd) )
+ factor = is_pv_domain(bd->d) ? opt_dom0_shadow || opt_pv_l1tf_hwdom
+ : 1 + opt_dom0_shadow;
+ else
+ factor = !is_pv_domain(bd->d) + !paging_mode_hap(bd->d);
+
+ memkb = 4 * (256 * bd->d->max_vcpus + (factor * (memkb / 1024)));
+
+ return DIV_ROUND_UP(memkb, 1024) << (20 - PAGE_SHIFT);
+}
+
/*
* Local variables:
* mode: C
diff --git a/xen/arch/x86/hvm/dom0_build.c b/xen/arch/x86/hvm/dom0_build.c
index 1f229d7bded1..3f0d157f82c8 100644
--- a/xen/arch/x86/hvm/dom0_build.c
+++ b/xen/arch/x86/hvm/dom0_build.c
@@ -19,6 +19,7 @@
#include <asm/bootinfo.h>
#include <asm/bzimage.h>
#include <asm/dom0_build.h>
+#include <asm/domain-builder.h>
#include <asm/hvm/support.h>
#include <asm/io_apic.h>
#include <asm/p2m.h>
@@ -406,7 +407,7 @@ static void __init pvh_init_p2m(struct boot_domain *bd)
pvh_setup_e820(bd->d, nr_pages);
do {
preempted = false;
- paging_set_allocation(bd->d, dom0_paging_pages(bd->d, nr_pages),
+ paging_set_allocation(bd->d, dom_paging_pages(bd, nr_pages),
&preempted);
process_pending_softirqs();
} while ( preempted );
diff --git a/xen/arch/x86/include/asm/dom0_build.h
b/xen/arch/x86/include/asm/dom0_build.h
index dcf71c032a17..81717b49b4ae 100644
--- a/xen/arch/x86/include/asm/dom0_build.h
+++ b/xen/arch/x86/include/asm/dom0_build.h
@@ -19,9 +19,6 @@ unsigned long dom0_compute_nr_pages(
int dom0_construct_pv(struct boot_domain *bd);
int dom0_construct_pvh(struct boot_domain *bd);
-unsigned long dom0_paging_pages(const struct domain *d,
- unsigned long nr_pages);
-
void dom0_update_physmap(bool compat, unsigned long pfn,
unsigned long mfn, unsigned long vphysmap_s);
diff --git a/xen/arch/x86/include/asm/domain-builder.h
b/xen/arch/x86/include/asm/domain-builder.h
index dd429fc9ff8b..c5a71fae5ccb 100644
--- a/xen/arch/x86/include/asm/domain-builder.h
+++ b/xen/arch/x86/include/asm/domain-builder.h
@@ -3,6 +3,9 @@
struct boot_domain;
+unsigned long dom_paging_pages(
+ const struct boot_domain *d, unsigned long nr_pages);
+
int dom_construct_pvh(struct boot_domain *bd);
#endif
diff --git a/xen/arch/x86/pv/dom0_build.c b/xen/arch/x86/pv/dom0_build.c
index 350a60b1e8fd..f8844b858082 100644
--- a/xen/arch/x86/pv/dom0_build.c
+++ b/xen/arch/x86/pv/dom0_build.c
@@ -17,6 +17,7 @@
#include <asm/bootinfo.h>
#include <asm/bzimage.h>
#include <asm/dom0_build.h>
+#include <asm/domain-builder.h>
#include <asm/guest.h>
#include <asm/page.h>
#include <asm/pv/mm.h>
@@ -1043,7 +1044,7 @@ static int __init dom0_construct(struct boot_domain *bd)
{
bool preempted;
- nr_pt_pages = dom0_paging_pages(d, nr_pages);
+ nr_pt_pages = dom_paging_pages(bd, nr_pages);
do {
preempted = false;
--
2.30.2
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |