aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/libxc/xc_hvm_build_x86.c35
-rw-r--r--xen/arch/x86/mm/p2m-pod.c9
2 files changed, 25 insertions, 19 deletions
diff --git a/tools/libxc/xc_hvm_build_x86.c b/tools/libxc/xc_hvm_build_x86.c
index 696c012291..cf5d7fb0f6 100644
--- a/tools/libxc/xc_hvm_build_x86.c
+++ b/tools/libxc/xc_hvm_build_x86.c
@@ -160,7 +160,7 @@ static int setup_guest(xc_interface *xch,
int pod_mode = 0;
if ( nr_pages > target_pages )
- pod_mode = 1;
+ pod_mode = XENMEMF_populate_on_demand;
memset(&elf, 0, sizeof(elf));
if ( elf_init(&elf, image, image_size) != 0 )
@@ -197,6 +197,22 @@ static int setup_guest(xc_interface *xch,
for ( i = mmio_start >> PAGE_SHIFT; i < nr_pages; i++ )
page_array[i] += mmio_size >> PAGE_SHIFT;
+ if ( pod_mode )
+ {
+ /*
+ * Subtract 0x20 from target_pages for the VGA "hole". Xen will
+ * adjust the PoD cache size so that domain tot_pages will be
+ * target_pages - 0x20 after this call.
+ */
+ rc = xc_domain_set_pod_target(xch, dom, target_pages - 0x20,
+ NULL, NULL, NULL);
+ if ( rc != 0 )
+ {
+ PERROR("Could not set PoD target for HVM guest.\n");
+ goto error_out;
+ }
+ }
+
/*
* Allocate memory for HVM guest, skipping VGA hole 0xA0000-0xC0000.
*
@@ -208,7 +224,7 @@ static int setup_guest(xc_interface *xch,
* ensure that we can be preempted and hence dom0 remains responsive.
*/
rc = xc_domain_populate_physmap_exact(
- xch, dom, 0xa0, 0, 0, &page_array[0x00]);
+ xch, dom, 0xa0, 0, pod_mode, &page_array[0x00]);
cur_pages = 0xc0;
stat_normal_pages = 0xc0;
while ( (rc == 0) && (nr_pages > cur_pages) )
@@ -247,8 +263,7 @@ static int setup_guest(xc_interface *xch,
sp_extents[i] = page_array[cur_pages+(i<<SUPERPAGE_1GB_SHIFT)];
done = xc_domain_populate_physmap(xch, dom, nr_extents, SUPERPAGE_1GB_SHIFT,
- pod_mode ? XENMEMF_populate_on_demand : 0,
- sp_extents);
+ pod_mode, sp_extents);
if ( done > 0 )
{
@@ -285,8 +300,7 @@ static int setup_guest(xc_interface *xch,
sp_extents[i] = page_array[cur_pages+(i<<SUPERPAGE_2MB_SHIFT)];
done = xc_domain_populate_physmap(xch, dom, nr_extents, SUPERPAGE_2MB_SHIFT,
- pod_mode ? XENMEMF_populate_on_demand : 0,
- sp_extents);
+ pod_mode, sp_extents);
if ( done > 0 )
{
@@ -302,19 +316,12 @@ static int setup_guest(xc_interface *xch,
if ( count != 0 )
{
rc = xc_domain_populate_physmap_exact(
- xch, dom, count, 0, 0, &page_array[cur_pages]);
+ xch, dom, count, 0, pod_mode, &page_array[cur_pages]);
cur_pages += count;
stat_normal_pages += count;
}
}
- /* Subtract 0x20 from target_pages for the VGA "hole". Xen will
- * adjust the PoD cache size so that domain tot_pages will be
- * target_pages - 0x20 after this call. */
- if ( pod_mode )
- rc = xc_domain_set_pod_target(xch, dom, target_pages - 0x20,
- NULL, NULL, NULL);
-
if ( rc != 0 )
{
PERROR("Could not allocate memory for HVM guest.");
diff --git a/xen/arch/x86/mm/p2m-pod.c b/xen/arch/x86/mm/p2m-pod.c
index 54da9f653a..cd1085b7b4 100644
--- a/xen/arch/x86/mm/p2m-pod.c
+++ b/xen/arch/x86/mm/p2m-pod.c
@@ -344,8 +344,9 @@ p2m_pod_set_mem_target(struct domain *d, unsigned long target)
pod_lock(p2m);
- /* P == B: Nothing to do. */
- if ( p2m->pod.entry_count == 0 )
+ /* P == B: Nothing to do (unless the guest is being created). */
+ populated = d->tot_pages - p2m->pod.count;
+ if ( populated > 0 && p2m->pod.entry_count == 0 )
goto out;
/* Don't do anything if the domain is being torn down */
@@ -357,13 +358,11 @@ p2m_pod_set_mem_target(struct domain *d, unsigned long target)
if ( target < d->tot_pages )
goto out;
- populated = d->tot_pages - p2m->pod.count;
-
pod_target = target - populated;
/* B < T': Set the cache size equal to # of outstanding entries,
* let the balloon driver fill in the rest. */
- if ( pod_target > p2m->pod.entry_count )
+ if ( populated > 0 && pod_target > p2m->pod.entry_count )
pod_target = p2m->pod.entry_count;
ASSERT( pod_target >= p2m->pod.count );