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-20151021' of git://git.infradead.org/intel-iommu

Pull intel-iommu bugfix from David Woodhouse:
"This contains a single fix, for when the IOMMU API is used to overlay
an existing mapping comprised of 4KiB pages, with a mapping that can
use superpages.

For the *first* superpage in the new mapping, we were correctly¹
freeing the old bottom-level page table page and clearing the link to
it, before installing the superpage. For subsequent superpages,
however, we weren't. This causes a memory leak, and a warning about
setting a PTE which is already set.

¹ Well, not *entirely* correctly. We just free the page table pages
right there and then, which is wrong. In fact they should only be
freed *after* the IOTLB is flushed so we know the hardware will no
longer be looking at them.... and in fact I note that the IOTLB
flush is completely missing from the intel_iommu_map() code path,
although it needs to be there if it's permitted to overwrite
existing mappings.

Fixing those is somewhat more intrusive though, and will probably
need to wait for 4.4 at this point"

* tag 'for-linus-20151021' of git://git.infradead.org/intel-iommu:
iommu/vt-d: fix range computation when making room for large pages

+8 -4
+8 -4
drivers/iommu/intel-iommu.c
··· 2115 2115 return -ENOMEM; 2116 2116 /* It is large page*/ 2117 2117 if (largepage_lvl > 1) { 2118 + unsigned long nr_superpages, end_pfn; 2119 + 2118 2120 pteval |= DMA_PTE_LARGE_PAGE; 2119 2121 lvl_pages = lvl_to_nr_pages(largepage_lvl); 2122 + 2123 + nr_superpages = sg_res / lvl_pages; 2124 + end_pfn = iov_pfn + nr_superpages * lvl_pages - 1; 2125 + 2120 2126 /* 2121 2127 * Ensure that old small page tables are 2122 - * removed to make room for superpage, 2123 - * if they exist. 2128 + * removed to make room for superpage(s). 2124 2129 */ 2125 - dma_pte_free_pagetable(domain, iov_pfn, 2126 - iov_pfn + lvl_pages - 1); 2130 + dma_pte_free_pagetable(domain, iov_pfn, end_pfn); 2127 2131 } else { 2128 2132 pteval &= ~(uint64_t)DMA_PTE_LARGE_PAGE; 2129 2133 }