Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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

+49 -1
+9 -1
arch/x86/xen/p2m.c
··· 91 91 unsigned long xen_max_p2m_pfn __read_mostly; 92 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 100 static DEFINE_SPINLOCK(p2m_update_lock); 95 101 96 102 static unsigned long *p2m_mid_missing_mfn; ··· 391 385 void __init xen_vmalloc_p2m_tree(void) 392 386 { 393 387 static struct vm_struct vm; 388 + unsigned long p2m_limit; 394 389 390 + p2m_limit = (phys_addr_t)P2M_LIMIT * 1024 * 1024 * 1024 / PAGE_SIZE; 395 391 vm.flags = VM_ALLOC; 396 - vm.size = ALIGN(sizeof(unsigned long) * xen_max_p2m_pfn, 392 + vm.size = ALIGN(sizeof(unsigned long) * max(xen_max_p2m_pfn, p2m_limit), 397 393 PMD_SIZE * PMDS_PER_MID_PAGE); 398 394 vm_area_register_early(&vm, PMD_SIZE * PMDS_PER_MID_PAGE); 399 395 pr_notice("p2m virtual area at %p, size is %lx\n", vm.addr, vm.size);
+17
drivers/xen/Kconfig
··· 55 55 56 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 75 config XEN_SCRUB_PAGES 59 76 bool "Scrub pages before returning them to system" 60 77 depends on XEN_BALLOON
+23
drivers/xen/balloon.c
··· 229 229 balloon_hotplug = round_up(balloon_hotplug, PAGES_PER_SECTION); 230 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 255 rc = add_memory(nid, hotplug_start_paddr, balloon_hotplug << PAGE_SHIFT); 233 256 234 257 if (rc) {