Merge tag 'for-linus-5.9-rc4-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip

Pull xen updates from Juergen Gross:
"A small series for fixing a problem with Xen PVH guests when running
as backends (e.g. as dom0).

Mapping other guests' memory is now working via ZONE_DEVICE, thus not
requiring to abuse the memory hotplug functionality for that purpose"

* tag 'for-linus-5.9-rc4-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip:
xen: add helpers to allocate unpopulated memory
memremap: rename MEMORY_DEVICE_DEVDAX to MEMORY_DEVICE_GENERIC
xen/balloon: add header guard

+229 -22
+1 -1
drivers/dax/device.c
··· 429 return -EBUSY; 430 } 431 432 - dev_dax->pgmap.type = MEMORY_DEVICE_DEVDAX; 433 addr = devm_memremap_pages(dev, &dev_dax->pgmap); 434 if (IS_ERR(addr)) 435 return PTR_ERR(addr);
··· 429 return -EBUSY; 430 } 431 432 + dev_dax->pgmap.type = MEMORY_DEVICE_GENERIC; 433 addr = devm_memremap_pages(dev, &dev_dax->pgmap); 434 if (IS_ERR(addr)) 435 return PTR_ERR(addr);
+5 -4
drivers/gpu/drm/xen/xen_drm_front_gem.c
··· 18 #include <drm/drm_probe_helper.h> 19 20 #include <xen/balloon.h> 21 22 #include "xen_drm_front.h" 23 #include "xen_drm_front_gem.h" ··· 100 * allocate ballooned pages which will be used to map 101 * grant references provided by the backend 102 */ 103 - ret = alloc_xenballooned_pages(xen_obj->num_pages, 104 - xen_obj->pages); 105 if (ret < 0) { 106 DRM_ERROR("Cannot allocate %zu ballooned pages: %d\n", 107 xen_obj->num_pages, ret); ··· 153 } else { 154 if (xen_obj->pages) { 155 if (xen_obj->be_alloc) { 156 - free_xenballooned_pages(xen_obj->num_pages, 157 - xen_obj->pages); 158 gem_free_pages_array(xen_obj); 159 } else { 160 drm_gem_put_pages(&xen_obj->base,
··· 18 #include <drm/drm_probe_helper.h> 19 20 #include <xen/balloon.h> 21 + #include <xen/xen.h> 22 23 #include "xen_drm_front.h" 24 #include "xen_drm_front_gem.h" ··· 99 * allocate ballooned pages which will be used to map 100 * grant references provided by the backend 101 */ 102 + ret = xen_alloc_unpopulated_pages(xen_obj->num_pages, 103 + xen_obj->pages); 104 if (ret < 0) { 105 DRM_ERROR("Cannot allocate %zu ballooned pages: %d\n", 106 xen_obj->num_pages, ret); ··· 152 } else { 153 if (xen_obj->pages) { 154 if (xen_obj->be_alloc) { 155 + xen_free_unpopulated_pages(xen_obj->num_pages, 156 + xen_obj->pages); 157 gem_free_pages_array(xen_obj); 158 } else { 159 drm_gem_put_pages(&xen_obj->base,
+10
drivers/xen/Kconfig
··· 325 config XEN_FRONT_PGDIR_SHBUF 326 tristate 327 328 endmenu
··· 325 config XEN_FRONT_PGDIR_SHBUF 326 tristate 327 328 + config XEN_UNPOPULATED_ALLOC 329 + bool "Use unpopulated memory ranges for guest mappings" 330 + depends on X86 && ZONE_DEVICE 331 + default XEN_BACKEND || XEN_GNTDEV || XEN_DOM0 332 + help 333 + Use unpopulated memory ranges in order to create mappings for guest 334 + memory regions, including grant maps and foreign pages. This avoids 335 + having to balloon out RAM regions in order to obtain physical memory 336 + space to create such mappings. 337 + 338 endmenu
+1
drivers/xen/Makefile
··· 41 xen-gntalloc-y := gntalloc.o 42 xen-privcmd-y := privcmd.o privcmd-buf.o 43 obj-$(CONFIG_XEN_FRONT_PGDIR_SHBUF) += xen-front-pgdir-shbuf.o
··· 41 xen-gntalloc-y := gntalloc.o 42 xen-privcmd-y := privcmd.o privcmd-buf.o 43 obj-$(CONFIG_XEN_FRONT_PGDIR_SHBUF) += xen-front-pgdir-shbuf.o 44 + obj-$(CONFIG_XEN_UNPOPULATED_ALLOC) += unpopulated-alloc.o
+2 -2
drivers/xen/balloon.c
··· 653 } 654 EXPORT_SYMBOL(free_xenballooned_pages); 655 656 - #ifdef CONFIG_XEN_PV 657 static void __init balloon_add_region(unsigned long start_pfn, 658 unsigned long pages) 659 { ··· 707 register_sysctl_table(xen_root); 708 #endif 709 710 - #ifdef CONFIG_XEN_PV 711 { 712 int i; 713
··· 653 } 654 EXPORT_SYMBOL(free_xenballooned_pages); 655 656 + #if defined(CONFIG_XEN_PV) && !defined(CONFIG_XEN_UNPOPULATED_ALLOC) 657 static void __init balloon_add_region(unsigned long start_pfn, 658 unsigned long pages) 659 { ··· 707 register_sysctl_table(xen_root); 708 #endif 709 710 + #if defined(CONFIG_XEN_PV) && !defined(CONFIG_XEN_UNPOPULATED_ALLOC) 711 { 712 int i; 713
+2 -2
drivers/xen/grant-table.c
··· 801 { 802 int ret; 803 804 - ret = alloc_xenballooned_pages(nr_pages, pages); 805 if (ret < 0) 806 return ret; 807 ··· 836 void gnttab_free_pages(int nr_pages, struct page **pages) 837 { 838 gnttab_pages_clear_private(nr_pages, pages); 839 - free_xenballooned_pages(nr_pages, pages); 840 } 841 EXPORT_SYMBOL_GPL(gnttab_free_pages); 842
··· 801 { 802 int ret; 803 804 + ret = xen_alloc_unpopulated_pages(nr_pages, pages); 805 if (ret < 0) 806 return ret; 807 ··· 836 void gnttab_free_pages(int nr_pages, struct page **pages) 837 { 838 gnttab_pages_clear_private(nr_pages, pages); 839 + xen_free_unpopulated_pages(nr_pages, pages); 840 } 841 EXPORT_SYMBOL_GPL(gnttab_free_pages); 842
+2 -2
drivers/xen/privcmd.c
··· 424 if (pages == NULL) 425 return -ENOMEM; 426 427 - rc = alloc_xenballooned_pages(numpgs, pages); 428 if (rc != 0) { 429 pr_warn("%s Could not alloc %d pfns rc:%d\n", __func__, 430 numpgs, rc); ··· 895 896 rc = xen_unmap_domain_gfn_range(vma, numgfns, pages); 897 if (rc == 0) 898 - free_xenballooned_pages(numpgs, pages); 899 else 900 pr_crit("unable to unmap MFN range: leaking %d pages. rc=%d\n", 901 numpgs, rc);
··· 424 if (pages == NULL) 425 return -ENOMEM; 426 427 + rc = xen_alloc_unpopulated_pages(numpgs, pages); 428 if (rc != 0) { 429 pr_warn("%s Could not alloc %d pfns rc:%d\n", __func__, 430 numpgs, rc); ··· 895 896 rc = xen_unmap_domain_gfn_range(vma, numgfns, pages); 897 if (rc == 0) 898 + xen_free_unpopulated_pages(numpgs, pages); 899 else 900 pr_crit("unable to unmap MFN range: leaking %d pages. rc=%d\n", 901 numpgs, rc);
+183
drivers/xen/unpopulated-alloc.c
···
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + #include <linux/errno.h> 3 + #include <linux/gfp.h> 4 + #include <linux/kernel.h> 5 + #include <linux/mm.h> 6 + #include <linux/memremap.h> 7 + #include <linux/slab.h> 8 + 9 + #include <asm/page.h> 10 + 11 + #include <xen/page.h> 12 + #include <xen/xen.h> 13 + 14 + static DEFINE_MUTEX(list_lock); 15 + static LIST_HEAD(page_list); 16 + static unsigned int list_count; 17 + 18 + static int fill_list(unsigned int nr_pages) 19 + { 20 + struct dev_pagemap *pgmap; 21 + void *vaddr; 22 + unsigned int i, alloc_pages = round_up(nr_pages, PAGES_PER_SECTION); 23 + int ret; 24 + 25 + pgmap = kzalloc(sizeof(*pgmap), GFP_KERNEL); 26 + if (!pgmap) 27 + return -ENOMEM; 28 + 29 + pgmap->type = MEMORY_DEVICE_GENERIC; 30 + pgmap->res.name = "Xen scratch"; 31 + pgmap->res.flags = IORESOURCE_MEM | IORESOURCE_BUSY; 32 + 33 + ret = allocate_resource(&iomem_resource, &pgmap->res, 34 + alloc_pages * PAGE_SIZE, 0, -1, 35 + PAGES_PER_SECTION * PAGE_SIZE, NULL, NULL); 36 + if (ret < 0) { 37 + pr_err("Cannot allocate new IOMEM resource\n"); 38 + kfree(pgmap); 39 + return ret; 40 + } 41 + 42 + #ifdef CONFIG_XEN_HAVE_PVMMU 43 + /* 44 + * memremap will build page tables for the new memory so 45 + * the p2m must contain invalid entries so the correct 46 + * non-present PTEs will be written. 47 + * 48 + * If a failure occurs, the original (identity) p2m entries 49 + * are not restored since this region is now known not to 50 + * conflict with any devices. 51 + */ 52 + if (!xen_feature(XENFEAT_auto_translated_physmap)) { 53 + xen_pfn_t pfn = PFN_DOWN(pgmap->res.start); 54 + 55 + for (i = 0; i < alloc_pages; i++) { 56 + if (!set_phys_to_machine(pfn + i, INVALID_P2M_ENTRY)) { 57 + pr_warn("set_phys_to_machine() failed, no memory added\n"); 58 + release_resource(&pgmap->res); 59 + kfree(pgmap); 60 + return -ENOMEM; 61 + } 62 + } 63 + } 64 + #endif 65 + 66 + vaddr = memremap_pages(pgmap, NUMA_NO_NODE); 67 + if (IS_ERR(vaddr)) { 68 + pr_err("Cannot remap memory range\n"); 69 + release_resource(&pgmap->res); 70 + kfree(pgmap); 71 + return PTR_ERR(vaddr); 72 + } 73 + 74 + for (i = 0; i < alloc_pages; i++) { 75 + struct page *pg = virt_to_page(vaddr + PAGE_SIZE * i); 76 + 77 + BUG_ON(!virt_addr_valid(vaddr + PAGE_SIZE * i)); 78 + list_add(&pg->lru, &page_list); 79 + list_count++; 80 + } 81 + 82 + return 0; 83 + } 84 + 85 + /** 86 + * xen_alloc_unpopulated_pages - alloc unpopulated pages 87 + * @nr_pages: Number of pages 88 + * @pages: pages returned 89 + * @return 0 on success, error otherwise 90 + */ 91 + int xen_alloc_unpopulated_pages(unsigned int nr_pages, struct page **pages) 92 + { 93 + unsigned int i; 94 + int ret = 0; 95 + 96 + mutex_lock(&list_lock); 97 + if (list_count < nr_pages) { 98 + ret = fill_list(nr_pages - list_count); 99 + if (ret) 100 + goto out; 101 + } 102 + 103 + for (i = 0; i < nr_pages; i++) { 104 + struct page *pg = list_first_entry_or_null(&page_list, 105 + struct page, 106 + lru); 107 + 108 + BUG_ON(!pg); 109 + list_del(&pg->lru); 110 + list_count--; 111 + pages[i] = pg; 112 + 113 + #ifdef CONFIG_XEN_HAVE_PVMMU 114 + if (!xen_feature(XENFEAT_auto_translated_physmap)) { 115 + ret = xen_alloc_p2m_entry(page_to_pfn(pg)); 116 + if (ret < 0) { 117 + unsigned int j; 118 + 119 + for (j = 0; j <= i; j++) { 120 + list_add(&pages[j]->lru, &page_list); 121 + list_count++; 122 + } 123 + goto out; 124 + } 125 + } 126 + #endif 127 + } 128 + 129 + out: 130 + mutex_unlock(&list_lock); 131 + return ret; 132 + } 133 + EXPORT_SYMBOL(xen_alloc_unpopulated_pages); 134 + 135 + /** 136 + * xen_free_unpopulated_pages - return unpopulated pages 137 + * @nr_pages: Number of pages 138 + * @pages: pages to return 139 + */ 140 + void xen_free_unpopulated_pages(unsigned int nr_pages, struct page **pages) 141 + { 142 + unsigned int i; 143 + 144 + mutex_lock(&list_lock); 145 + for (i = 0; i < nr_pages; i++) { 146 + list_add(&pages[i]->lru, &page_list); 147 + list_count++; 148 + } 149 + mutex_unlock(&list_lock); 150 + } 151 + EXPORT_SYMBOL(xen_free_unpopulated_pages); 152 + 153 + #ifdef CONFIG_XEN_PV 154 + static int __init init(void) 155 + { 156 + unsigned int i; 157 + 158 + if (!xen_domain()) 159 + return -ENODEV; 160 + 161 + if (!xen_pv_domain()) 162 + return 0; 163 + 164 + /* 165 + * Initialize with pages from the extra memory regions (see 166 + * arch/x86/xen/setup.c). 167 + */ 168 + for (i = 0; i < XEN_EXTRA_MEM_MAX_REGIONS; i++) { 169 + unsigned int j; 170 + 171 + for (j = 0; j < xen_extra_mem[i].n_pfns; j++) { 172 + struct page *pg = 173 + pfn_to_page(xen_extra_mem[i].start_pfn + j); 174 + 175 + list_add(&pg->lru, &page_list); 176 + list_count++; 177 + } 178 + } 179 + 180 + return 0; 181 + } 182 + subsys_initcall(init); 183 + #endif
+3 -3
drivers/xen/xenbus/xenbus_client.c
··· 621 bool leaked = false; 622 unsigned int nr_pages = XENBUS_PAGES(nr_grefs); 623 624 - err = alloc_xenballooned_pages(nr_pages, node->hvm.pages); 625 if (err) 626 goto out_err; 627 ··· 662 addr, nr_pages); 663 out_free_ballooned_pages: 664 if (!leaked) 665 - free_xenballooned_pages(nr_pages, node->hvm.pages); 666 out_err: 667 return err; 668 } ··· 858 info.addrs); 859 if (!rv) { 860 vunmap(vaddr); 861 - free_xenballooned_pages(nr_pages, node->hvm.pages); 862 } 863 else 864 WARN(1, "Leaking %p, size %u page(s)\n", vaddr, nr_pages);
··· 621 bool leaked = false; 622 unsigned int nr_pages = XENBUS_PAGES(nr_grefs); 623 624 + err = xen_alloc_unpopulated_pages(nr_pages, node->hvm.pages); 625 if (err) 626 goto out_err; 627 ··· 662 addr, nr_pages); 663 out_free_ballooned_pages: 664 if (!leaked) 665 + xen_free_unpopulated_pages(nr_pages, node->hvm.pages); 666 out_err: 667 return err; 668 } ··· 858 info.addrs); 859 if (!rv) { 860 vunmap(vaddr); 861 + xen_free_unpopulated_pages(nr_pages, node->hvm.pages); 862 } 863 else 864 WARN(1, "Leaking %p, size %u page(s)\n", vaddr, nr_pages);
+2 -2
drivers/xen/xlate_mmu.c
··· 232 kfree(pages); 233 return -ENOMEM; 234 } 235 - rc = alloc_xenballooned_pages(nr_pages, pages); 236 if (rc) { 237 pr_warn("%s Couldn't balloon alloc %ld pages rc:%d\n", __func__, 238 nr_pages, rc); ··· 249 if (!vaddr) { 250 pr_warn("%s Couldn't map %ld pages rc:%d\n", __func__, 251 nr_pages, rc); 252 - free_xenballooned_pages(nr_pages, pages); 253 kfree(pages); 254 kfree(pfns); 255 return -ENOMEM;
··· 232 kfree(pages); 233 return -ENOMEM; 234 } 235 + rc = xen_alloc_unpopulated_pages(nr_pages, pages); 236 if (rc) { 237 pr_warn("%s Couldn't balloon alloc %ld pages rc:%d\n", __func__, 238 nr_pages, rc); ··· 249 if (!vaddr) { 250 pr_warn("%s Couldn't map %ld pages rc:%d\n", __func__, 251 nr_pages, rc); 252 + xen_free_unpopulated_pages(nr_pages, pages); 253 kfree(pages); 254 kfree(pfns); 255 return -ENOMEM;
+4 -5
include/linux/memremap.h
··· 46 * wakeup is used to coordinate physical address space management (ex: 47 * fs truncate/hole punch) vs pinned pages (ex: device dma). 48 * 49 - * MEMORY_DEVICE_DEVDAX: 50 * Host memory that has similar access semantics as System RAM i.e. DMA 51 - * coherent and supports page pinning. In contrast to 52 - * MEMORY_DEVICE_FS_DAX, this memory is access via a device-dax 53 - * character device. 54 * 55 * MEMORY_DEVICE_PCI_P2PDMA: 56 * Device memory residing in a PCI BAR intended for use with Peer-to-Peer ··· 59 /* 0 is reserved to catch uninitialized type fields */ 60 MEMORY_DEVICE_PRIVATE = 1, 61 MEMORY_DEVICE_FS_DAX, 62 - MEMORY_DEVICE_DEVDAX, 63 MEMORY_DEVICE_PCI_P2PDMA, 64 }; 65
··· 46 * wakeup is used to coordinate physical address space management (ex: 47 * fs truncate/hole punch) vs pinned pages (ex: device dma). 48 * 49 + * MEMORY_DEVICE_GENERIC: 50 * Host memory that has similar access semantics as System RAM i.e. DMA 51 + * coherent and supports page pinning. This is for example used by DAX devices 52 + * that expose memory using a character device. 53 * 54 * MEMORY_DEVICE_PCI_P2PDMA: 55 * Device memory residing in a PCI BAR intended for use with Peer-to-Peer ··· 60 /* 0 is reserved to catch uninitialized type fields */ 61 MEMORY_DEVICE_PRIVATE = 1, 62 MEMORY_DEVICE_FS_DAX, 63 + MEMORY_DEVICE_GENERIC, 64 MEMORY_DEVICE_PCI_P2PDMA, 65 }; 66
+4
include/xen/balloon.h
··· 2 /****************************************************************************** 3 * Xen balloon functionality 4 */ 5 6 #define RETRY_UNLIMITED 0 7 ··· 36 { 37 } 38 #endif
··· 2 /****************************************************************************** 3 * Xen balloon functionality 4 */ 5 + #ifndef _XEN_BALLOON_H 6 + #define _XEN_BALLOON_H 7 8 #define RETRY_UNLIMITED 0 9 ··· 34 { 35 } 36 #endif 37 + 38 + #endif /* _XEN_BALLOON_H */
+9
include/xen/xen.h
··· 52 extern u64 xen_saved_max_mem_size; 53 #endif 54 55 #endif /* _XEN_XEN_H */
··· 52 extern u64 xen_saved_max_mem_size; 53 #endif 54 55 + #ifdef CONFIG_XEN_UNPOPULATED_ALLOC 56 + int xen_alloc_unpopulated_pages(unsigned int nr_pages, struct page **pages); 57 + void xen_free_unpopulated_pages(unsigned int nr_pages, struct page **pages); 58 + #else 59 + #define xen_alloc_unpopulated_pages alloc_xenballooned_pages 60 + #define xen_free_unpopulated_pages free_xenballooned_pages 61 + #include <xen/balloon.h> 62 + #endif 63 + 64 #endif /* _XEN_XEN_H */
+1 -1
mm/memremap.c
··· 216 return ERR_PTR(-EINVAL); 217 } 218 break; 219 - case MEMORY_DEVICE_DEVDAX: 220 need_devmap_managed = false; 221 break; 222 case MEMORY_DEVICE_PCI_P2PDMA:
··· 216 return ERR_PTR(-EINVAL); 217 } 218 break; 219 + case MEMORY_DEVICE_GENERIC: 220 need_devmap_managed = false; 221 break; 222 case MEMORY_DEVICE_PCI_P2PDMA: