diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-04-02 16:53:53 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-04-02 16:53:53 -0400 |
commit | b0838b150160f90be0903a38a2ce11d764962752 (patch) | |
tree | 39c71db2c10e4115c7755142b0444191f32b9c07 | |
parent | 1d514333da19410751c195cc715f9dbe1bb4b08f (diff) | |
parent | 3c56b3a12ce52f361468cbdd2f79b2f3b8da0ea6 (diff) |
Merge tag 'stable/for-linus-4.0-rc6-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip
Pull xen regression fixes from David Vrabel:
"Fix two regressions in the balloon driver's use of memory hotplug when
used in a PV guest"
* tag 'stable/for-linus-4.0-rc6-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip:
xen/balloon: before adding hotplugged memory, set frames to invalid
x86/xen: prepare p2m list for memory hotplug
-rw-r--r-- | arch/x86/xen/p2m.c | 10 | ||||
-rw-r--r-- | drivers/xen/Kconfig | 17 | ||||
-rw-r--r-- | drivers/xen/balloon.c | 23 |
3 files changed, 49 insertions, 1 deletions
diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c index 9f93af56a5fc..b47124d4cd67 100644 --- a/arch/x86/xen/p2m.c +++ b/arch/x86/xen/p2m.c | |||
@@ -91,6 +91,12 @@ EXPORT_SYMBOL_GPL(xen_p2m_size); | |||
91 | unsigned long xen_max_p2m_pfn __read_mostly; | 91 | unsigned long xen_max_p2m_pfn __read_mostly; |
92 | EXPORT_SYMBOL_GPL(xen_max_p2m_pfn); | 92 | EXPORT_SYMBOL_GPL(xen_max_p2m_pfn); |
93 | 93 | ||
94 | #ifdef CONFIG_XEN_BALLOON_MEMORY_HOTPLUG_LIMIT | ||
95 | #define P2M_LIMIT CONFIG_XEN_BALLOON_MEMORY_HOTPLUG_LIMIT | ||
96 | #else | ||
97 | #define P2M_LIMIT 0 | ||
98 | #endif | ||
99 | |||
94 | static DEFINE_SPINLOCK(p2m_update_lock); | 100 | static DEFINE_SPINLOCK(p2m_update_lock); |
95 | 101 | ||
96 | static unsigned long *p2m_mid_missing_mfn; | 102 | static unsigned long *p2m_mid_missing_mfn; |
@@ -385,9 +391,11 @@ static void __init xen_rebuild_p2m_list(unsigned long *p2m) | |||
385 | void __init xen_vmalloc_p2m_tree(void) | 391 | void __init xen_vmalloc_p2m_tree(void) |
386 | { | 392 | { |
387 | static struct vm_struct vm; | 393 | static struct vm_struct vm; |
394 | unsigned long p2m_limit; | ||
388 | 395 | ||
396 | p2m_limit = (phys_addr_t)P2M_LIMIT * 1024 * 1024 * 1024 / PAGE_SIZE; | ||
389 | vm.flags = VM_ALLOC; | 397 | vm.flags = VM_ALLOC; |
390 | vm.size = ALIGN(sizeof(unsigned long) * xen_max_p2m_pfn, | 398 | vm.size = ALIGN(sizeof(unsigned long) * max(xen_max_p2m_pfn, p2m_limit), |
391 | PMD_SIZE * PMDS_PER_MID_PAGE); | 399 | PMD_SIZE * PMDS_PER_MID_PAGE); |
392 | vm_area_register_early(&vm, PMD_SIZE * PMDS_PER_MID_PAGE); | 400 | vm_area_register_early(&vm, PMD_SIZE * PMDS_PER_MID_PAGE); |
393 | pr_notice("p2m virtual area at %p, size is %lx\n", vm.addr, vm.size); | 401 | pr_notice("p2m virtual area at %p, size is %lx\n", vm.addr, vm.size); |
diff --git a/drivers/xen/Kconfig b/drivers/xen/Kconfig index b812462083fc..94d96809e686 100644 --- a/drivers/xen/Kconfig +++ b/drivers/xen/Kconfig | |||
@@ -55,6 +55,23 @@ config XEN_BALLOON_MEMORY_HOTPLUG | |||
55 | 55 | ||
56 | In that case step 3 should be omitted. | 56 | In that case step 3 should be omitted. |
57 | 57 | ||
58 | config XEN_BALLOON_MEMORY_HOTPLUG_LIMIT | ||
59 | int "Hotplugged memory limit (in GiB) for a PV guest" | ||
60 | default 512 if X86_64 | ||
61 | default 4 if X86_32 | ||
62 | range 0 64 if X86_32 | ||
63 | depends on XEN_HAVE_PVMMU | ||
64 | depends on XEN_BALLOON_MEMORY_HOTPLUG | ||
65 | help | ||
66 | Maxmium amount of memory (in GiB) that a PV guest can be | ||
67 | expanded to when using memory hotplug. | ||
68 | |||
69 | A PV guest can have more memory than this limit if is | ||
70 | started with a larger maximum. | ||
71 | |||
72 | This value is used to allocate enough space in internal | ||
73 | tables needed for physical memory administration. | ||
74 | |||
58 | config XEN_SCRUB_PAGES | 75 | config XEN_SCRUB_PAGES |
59 | bool "Scrub pages before returning them to system" | 76 | bool "Scrub pages before returning them to system" |
60 | depends on XEN_BALLOON | 77 | depends on XEN_BALLOON |
diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c index 0b52d92cb2e5..fd933695f232 100644 --- a/drivers/xen/balloon.c +++ b/drivers/xen/balloon.c | |||
@@ -229,6 +229,29 @@ static enum bp_state reserve_additional_memory(long credit) | |||
229 | balloon_hotplug = round_up(balloon_hotplug, PAGES_PER_SECTION); | 229 | balloon_hotplug = round_up(balloon_hotplug, PAGES_PER_SECTION); |
230 | nid = memory_add_physaddr_to_nid(hotplug_start_paddr); | 230 | nid = memory_add_physaddr_to_nid(hotplug_start_paddr); |
231 | 231 | ||
232 | #ifdef CONFIG_XEN_HAVE_PVMMU | ||
233 | /* | ||
234 | * add_memory() will build page tables for the new memory so | ||
235 | * the p2m must contain invalid entries so the correct | ||
236 | * non-present PTEs will be written. | ||
237 | * | ||
238 | * If a failure occurs, the original (identity) p2m entries | ||
239 | * are not restored since this region is now known not to | ||
240 | * conflict with any devices. | ||
241 | */ | ||
242 | if (!xen_feature(XENFEAT_auto_translated_physmap)) { | ||
243 | unsigned long pfn, i; | ||
244 | |||
245 | pfn = PFN_DOWN(hotplug_start_paddr); | ||
246 | for (i = 0; i < balloon_hotplug; i++) { | ||
247 | if (!set_phys_to_machine(pfn + i, INVALID_P2M_ENTRY)) { | ||
248 | pr_warn("set_phys_to_machine() failed, no memory added\n"); | ||
249 | return BP_ECANCELED; | ||
250 | } | ||
251 | } | ||
252 | } | ||
253 | #endif | ||
254 | |||
232 | rc = add_memory(nid, hotplug_start_paddr, balloon_hotplug << PAGE_SHIFT); | 255 | rc = add_memory(nid, hotplug_start_paddr, balloon_hotplug << PAGE_SHIFT); |
233 | 256 | ||
234 | if (rc) { | 257 | if (rc) { |