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 'for-linus-5.3a-rc3-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip

Pull xen fixes from Juergen Gross:

- a small cleanup

- a fix for a build error on ARM with some configs

- a fix of a patch for the Xen gntdev driver

- three patches for fixing a potential problem in the swiotlb-xen
driver which Konrad was fine with me carrying them through the Xen
tree

* tag 'for-linus-5.3a-rc3-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip:
xen/swiotlb: remember having called xen_create_contiguous_region()
xen/swiotlb: simplify range_straddles_page_boundary()
xen/swiotlb: fix condition for calling xen_destroy_contiguous_region()
xen: avoid link error on ARM
xen/gntdev.c: Replace vm_map_pages() with vm_map_pages_zero()
xen/pciback: remove set but not used variable 'old_state'

+59 -60
+1 -1
drivers/xen/gntdev.c
··· 1143 1143 goto out_put_map; 1144 1144 1145 1145 if (!use_ptemod) { 1146 - err = vm_map_pages(vma, map->pages, map->count); 1146 + err = vm_map_pages_zero(vma, map->pages, map->count); 1147 1147 if (err) 1148 1148 goto out_put_map; 1149 1149 } else {
+5 -30
drivers/xen/privcmd.c
··· 724 724 return 0; 725 725 } 726 726 727 - struct remap_pfn { 728 - struct mm_struct *mm; 729 - struct page **pages; 730 - pgprot_t prot; 731 - unsigned long i; 732 - }; 733 - 734 - static int remap_pfn_fn(pte_t *ptep, unsigned long addr, void *data) 735 - { 736 - struct remap_pfn *r = data; 737 - struct page *page = r->pages[r->i]; 738 - pte_t pte = pte_mkspecial(pfn_pte(page_to_pfn(page), r->prot)); 739 - 740 - set_pte_at(r->mm, addr, ptep, pte); 741 - r->i++; 742 - 743 - return 0; 744 - } 745 - 746 727 static long privcmd_ioctl_mmap_resource(struct file *file, void __user *udata) 747 728 { 748 729 struct privcmd_data *data = file->private_data; ··· 755 774 goto out; 756 775 } 757 776 758 - if (xen_feature(XENFEAT_auto_translated_physmap)) { 777 + if (IS_ENABLED(CONFIG_XEN_AUTO_XLATE) && 778 + xen_feature(XENFEAT_auto_translated_physmap)) { 759 779 unsigned int nr = DIV_ROUND_UP(kdata.num, XEN_PFN_PER_PAGE); 760 780 struct page **pages; 761 781 unsigned int i; ··· 790 808 if (rc) 791 809 goto out; 792 810 793 - if (xen_feature(XENFEAT_auto_translated_physmap)) { 794 - struct remap_pfn r = { 795 - .mm = vma->vm_mm, 796 - .pages = vma->vm_private_data, 797 - .prot = vma->vm_page_prot, 798 - }; 799 - 800 - rc = apply_to_page_range(r.mm, kdata.addr, 801 - kdata.num << PAGE_SHIFT, 802 - remap_pfn_fn, &r); 811 + if (IS_ENABLED(CONFIG_XEN_AUTO_XLATE) && 812 + xen_feature(XENFEAT_auto_translated_physmap)) { 813 + rc = xen_remap_vma_range(vma, kdata.addr, kdata.num << PAGE_SHIFT); 803 814 } else { 804 815 unsigned int domid = 805 816 (xdata.flags & XENMEM_rsrc_acq_caller_owned) ?
+13 -27
drivers/xen/swiotlb-xen.c
··· 83 83 return xen_phys_to_bus(virt_to_phys(address)); 84 84 } 85 85 86 - static int check_pages_physically_contiguous(unsigned long xen_pfn, 87 - unsigned int offset, 88 - size_t length) 89 - { 90 - unsigned long next_bfn; 91 - int i; 92 - int nr_pages; 93 - 94 - next_bfn = pfn_to_bfn(xen_pfn); 95 - nr_pages = (offset + length + XEN_PAGE_SIZE-1) >> XEN_PAGE_SHIFT; 96 - 97 - for (i = 1; i < nr_pages; i++) { 98 - if (pfn_to_bfn(++xen_pfn) != ++next_bfn) 99 - return 0; 100 - } 101 - return 1; 102 - } 103 - 104 86 static inline int range_straddles_page_boundary(phys_addr_t p, size_t size) 105 87 { 106 - unsigned long xen_pfn = XEN_PFN_DOWN(p); 107 - unsigned int offset = p & ~XEN_PAGE_MASK; 88 + unsigned long next_bfn, xen_pfn = XEN_PFN_DOWN(p); 89 + unsigned int i, nr_pages = XEN_PFN_UP(xen_offset_in_page(p) + size); 108 90 109 - if (offset + size <= XEN_PAGE_SIZE) 110 - return 0; 111 - if (check_pages_physically_contiguous(xen_pfn, offset, size)) 112 - return 0; 113 - return 1; 91 + next_bfn = pfn_to_bfn(xen_pfn); 92 + 93 + for (i = 1; i < nr_pages; i++) 94 + if (pfn_to_bfn(++xen_pfn) != ++next_bfn) 95 + return 1; 96 + 97 + return 0; 114 98 } 115 99 116 100 static int is_xen_swiotlb_buffer(dma_addr_t dma_addr) ··· 322 338 xen_free_coherent_pages(hwdev, size, ret, (dma_addr_t)phys, attrs); 323 339 return NULL; 324 340 } 341 + SetPageXenRemapped(virt_to_page(ret)); 325 342 } 326 343 memset(ret, 0, size); 327 344 return ret; ··· 346 361 /* Convert the size to actually allocated. */ 347 362 size = 1UL << (order + XEN_PAGE_SHIFT); 348 363 349 - if (((dev_addr + size - 1 <= dma_mask)) || 350 - range_straddles_page_boundary(phys, size)) 364 + if (!WARN_ON((dev_addr + size - 1 > dma_mask) || 365 + range_straddles_page_boundary(phys, size)) && 366 + TestClearPageXenRemapped(virt_to_page(vaddr))) 351 367 xen_destroy_contiguous_region(phys, order); 352 368 353 369 xen_free_coherent_pages(hwdev, size, vaddr, (dma_addr_t)phys, attrs);
+1 -2
drivers/xen/xen-pciback/conf_space_capability.c
··· 116 116 { 117 117 int err; 118 118 u16 old_value; 119 - pci_power_t new_state, old_state; 119 + pci_power_t new_state; 120 120 121 121 err = pci_read_config_word(dev, offset, &old_value); 122 122 if (err) 123 123 goto out; 124 124 125 - old_state = (pci_power_t)(old_value & PCI_PM_CTRL_STATE_MASK); 126 125 new_state = (pci_power_t)(new_value & PCI_PM_CTRL_STATE_MASK); 127 126 128 127 new_value &= PM_OK_BITS;
+32
drivers/xen/xlate_mmu.c
··· 262 262 return 0; 263 263 } 264 264 EXPORT_SYMBOL_GPL(xen_xlate_map_ballooned_pages); 265 + 266 + struct remap_pfn { 267 + struct mm_struct *mm; 268 + struct page **pages; 269 + pgprot_t prot; 270 + unsigned long i; 271 + }; 272 + 273 + static int remap_pfn_fn(pte_t *ptep, unsigned long addr, void *data) 274 + { 275 + struct remap_pfn *r = data; 276 + struct page *page = r->pages[r->i]; 277 + pte_t pte = pte_mkspecial(pfn_pte(page_to_pfn(page), r->prot)); 278 + 279 + set_pte_at(r->mm, addr, ptep, pte); 280 + r->i++; 281 + 282 + return 0; 283 + } 284 + 285 + /* Used by the privcmd module, but has to be built-in on ARM */ 286 + int xen_remap_vma_range(struct vm_area_struct *vma, unsigned long addr, unsigned long len) 287 + { 288 + struct remap_pfn r = { 289 + .mm = vma->vm_mm, 290 + .pages = vma->vm_private_data, 291 + .prot = vma->vm_page_prot, 292 + }; 293 + 294 + return apply_to_page_range(vma->vm_mm, addr, len, remap_pfn_fn, &r); 295 + } 296 + EXPORT_SYMBOL_GPL(xen_remap_vma_range);
+4
include/linux/page-flags.h
··· 152 152 PG_savepinned = PG_dirty, 153 153 /* Has a grant mapping of another (foreign) domain's page. */ 154 154 PG_foreign = PG_owner_priv_1, 155 + /* Remapped by swiotlb-xen. */ 156 + PG_xen_remapped = PG_owner_priv_1, 155 157 156 158 /* SLOB */ 157 159 PG_slob_free = PG_private, ··· 331 329 TESTSCFLAG(Pinned, pinned, PF_NO_COMPOUND) 332 330 PAGEFLAG(SavePinned, savepinned, PF_NO_COMPOUND); 333 331 PAGEFLAG(Foreign, foreign, PF_NO_COMPOUND); 332 + PAGEFLAG(XenRemapped, xen_remapped, PF_NO_COMPOUND) 333 + TESTCLEARFLAG(XenRemapped, xen_remapped, PF_NO_COMPOUND) 334 334 335 335 PAGEFLAG(Reserved, reserved, PF_NO_COMPOUND) 336 336 __CLEARPAGEFLAG(Reserved, reserved, PF_NO_COMPOUND)
+3
include/xen/xen-ops.h
··· 109 109 } 110 110 #endif 111 111 112 + int xen_remap_vma_range(struct vm_area_struct *vma, unsigned long addr, 113 + unsigned long len); 114 + 112 115 /* 113 116 * xen_remap_domain_gfn_array() - map an array of foreign frames by gfn 114 117 * @vma: VMA to map the pages into