mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
xen: make the shadow allocation hypercalls include the p2m memory
in the total shadow allocation. This makes the effect of allocation changes consistent regardless of p2m activity on boot. Signed-off-by: Tim Deegan <Tim.Deegan@citrix.com>
This commit is contained in:
1 parent
fb9c01fe79
commit
6dddb7b172
2 files changed
+32
-10
No files matched your search
@@ -334,7 +334,8 @@ static void hap_free_p2m_page(struct domain *d, struct page_info *pg)
|
||||
static unsigned int
|
||||
hap_get_allocation(struct domain *d)
|
||||
{
|
||||
unsigned int pg = d->arch.paging.hap.total_pages;
|
||||
unsigned int pg = d->arch.paging.hap.total_pages
|
||||
+ d->arch.paging.hap.p2m_pages;
|
||||
|
||||
return ((pg >> (20 - PAGE_SHIFT))
|
||||
+ ((pg & ((1 << (20 - PAGE_SHIFT)) - 1)) ? 1 : 0));
|
||||
@@ -349,6 +350,11 @@ hap_set_allocation(struct domain *d, unsigned int pages, int *preempted)
|
||||
|
||||
ASSERT(hap_locked_by_me(d));
|
||||
|
||||
if ( pages < d->arch.paging.hap.p2m_pages )
|
||||
pages = 0;
|
||||
else
|
||||
pages -= d->arch.paging.hap.p2m_pages;
|
||||
|
||||
while ( d->arch.paging.hap.total_pages != pages )
|
||||
{
|
||||
if ( d->arch.paging.hap.total_pages < pages )
|
||||
@@ -367,6 +373,11 @@ hap_set_allocation(struct domain *d, unsigned int pages, int *preempted)
|
||||
else if ( d->arch.paging.hap.total_pages > pages )
|
||||
{
|
||||
/* Need to return memory to domheap */
|
||||
if ( page_list_empty(&d->arch.paging.hap.freelist) )
|
||||
{
|
||||
HAP_PRINTK("failed to free enough hap pages.\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
pg = page_list_remove_head(&d->arch.paging.hap.freelist);
|
||||
ASSERT(pg);
|
||||
d->arch.paging.hap.free_pages--;
|
||||
|
||||
@@ -1817,14 +1817,24 @@ static unsigned int sh_set_allocation(struct domain *d,
|
||||
unsigned int j, order = shadow_max_order(d);
|
||||
|
||||
ASSERT(shadow_locked_by_me(d));
|
||||
|
||||
/* Don't allocate less than the minimum acceptable, plus one page per
|
||||
* megabyte of RAM (for the p2m table) */
|
||||
lower_bound = shadow_min_acceptable_pages(d) + (d->tot_pages / 256);
|
||||
if ( pages > 0 && pages < lower_bound )
|
||||
pages = lower_bound;
|
||||
/* Round up to largest block size */
|
||||
pages = (pages + ((1<<SHADOW_MAX_ORDER)-1)) & ~((1<<SHADOW_MAX_ORDER)-1);
|
||||
|
||||
if ( pages > 0 )
|
||||
{
|
||||
/* Check for minimum value. */
|
||||
if ( pages < d->arch.paging.shadow.p2m_pages )
|
||||
pages = 0;
|
||||
else
|
||||
pages -= d->arch.paging.shadow.p2m_pages;
|
||||
|
||||
/* Don't allocate less than the minimum acceptable, plus one page per
|
||||
* megabyte of RAM (for the p2m table) */
|
||||
lower_bound = shadow_min_acceptable_pages(d) + (d->tot_pages / 256);
|
||||
if ( pages < lower_bound )
|
||||
pages = lower_bound;
|
||||
|
||||
/* Round up to largest block size */
|
||||
pages = (pages + ((1<<SHADOW_MAX_ORDER)-1)) & ~((1<<SHADOW_MAX_ORDER)-1);
|
||||
}
|
||||
|
||||
SHADOW_PRINTK("current %i target %i\n",
|
||||
d->arch.paging.shadow.total_pages, pages);
|
||||
@@ -1884,7 +1894,8 @@ static unsigned int sh_set_allocation(struct domain *d,
|
||||
/* Return the size of the shadow pool, rounded up to the nearest MB */
|
||||
static unsigned int shadow_get_allocation(struct domain *d)
|
||||
{
|
||||
unsigned int pg = d->arch.paging.shadow.total_pages;
|
||||
unsigned int pg = d->arch.paging.shadow.total_pages
|
||||
+ d->arch.paging.shadow.p2m_pages;
|
||||
return ((pg >> (20 - PAGE_SHIFT))
|
||||
+ ((pg & ((1 << (20 - PAGE_SHIFT)) - 1)) ? 1 : 0));
|
||||
}
|
||||
|
||||