|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [RFCv2 08/38] x86/boot: convert dom0 page calculation to use boot domain
This commit seeks to rework the dom0_compute_nr_pages() function to consume a
boot domain structure that may contain requested memory pages, min pages, max
pages, and the reference for the initrd. With the passing of the boot domain
struct, the initrd_size parameter is dropped. This takes into account the PVH
case, where the value 0 was passed, which is safe as initrd_size is only used
behind the is_pv_domain() check.
It introduces the calculate_dom0_pages() function that handles the command line
override of the memory pages, min pages, and max pages values. The function
also applies a clamping of memory pages to the min/max pages value.
Signed-off-by: Daniel P. Smith <dpsmith@xxxxxxxxxxxxxxxxxxxx>
---
xen/arch/x86/dom0_build.c | 62 ++++++++++++++++-----------
xen/arch/x86/hvm/dom0_build.c | 12 +++---
xen/arch/x86/include/asm/dom0_build.h | 10 ++---
xen/arch/x86/pv/dom0_build.c | 6 +--
4 files changed, 51 insertions(+), 39 deletions(-)
diff --git a/xen/arch/x86/dom0_build.c b/xen/arch/x86/dom0_build.c
index 2cf6535ce190..02a3c2d249c3 100644
--- a/xen/arch/x86/dom0_build.c
+++ b/xen/arch/x86/dom0_build.c
@@ -330,16 +330,37 @@ static unsigned long __init default_nr_pages(unsigned
long avail)
: min(avail / 16, 128UL << (20 - PAGE_SHIFT)));
}
-unsigned long __init dom0_compute_nr_pages(
- struct domain *d, struct elf_dom_parms *parms, unsigned long initrd_len)
+static void __init calculate_dom0_pages(
+ struct boot_domain *bd, unsigned long avail)
{
- nodeid_t node;
- unsigned long avail = 0, nr_pages, min_pages, max_pages, iommu_pages = 0;
+ unsigned long nr_pages = bd->mem_pages ?: default_nr_pages(avail);
/* The ordering of operands is to work around a clang5 issue. */
if ( CONFIG_DOM0_MEM[0] && !dom0_mem_set )
parse_dom0_mem(CONFIG_DOM0_MEM);
+ if ( dom0_mem_set )
+ {
+ nr_pages = get_memsize(&dom0_size, avail) ?: default_nr_pages(avail);
+ bd->min_pages = get_memsize(&dom0_min_size, avail);
+ bd->max_pages = get_memsize(&dom0_max_size, avail);
+ }
+
+ nr_pages = max(nr_pages, bd->min_pages);
+ nr_pages = min(nr_pages, bd->max_pages);
+ nr_pages = min(nr_pages, avail);
+
+ bd->mem_pages = nr_pages;
+}
+
+unsigned long __init dom0_compute_nr_pages(
+ struct boot_domain *bd, struct elf_dom_parms *parms)
+{
+ nodeid_t node;
+ struct domain *d = bd->d;
+ unsigned long initrd_len = bd->ramdisk ? bd->ramdisk->size : 0;
+ unsigned long avail = 0, iommu_pages = 0;
+
for_each_node_mask ( node, dom0_nodes )
avail += avail_domheap_pages_region(node, 0, 0) +
initial_images_nrpages(node);
@@ -366,17 +387,13 @@ unsigned long __init dom0_compute_nr_pages(
{
unsigned long cpu_pages;
- nr_pages = get_memsize(&dom0_size, avail) ?: default_nr_pages(avail);
-
/*
* Clamp according to min/max limits and available memory
* (preliminary).
*/
- nr_pages = max(nr_pages, get_memsize(&dom0_min_size, avail));
- nr_pages = min(nr_pages, get_memsize(&dom0_max_size, avail));
- nr_pages = min(nr_pages, avail);
+ calculate_dom0_pages(bd, avail);
- cpu_pages = dom0_paging_pages(d, nr_pages);
+ cpu_pages = dom0_paging_pages(d, bd->mem_pages);
if ( !iommu_use_hap_pt(d) )
avail -= cpu_pages;
@@ -384,18 +401,12 @@ unsigned long __init dom0_compute_nr_pages(
avail -= cpu_pages - iommu_pages;
}
- nr_pages = get_memsize(&dom0_size, avail) ?: default_nr_pages(avail);
- min_pages = get_memsize(&dom0_min_size, avail);
- max_pages = get_memsize(&dom0_max_size, avail);
-
/* Clamp according to min/max limits and available memory (final). */
- nr_pages = max(nr_pages, min_pages);
- nr_pages = min(nr_pages, max_pages);
- nr_pages = min(nr_pages, avail);
+ calculate_dom0_pages(bd, avail);
if ( is_pv_domain(d) &&
(parms->p2m_base == UNSET_ADDR) && !memsize_gt_zero(&dom0_size) &&
- (!memsize_gt_zero(&dom0_min_size) || (nr_pages > min_pages)) )
+ (!memsize_gt_zero(&dom0_min_size) || (bd->mem_pages > bd->min_pages))
)
{
/*
* Legacy Linux kernels (i.e. such without a XEN_ELFNOTE_INIT_P2M
@@ -412,7 +423,7 @@ unsigned long __init dom0_compute_nr_pages(
vend = round_pgup(parms->virt_kend);
if ( !parms->unmapped_initrd )
vend += round_pgup(initrd_len);
- end = vend + nr_pages * sizeof_long;
+ end = vend + bd->mem_pages * sizeof_long;
if ( end > vstart )
end += end - vstart;
@@ -420,16 +431,17 @@ unsigned long __init dom0_compute_nr_pages(
(sizeof_long < sizeof(end) && end > (1UL << (8 * sizeof_long))) )
{
end = sizeof_long >= sizeof(end) ? 0 : 1UL << (8 * sizeof_long);
- nr_pages = (end - vend) / (2 * sizeof_long);
- if ( memsize_gt_zero(&dom0_min_size) && nr_pages < min_pages )
- nr_pages = min_pages;
- printk("Dom0 memory clipped to %lu pages\n", nr_pages);
+ bd->mem_pages = (end - vend) / (2 * sizeof_long);
+ if ( memsize_gt_zero(&dom0_min_size) &&
+ bd->mem_pages < bd->min_pages )
+ bd->mem_pages = bd->min_pages;
+ printk("Dom0 memory clipped to %lu pages\n", bd->mem_pages);
}
}
- d->max_pages = min_t(unsigned long, max_pages, UINT_MAX);
+ d->max_pages = min_t(unsigned long, bd->max_pages, UINT_MAX);
- return nr_pages;
+ return bd->mem_pages;
}
static void __init process_dom0_ioports_disable(struct domain *dom0)
diff --git a/xen/arch/x86/hvm/dom0_build.c b/xen/arch/x86/hvm/dom0_build.c
index 4f2eb0f97aba..1f229d7bded1 100644
--- a/xen/arch/x86/hvm/dom0_build.c
+++ b/xen/arch/x86/hvm/dom0_build.c
@@ -398,15 +398,15 @@ static __init void pvh_setup_e820(struct domain *d,
unsigned long nr_pages)
ASSERT(cur_pages == nr_pages);
}
-static void __init pvh_init_p2m(struct domain *d)
+static void __init pvh_init_p2m(struct boot_domain *bd)
{
- unsigned long nr_pages = dom0_compute_nr_pages(d, NULL, 0);
+ unsigned long nr_pages = dom0_compute_nr_pages(bd, NULL);
bool preempted;
- pvh_setup_e820(d, nr_pages);
+ pvh_setup_e820(bd->d, nr_pages);
do {
preempted = false;
- paging_set_allocation(d, dom0_paging_pages(d, nr_pages),
+ paging_set_allocation(bd->d, dom0_paging_pages(bd->d, nr_pages),
&preempted);
process_pending_softirqs();
} while ( preempted );
@@ -1311,7 +1311,7 @@ static int __init pvh_setup_acpi(struct domain *d,
paddr_t start_info)
return 0;
}
-int __init dom0_construct_pvh(const struct boot_domain *bd)
+int __init dom0_construct_pvh(struct boot_domain *bd)
{
paddr_t entry, start_info;
struct domain *d = bd->d;
@@ -1322,7 +1322,7 @@ int __init dom0_construct_pvh(const struct boot_domain
*bd)
* be done before the iommu initializion, since iommu initialization code
* will likely add mappings required by devices to the p2m (ie: RMRRs).
*/
- pvh_init_p2m(d);
+ pvh_init_p2m(bd);
iommu_hwdom_init(d);
diff --git a/xen/arch/x86/include/asm/dom0_build.h
b/xen/arch/x86/include/asm/dom0_build.h
index 426def4115ce..dcf71c032a17 100644
--- a/xen/arch/x86/include/asm/dom0_build.h
+++ b/xen/arch/x86/include/asm/dom0_build.h
@@ -10,14 +10,14 @@ extern unsigned int dom0_memflags;
void dom0_set_affinity(struct domain *dom0);
-unsigned long dom0_compute_nr_pages(struct domain *d,
- struct elf_dom_parms *parms,
- unsigned long initrd_len);
int dom0_setup_permissions(struct domain *d);
struct boot_domain;
-int dom0_construct_pv(const struct boot_domain *bd);
-int dom0_construct_pvh(const struct boot_domain *bd);
+unsigned long dom0_compute_nr_pages(
+ struct boot_domain *bd, struct elf_dom_parms *parms);
+
+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);
diff --git a/xen/arch/x86/pv/dom0_build.c b/xen/arch/x86/pv/dom0_build.c
index 3b2baf057b75..350a60b1e8fd 100644
--- a/xen/arch/x86/pv/dom0_build.c
+++ b/xen/arch/x86/pv/dom0_build.c
@@ -355,7 +355,7 @@ static struct page_info * __init alloc_chunk(struct domain
*d,
return page;
}
-static int __init dom0_construct(const struct boot_domain *bd)
+static int __init dom0_construct(struct boot_domain *bd)
{
unsigned int i;
int rc, order, machine;
@@ -503,7 +503,7 @@ static int __init dom0_construct(const struct boot_domain
*bd)
}
}
- nr_pages = dom0_compute_nr_pages(d, &parms, initrd_len);
+ nr_pages = dom0_compute_nr_pages(bd, &parms);
#ifdef CONFIG_PV32
if ( elf_32bit(&elf) )
@@ -1070,7 +1070,7 @@ out:
return rc;
}
-int __init dom0_construct_pv(const struct boot_domain *bd)
+int __init dom0_construct_pv(struct boot_domain *bd)
{
unsigned long cr4 = read_cr4();
int rc;
--
2.30.2
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |