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.

xen: swiotlb: Convert mapping routine to rely on physical address

Switch to .map_phys callback instead of .map_page.

Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Link: https://lore.kernel.org/r/20251015-remove-map-page-v5-13-3bbfe3a25cdf@kernel.org

authored by

Leon Romanovsky and committed by
Marek Szyprowski
936a9f0c 33d2c5ee

+12 -8
+12 -8
drivers/xen/grant-dma-ops.c
··· 163 163 xen_grant_dma_free(dev, size, page_to_virt(vaddr), dma_handle, 0); 164 164 } 165 165 166 - static dma_addr_t xen_grant_dma_map_page(struct device *dev, struct page *page, 167 - unsigned long offset, size_t size, 166 + static dma_addr_t xen_grant_dma_map_phys(struct device *dev, phys_addr_t phys, 167 + size_t size, 168 168 enum dma_data_direction dir, 169 169 unsigned long attrs) 170 170 { 171 171 struct xen_grant_dma_data *data; 172 + unsigned long offset = offset_in_page(phys); 172 173 unsigned long dma_offset = xen_offset_in_page(offset), 173 174 pfn_offset = XEN_PFN_DOWN(offset); 174 175 unsigned int i, n_pages = XEN_PFN_UP(dma_offset + size); 175 176 grant_ref_t grant; 176 177 dma_addr_t dma_handle; 178 + 179 + if (unlikely(attrs & DMA_ATTR_MMIO)) 180 + return DMA_MAPPING_ERROR; 177 181 178 182 if (WARN_ON(dir == DMA_NONE)) 179 183 return DMA_MAPPING_ERROR; ··· 194 190 195 191 for (i = 0; i < n_pages; i++) { 196 192 gnttab_grant_foreign_access_ref(grant + i, data->backend_domid, 197 - pfn_to_gfn(page_to_xen_pfn(page) + i + pfn_offset), 193 + pfn_to_gfn(page_to_xen_pfn(phys_to_page(phys)) + i + pfn_offset), 198 194 dir == DMA_TO_DEVICE); 199 195 } 200 196 ··· 203 199 return dma_handle; 204 200 } 205 201 206 - static void xen_grant_dma_unmap_page(struct device *dev, dma_addr_t dma_handle, 202 + static void xen_grant_dma_unmap_phys(struct device *dev, dma_addr_t dma_handle, 207 203 size_t size, enum dma_data_direction dir, 208 204 unsigned long attrs) 209 205 { ··· 246 242 return; 247 243 248 244 for_each_sg(sg, s, nents, i) 249 - xen_grant_dma_unmap_page(dev, s->dma_address, sg_dma_len(s), dir, 245 + xen_grant_dma_unmap_phys(dev, s->dma_address, sg_dma_len(s), dir, 250 246 attrs); 251 247 } 252 248 ··· 261 257 return -EINVAL; 262 258 263 259 for_each_sg(sg, s, nents, i) { 264 - s->dma_address = xen_grant_dma_map_page(dev, sg_page(s), s->offset, 260 + s->dma_address = xen_grant_dma_map_phys(dev, sg_phys(s), 265 261 s->length, dir, attrs); 266 262 if (s->dma_address == DMA_MAPPING_ERROR) 267 263 goto out; ··· 290 286 .free_pages = xen_grant_dma_free_pages, 291 287 .mmap = dma_common_mmap, 292 288 .get_sgtable = dma_common_get_sgtable, 293 - .map_page = xen_grant_dma_map_page, 294 - .unmap_page = xen_grant_dma_unmap_page, 289 + .map_phys = xen_grant_dma_map_phys, 290 + .unmap_phys = xen_grant_dma_unmap_phys, 295 291 .map_sg = xen_grant_dma_map_sg, 296 292 .unmap_sg = xen_grant_dma_unmap_sg, 297 293 .dma_supported = xen_grant_dma_supported,