NACK/Cmnt: [SRU][PATCH 11/13] swiotlb: remove the tbl_dma_addr argument to swiotlb_tbl_map_single
Stefan Bader
stefan.bader at canonical.com
Tue Oct 12 08:11:27 UTC 2021
On 07.10.21 20:06, Khalid Elmously wrote:
> From: Christoph Hellwig <hch at lst.de>
>
> BugLink: https://bugs.launchpad.net/bugs/1943902
>
> The tbl_dma_addr argument is used to check the DMA boundary for the
> allocations, and thus needs to be a dma_addr_t. swiotlb-xen instead
> passed a physical address, which could lead to incorrect results for
> strange offsets. Fix this by removing the parameter entirely and hard
> code the DMA address for io_tlb_start instead.
>
> Fixes: 91ffe4ad534a ("swiotlb-xen: introduce phys_to_dma/dma_to_phys translations")
> Signed-off-by: Christoph Hellwig <hch at lst.de>
> Reviewed-by: Stefano Stabellini <sstabellini at kernel.org>
> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk at oracle.com>
> (backported from commit fc0021aa340af65a0a37d77be39e22aa886a6132)
> [ kmously: context changes, variables had been renamed in swiotlb-xen.c,
> and drivers/iommu/intel/iommu.c moved to drivers/iommu/intel-iommu.c ]
> Signed-off-by: Khalid Elmously <khalid.elmously at canonical.com>
> ---
> drivers/iommu/intel-iommu.c | 1 -
> drivers/xen/swiotlb-xen.c | 3 +--
> include/linux/swiotlb.h | 10 +++-------
> kernel/dma/swiotlb.c | 8 +++-----
> 4 files changed, 7 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
> index ebb874fe6dbb4..2a1409e380485 100644
> --- a/drivers/iommu/intel-iommu.c
> +++ b/drivers/iommu/intel-iommu.c
> @@ -3872,7 +3872,6 @@ bounce_map_single(struct device *dev, phys_addr_t paddr, size_t size,
> */
> if (!IS_ALIGNED(paddr | size, VTD_PAGE_SIZE)) {
> tlb_addr = swiotlb_tbl_map_single(dev,
> - __phys_to_dma(dev, io_tlb_start),
> paddr, size, aligned_size, dir, attrs);
> if (tlb_addr == DMA_MAPPING_ERROR) {
> goto swiotlb_error;
> diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c
> index 06346422f7432..32b92b733da1f 100644
> --- a/drivers/xen/swiotlb-xen.c
> +++ b/drivers/xen/swiotlb-xen.c
> @@ -392,8 +392,7 @@ static dma_addr_t xen_swiotlb_map_page(struct device *dev, struct page *page,
> */
> trace_swiotlb_bounced(dev, dev_addr, size, swiotlb_force);
>
> - map = swiotlb_tbl_map_single(dev, start_dma_addr, phys,
> - size, size, dir, attrs);
> + map = swiotlb_tbl_map_single(dev, phys, size, size, dir, attrs);
> if (map == (phys_addr_t)DMA_MAPPING_ERROR)
> return DMA_MAPPING_ERROR;
>
> diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h
> index f7aadd297aa98..c7b08840a4ac1 100644
> --- a/include/linux/swiotlb.h
> +++ b/include/linux/swiotlb.h
> @@ -46,13 +46,9 @@ enum dma_sync_target {
> SYNC_FOR_DEVICE = 1,
> };
>
> -extern phys_addr_t swiotlb_tbl_map_single(struct device *hwdev,
> - dma_addr_t tbl_dma_addr,
> - phys_addr_t phys,
> - size_t mapping_size,
> - size_t alloc_size,
> - enum dma_data_direction dir,
> - unsigned long attrs);
> +phys_addr_t swiotlb_tbl_map_single(struct device *hwdev, phys_addr_t phys,
> + size_t mapping_size, size_t alloc_size,
> + enum dma_data_direction dir, unsigned long attrs);
>
> extern void swiotlb_tbl_unmap_single(struct device *hwdev,
> phys_addr_t tlb_addr,
> diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c
> index 5474376542b5a..e8a705b6896fe 100644
> --- a/kernel/dma/swiotlb.c
> +++ b/kernel/dma/swiotlb.c
> @@ -559,9 +559,8 @@ static int find_slots(struct device *dev, phys_addr_t orig_addr,
> return index;
> }
>
> -phys_addr_t swiotlb_tbl_map_single(struct device *dev, dma_addr_t dma_addr,
> - phys_addr_t orig_addr, size_t mapping_size,
> - size_t alloc_size,
> +phys_addr_t swiotlb_tbl_map_single(struct device *dev, phys_addr_t orig_addr,
> + size_t mapping_size, size_t alloc_size,
> enum dma_data_direction dir,
> unsigned long attrs)
> {
I think you are missing a piece of the patch here. The dma_addr argument gets
dropped but not set.
-phys_addr_t swiotlb_tbl_map_single(struct device *hwdev,
- dma_addr_t tbl_dma_addr,
- phys_addr_t orig_addr,
- size_t mapping_size,
- size_t alloc_size,
- enum dma_data_direction dir,
- unsigned long attrs)
+phys_addr_t swiotlb_tbl_map_single(struct device *hwdev, phys_addr_t orig_addr,
+ size_t mapping_size, size_t alloc_size,
+ enum dma_data_direction dir, unsigned long attrs)
{
+ dma_addr_t tbl_dma_addr = phys_to_dma_unencrypted(hwdev, io_tlb_start);
^ I would expect a backport of this line in the patch...
> @@ -706,8 +705,7 @@ bool swiotlb_map(struct device *dev, phys_addr_t *phys, dma_addr_t *dma_addr,
> }
>
> /* Oh well, have to allocate and map a bounce buffer. */
> - *phys = swiotlb_tbl_map_single(dev, __phys_to_dma(dev, io_tlb_start),
> - *phys, size, size, dir, attrs);
> + *phys = swiotlb_tbl_map_single(dev, *phys, size, size, dir, attrs);
> if (*phys == (phys_addr_t)DMA_MAPPING_ERROR)
> return false;
>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://lists.ubuntu.com/archives/kernel-team/attachments/20211012/5e41470f/attachment-0001.sig>
More information about the kernel-team
mailing list