Skip to content

Commit 936a9f0

Browse files
rleonmszyprow
authored andcommitted
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
1 parent 33d2c5e commit 936a9f0

1 file changed

Lines changed: 12 additions & 8 deletions

File tree

drivers/xen/grant-dma-ops.c

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -163,18 +163,22 @@ static void xen_grant_dma_free_pages(struct device *dev, size_t size,
163163
xen_grant_dma_free(dev, size, page_to_virt(vaddr), dma_handle, 0);
164164
}
165165

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,
168168
enum dma_data_direction dir,
169169
unsigned long attrs)
170170
{
171171
struct xen_grant_dma_data *data;
172+
unsigned long offset = offset_in_page(phys);
172173
unsigned long dma_offset = xen_offset_in_page(offset),
173174
pfn_offset = XEN_PFN_DOWN(offset);
174175
unsigned int i, n_pages = XEN_PFN_UP(dma_offset + size);
175176
grant_ref_t grant;
176177
dma_addr_t dma_handle;
177178

179+
if (unlikely(attrs & DMA_ATTR_MMIO))
180+
return DMA_MAPPING_ERROR;
181+
178182
if (WARN_ON(dir == DMA_NONE))
179183
return DMA_MAPPING_ERROR;
180184

@@ -190,7 +194,7 @@ static dma_addr_t xen_grant_dma_map_page(struct device *dev, struct page *page,
190194

191195
for (i = 0; i < n_pages; i++) {
192196
gnttab_grant_foreign_access_ref(grant + i, data->backend_domid,
193-
pfn_to_gfn(page_to_xen_pfn(page) + i + pfn_offset),
197+
pfn_to_gfn(page_to_xen_pfn(phys_to_page(phys)) + i + pfn_offset),
194198
dir == DMA_TO_DEVICE);
195199
}
196200

@@ -199,7 +203,7 @@ static dma_addr_t xen_grant_dma_map_page(struct device *dev, struct page *page,
199203
return dma_handle;
200204
}
201205

202-
static void xen_grant_dma_unmap_page(struct device *dev, dma_addr_t dma_handle,
206+
static void xen_grant_dma_unmap_phys(struct device *dev, dma_addr_t dma_handle,
203207
size_t size, enum dma_data_direction dir,
204208
unsigned long attrs)
205209
{
@@ -242,7 +246,7 @@ static void xen_grant_dma_unmap_sg(struct device *dev, struct scatterlist *sg,
242246
return;
243247

244248
for_each_sg(sg, s, nents, i)
245-
xen_grant_dma_unmap_page(dev, s->dma_address, sg_dma_len(s), dir,
249+
xen_grant_dma_unmap_phys(dev, s->dma_address, sg_dma_len(s), dir,
246250
attrs);
247251
}
248252

@@ -257,7 +261,7 @@ static int xen_grant_dma_map_sg(struct device *dev, struct scatterlist *sg,
257261
return -EINVAL;
258262

259263
for_each_sg(sg, s, nents, i) {
260-
s->dma_address = xen_grant_dma_map_page(dev, sg_page(s), s->offset,
264+
s->dma_address = xen_grant_dma_map_phys(dev, sg_phys(s),
261265
s->length, dir, attrs);
262266
if (s->dma_address == DMA_MAPPING_ERROR)
263267
goto out;
@@ -286,8 +290,8 @@ static const struct dma_map_ops xen_grant_dma_ops = {
286290
.free_pages = xen_grant_dma_free_pages,
287291
.mmap = dma_common_mmap,
288292
.get_sgtable = dma_common_get_sgtable,
289-
.map_page = xen_grant_dma_map_page,
290-
.unmap_page = xen_grant_dma_unmap_page,
293+
.map_phys = xen_grant_dma_map_phys,
294+
.unmap_phys = xen_grant_dma_unmap_phys,
291295
.map_sg = xen_grant_dma_map_sg,
292296
.unmap_sg = xen_grant_dma_unmap_sg,
293297
.dma_supported = xen_grant_dma_supported,

0 commit comments

Comments
 (0)