PCI/P2PDMA: Simplify bus address mapping API

Update the pci_p2pdma_bus_addr_map() function to take a direct pointer
to the p2pdma_provider structure instead of the pci_p2pdma_map_state.
This simplifies the API by removing the need for callers to extract
the provider from the state structure.

The change updates all callers across the kernel (block layer, IOMMU,
DMA direct, and HMM) to pass the provider pointer directly, making
the code more explicit and reducing unnecessary indirection. This
also removes the runtime warning check since callers now have direct
control over which provider they use.

Tested-by: Alex Mastro <amastro@fb.com>
Tested-by: Nicolin Chen <nicolinc@nvidia.com>
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Acked-by: Ankit Agrawal <ankita@nvidia.com>
Link: https://lore.kernel.org/r/20251120-dmabuf-vfio-v9-2-d7f71607f371@nvidia.com
Signed-off-by: Alex Williamson <alex@shazbot.org>
pull/1354/merge
Leon Romanovsky 2025-11-20 11:28:21 +02:00 committed by Alex Williamson
parent f58ef9d1d1
commit d4504262f7
5 changed files with 9 additions and 10 deletions

View File

@ -85,7 +85,7 @@ static inline bool blk_can_dma_map_iova(struct request *req,
static bool blk_dma_map_bus(struct blk_dma_iter *iter, struct phys_vec *vec) static bool blk_dma_map_bus(struct blk_dma_iter *iter, struct phys_vec *vec)
{ {
iter->addr = pci_p2pdma_bus_addr_map(&iter->p2pdma, vec->paddr); iter->addr = pci_p2pdma_bus_addr_map(iter->p2pdma.mem, vec->paddr);
iter->len = vec->len; iter->len = vec->len;
return true; return true;
} }

View File

@ -1439,8 +1439,8 @@ int iommu_dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
* as a bus address, __finalise_sg() will copy the dma * as a bus address, __finalise_sg() will copy the dma
* address into the output segment. * address into the output segment.
*/ */
s->dma_address = pci_p2pdma_bus_addr_map(&p2pdma_state, s->dma_address = pci_p2pdma_bus_addr_map(
sg_phys(s)); p2pdma_state.mem, sg_phys(s));
sg_dma_len(s) = sg->length; sg_dma_len(s) = sg->length;
sg_dma_mark_bus_address(s); sg_dma_mark_bus_address(s);
continue; continue;

View File

@ -181,16 +181,15 @@ pci_p2pdma_state(struct pci_p2pdma_map_state *state, struct device *dev,
/** /**
* pci_p2pdma_bus_addr_map - Translate a physical address to a bus address * pci_p2pdma_bus_addr_map - Translate a physical address to a bus address
* for a PCI_P2PDMA_MAP_BUS_ADDR transfer. * for a PCI_P2PDMA_MAP_BUS_ADDR transfer.
* @state: P2P state structure * @provider: P2P provider structure
* @paddr: physical address to map * @paddr: physical address to map
* *
* Map a physically contiguous PCI_P2PDMA_MAP_BUS_ADDR transfer. * Map a physically contiguous PCI_P2PDMA_MAP_BUS_ADDR transfer.
*/ */
static inline dma_addr_t static inline dma_addr_t
pci_p2pdma_bus_addr_map(struct pci_p2pdma_map_state *state, phys_addr_t paddr) pci_p2pdma_bus_addr_map(struct p2pdma_provider *provider, phys_addr_t paddr)
{ {
WARN_ON_ONCE(state->map != PCI_P2PDMA_MAP_BUS_ADDR); return paddr + provider->bus_offset;
return paddr + state->mem->bus_offset;
} }
#endif /* _LINUX_PCI_P2P_H */ #endif /* _LINUX_PCI_P2P_H */

View File

@ -479,8 +479,8 @@ int dma_direct_map_sg(struct device *dev, struct scatterlist *sgl, int nents,
} }
break; break;
case PCI_P2PDMA_MAP_BUS_ADDR: case PCI_P2PDMA_MAP_BUS_ADDR:
sg->dma_address = pci_p2pdma_bus_addr_map(&p2pdma_state, sg->dma_address = pci_p2pdma_bus_addr_map(
sg_phys(sg)); p2pdma_state.mem, sg_phys(sg));
sg_dma_mark_bus_address(sg); sg_dma_mark_bus_address(sg);
continue; continue;
default: default:

View File

@ -811,7 +811,7 @@ dma_addr_t hmm_dma_map_pfn(struct device *dev, struct hmm_dma_map *map,
break; break;
case PCI_P2PDMA_MAP_BUS_ADDR: case PCI_P2PDMA_MAP_BUS_ADDR:
pfns[idx] |= HMM_PFN_P2PDMA_BUS | HMM_PFN_DMA_MAPPED; pfns[idx] |= HMM_PFN_P2PDMA_BUS | HMM_PFN_DMA_MAPPED;
return pci_p2pdma_bus_addr_map(p2pdma_state, paddr); return pci_p2pdma_bus_addr_map(p2pdma_state->mem, paddr);
default: default:
return DMA_MAPPING_ERROR; return DMA_MAPPING_ERROR;
} }