Add DispVM balloon driver fix and backport some other fixes (#868)
This commit is contained in:
parent
7025371279
commit
6fe4b2ac00
@ -0,0 +1,41 @@
|
||||
From c275a57f5ec3056f732843b11659d892235faff7 Mon Sep 17 00:00:00 2001
|
||||
From: Boris Ostrovsky <boris.ostrovsky@oracle.com>
|
||||
Date: Wed, 6 Nov 2013 15:37:40 -0500
|
||||
Subject: [PATCH] xen/balloon: Set balloon's initial state to number of
|
||||
existing RAM pages
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Organization: Invisible Things Lab
|
||||
Cc: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
|
||||
|
||||
Currently balloon's initial value is set to max_pfn which includes
|
||||
non-RAM ranges such as MMIO hole. As result, initial memory target
|
||||
(specified by guest's configuration file) will appear smaller than
|
||||
what balloon driver perceives to be the current number of available
|
||||
pages. Thus it will balloon down "extra" pages, decreasing amount of
|
||||
available memory for no good reason.
|
||||
|
||||
Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
|
||||
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||||
Signed-off-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
|
||||
---
|
||||
drivers/xen/balloon.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c
|
||||
index b232908..1b62304 100644
|
||||
--- a/drivers/xen/balloon.c
|
||||
+++ b/drivers/xen/balloon.c
|
||||
@@ -641,7 +641,7 @@ static int __init balloon_init(void)
|
||||
|
||||
balloon_stats.current_pages = xen_pv_domain()
|
||||
? min(xen_start_info->nr_pages - xen_released_pages, max_pfn)
|
||||
- : max_pfn;
|
||||
+ : get_num_physpages();
|
||||
balloon_stats.target_pages = balloon_stats.current_pages;
|
||||
balloon_stats.balloon_low = 0;
|
||||
balloon_stats.balloon_high = 0;
|
||||
--
|
||||
1.8.1.4
|
||||
|
@ -0,0 +1,145 @@
|
||||
From c1d15f5c8bc1170dafe16e988e55437245966dfe Mon Sep 17 00:00:00 2001
|
||||
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
|
||||
Date: Wed, 11 Dec 2013 16:58:42 +0000
|
||||
Subject: [PATCH] xen/balloon: Seperate the auto-translate logic properly (v2)
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Organization: Invisible Things Lab
|
||||
Cc: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
|
||||
|
||||
The auto-xlat logic vs the non-xlat means that we don't need to for
|
||||
auto-xlat guests (like PVH, HVM or ARM):
|
||||
- use P2M
|
||||
- use scratch page.
|
||||
|
||||
However the code in increase_reservation does modify the p2m for
|
||||
auto_translate guests, but not in decrease_reservation.
|
||||
|
||||
Fix that by avoiding any p2m modifications in both increase_reservation
|
||||
and decrease_reservation for auto_translated guests.
|
||||
|
||||
And also avoid allocating or using scratch pages for auto_translated guests.
|
||||
|
||||
Lastly, since !auto-xlat is really another way of saying 'xen_pv'
|
||||
remove the redundant 'xen_pv_domain' check.
|
||||
|
||||
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
|
||||
[v2: Updated the description]
|
||||
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||||
Signed-off-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
|
||||
---
|
||||
drivers/xen/balloon.c | 63 +++++++++++++++++++++++++++------------------------
|
||||
1 file changed, 34 insertions(+), 29 deletions(-)
|
||||
|
||||
diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c
|
||||
index 55ea73f..4c02e2b 100644
|
||||
--- a/drivers/xen/balloon.c
|
||||
+++ b/drivers/xen/balloon.c
|
||||
@@ -350,17 +350,19 @@ static enum bp_state increase_reservation(unsigned long nr_pages)
|
||||
|
||||
pfn = page_to_pfn(page);
|
||||
|
||||
- set_phys_to_machine(pfn, frame_list[i]);
|
||||
-
|
||||
#ifdef CONFIG_XEN_HAVE_PVMMU
|
||||
- /* Link back into the page tables if not highmem. */
|
||||
- if (xen_pv_domain() && !PageHighMem(page)) {
|
||||
- int ret;
|
||||
- ret = HYPERVISOR_update_va_mapping(
|
||||
- (unsigned long)__va(pfn << PAGE_SHIFT),
|
||||
- mfn_pte(frame_list[i], PAGE_KERNEL),
|
||||
- 0);
|
||||
- BUG_ON(ret);
|
||||
+ if (!xen_feature(XENFEAT_auto_translated_physmap)) {
|
||||
+ set_phys_to_machine(pfn, frame_list[i]);
|
||||
+
|
||||
+ /* Link back into the page tables if not highmem. */
|
||||
+ if (!PageHighMem(page)) {
|
||||
+ int ret;
|
||||
+ ret = HYPERVISOR_update_va_mapping(
|
||||
+ (unsigned long)__va(pfn << PAGE_SHIFT),
|
||||
+ mfn_pte(frame_list[i], PAGE_KERNEL),
|
||||
+ 0);
|
||||
+ BUG_ON(ret);
|
||||
+ }
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -378,7 +380,6 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp)
|
||||
enum bp_state state = BP_DONE;
|
||||
unsigned long pfn, i;
|
||||
struct page *page;
|
||||
- struct page *scratch_page;
|
||||
int ret;
|
||||
struct xen_memory_reservation reservation = {
|
||||
.address_bits = 0,
|
||||
@@ -411,27 +412,29 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp)
|
||||
frame_list[i] = pfn_to_mfn(pfn);
|
||||
page = pfn_to_page(pfn);
|
||||
|
||||
+#ifdef CONFIG_XEN_HAVE_PVMMU
|
||||
/*
|
||||
* Ballooned out frames are effectively replaced with
|
||||
* a scratch frame. Ensure direct mappings and the
|
||||
* p2m are consistent.
|
||||
*/
|
||||
- scratch_page = get_balloon_scratch_page();
|
||||
-#ifdef CONFIG_XEN_HAVE_PVMMU
|
||||
- if (xen_pv_domain() && !PageHighMem(page)) {
|
||||
- ret = HYPERVISOR_update_va_mapping(
|
||||
- (unsigned long)__va(pfn << PAGE_SHIFT),
|
||||
- pfn_pte(page_to_pfn(scratch_page),
|
||||
- PAGE_KERNEL_RO), 0);
|
||||
- BUG_ON(ret);
|
||||
- }
|
||||
-#endif
|
||||
if (!xen_feature(XENFEAT_auto_translated_physmap)) {
|
||||
unsigned long p;
|
||||
+ struct page *scratch_page = get_balloon_scratch_page();
|
||||
+
|
||||
+ if (!PageHighMem(page)) {
|
||||
+ ret = HYPERVISOR_update_va_mapping(
|
||||
+ (unsigned long)__va(pfn << PAGE_SHIFT),
|
||||
+ pfn_pte(page_to_pfn(scratch_page),
|
||||
+ PAGE_KERNEL_RO), 0);
|
||||
+ BUG_ON(ret);
|
||||
+ }
|
||||
p = page_to_pfn(scratch_page);
|
||||
__set_phys_to_machine(pfn, pfn_to_mfn(p));
|
||||
+
|
||||
+ put_balloon_scratch_page();
|
||||
}
|
||||
- put_balloon_scratch_page();
|
||||
+#endif
|
||||
|
||||
balloon_append(page);
|
||||
}
|
||||
@@ -627,15 +630,17 @@ static int __init balloon_init(void)
|
||||
if (!xen_domain())
|
||||
return -ENODEV;
|
||||
|
||||
- for_each_online_cpu(cpu)
|
||||
- {
|
||||
- per_cpu(balloon_scratch_page, cpu) = alloc_page(GFP_KERNEL);
|
||||
- if (per_cpu(balloon_scratch_page, cpu) == NULL) {
|
||||
- pr_warn("Failed to allocate balloon_scratch_page for cpu %d\n", cpu);
|
||||
- return -ENOMEM;
|
||||
+ if (!xen_feature(XENFEAT_auto_translated_physmap)) {
|
||||
+ for_each_online_cpu(cpu)
|
||||
+ {
|
||||
+ per_cpu(balloon_scratch_page, cpu) = alloc_page(GFP_KERNEL);
|
||||
+ if (per_cpu(balloon_scratch_page, cpu) == NULL) {
|
||||
+ pr_warn("Failed to allocate balloon_scratch_page for cpu %d\n", cpu);
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
}
|
||||
+ register_cpu_notifier(&balloon_cpu_notifier);
|
||||
}
|
||||
- register_cpu_notifier(&balloon_cpu_notifier);
|
||||
|
||||
pr_info("Initialising balloon driver\n");
|
||||
|
||||
--
|
||||
1.8.1.4
|
||||
|
@ -0,0 +1,53 @@
|
||||
From 9346c2a8defab777d1fba6bcc284f6ada181fe96 Mon Sep 17 00:00:00 2001
|
||||
From: Jie Liu <jeff.liu@oracle.com>
|
||||
Date: Wed, 13 Nov 2013 20:59:58 +0800
|
||||
Subject: [PATCH] xen: simplify balloon_first_page() with
|
||||
list_first_entry_or_null()
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Organization: Invisible Things Lab
|
||||
Cc: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
|
||||
|
||||
Replace the code logic at balloon_first_page() by calling
|
||||
list_first_entry_or_null() directly. since here is only
|
||||
one user of that routine, therefore we can just remove it.
|
||||
|
||||
Signed-off-by: Jie Liu <jeff.liu@oracle.com>
|
||||
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||||
Reviewed-by: David Vrabel <david.vrabel@citrix.com>
|
||||
Signed-off-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
|
||||
---
|
||||
drivers/xen/balloon.c | 9 +--------
|
||||
1 file changed, 1 insertion(+), 8 deletions(-)
|
||||
|
||||
diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c
|
||||
index 4c02e2b..37d06ea 100644
|
||||
--- a/drivers/xen/balloon.c
|
||||
+++ b/drivers/xen/balloon.c
|
||||
@@ -157,13 +157,6 @@ static struct page *balloon_retrieve(bool prefer_highmem)
|
||||
return page;
|
||||
}
|
||||
|
||||
-static struct page *balloon_first_page(void)
|
||||
-{
|
||||
- if (list_empty(&ballooned_pages))
|
||||
- return NULL;
|
||||
- return list_entry(ballooned_pages.next, struct page, lru);
|
||||
-}
|
||||
-
|
||||
static struct page *balloon_next_page(struct page *page)
|
||||
{
|
||||
struct list_head *next = page->lru.next;
|
||||
@@ -328,7 +321,7 @@ static enum bp_state increase_reservation(unsigned long nr_pages)
|
||||
if (nr_pages > ARRAY_SIZE(frame_list))
|
||||
nr_pages = ARRAY_SIZE(frame_list);
|
||||
|
||||
- page = balloon_first_page();
|
||||
+ page = list_first_entry_or_null(&ballooned_pages, struct page, lru);
|
||||
for (i = 0; i < nr_pages; i++) {
|
||||
if (!page) {
|
||||
nr_pages = i;
|
||||
--
|
||||
1.8.1.4
|
||||
|
55
patches.xen/balloon-driver-fix.patch
Normal file
55
patches.xen/balloon-driver-fix.patch
Normal file
@ -0,0 +1,55 @@
|
||||
Date: Fri, 27 Jun 2014 10:51:42 +0100
|
||||
From: David Vrabel <david.vrabel@citrix.com>
|
||||
Subject: xen/balloon: set ballooned out pages as invalid in p2m
|
||||
|
||||
Since cd9151e26d31048b2b5e00fd02e110e07d2200c9 (xen/balloon: set a
|
||||
mapping for ballooned out pages), a ballooned out page had its entry
|
||||
in the p2m set to the MFN of one of the scratch page. This means that
|
||||
the p2m will contain many entries pointing to the same MFN.
|
||||
|
||||
During a domain save, this many-to-one entries are not considered and
|
||||
the scratch page is saved multiple times. On restore the ballooned
|
||||
pages are populated with new frames and the domain may use up its
|
||||
allocation before all pages can be restores.
|
||||
|
||||
Set ballooned out pages as INVALID_P2M_ENTRY in the p2m (as they
|
||||
werebefore), preventing them from being saved and re-populated on
|
||||
restore.
|
||||
|
||||
Signed-off-by: David Vrabel <david.vrabel@citrix.com>
|
||||
---
|
||||
drivers/xen/balloon.c | 12 +++++-------
|
||||
1 file changed, 5 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c
|
||||
index b7a506f..5c660c7 100644
|
||||
--- a/drivers/xen/balloon.c
|
||||
+++ b/drivers/xen/balloon.c
|
||||
@@ -426,20 +426,18 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp)
|
||||
* p2m are consistent.
|
||||
*/
|
||||
if (!xen_feature(XENFEAT_auto_translated_physmap)) {
|
||||
- unsigned long p;
|
||||
- struct page *scratch_page = get_balloon_scratch_page();
|
||||
-
|
||||
if (!PageHighMem(page)) {
|
||||
+ struct page *scratch_page = get_balloon_scratch_page();
|
||||
+
|
||||
ret = HYPERVISOR_update_va_mapping(
|
||||
(unsigned long)__va(pfn << PAGE_SHIFT),
|
||||
pfn_pte(page_to_pfn(scratch_page),
|
||||
PAGE_KERNEL_RO), 0);
|
||||
BUG_ON(ret);
|
||||
- }
|
||||
- p = page_to_pfn(scratch_page);
|
||||
- __set_phys_to_machine(pfn, pfn_to_mfn(p));
|
||||
|
||||
- put_balloon_scratch_page();
|
||||
+ put_balloon_scratch_page();
|
||||
+ }
|
||||
+ __set_phys_to_machine(pfn, INVALID_P2M_ENTRY);
|
||||
}
|
||||
#endif
|
||||
|
||||
--
|
||||
1.7.10.4
|
@ -3,6 +3,14 @@ patches.rpmify/makefile-after_link.patch
|
||||
# should be included in 3.13
|
||||
patches.xen/PCI-Add-x86_msi-msi_mask_irq-and-msix_mask_irq.patch
|
||||
|
||||
# backports from 3.14
|
||||
patches.xen/balloon-0001-xen-balloon-Set-balloon-s-initial-state-to-number-of.patch
|
||||
patches.xen/balloon-0002-xen-balloon-Seperate-the-auto-translate-logic-proper.patch
|
||||
patches.xen/balloon-0003-xen-simplify-balloon_first_page-with-list_first_entr.patch
|
||||
|
||||
# should be included in 3.16/3.17
|
||||
patches.xen/balloon-driver-fix.patch
|
||||
|
||||
# fix for GPU performance (revert workaround and apply proper fix)
|
||||
patches.xen/pvops-3.4-Revert-xen-pat-Disable-PAT-support-for-now.patch
|
||||
patches.xen/pvops-Revert-xen-pat-Disable-PAT-using-pat_enabled-value.patch
|
||||
|
Loading…
Reference in New Issue
Block a user