[PATCH v6 15/17] iommu/dma: Force bouncing if the size is not cacheline-aligned
Robin Murphy
robin.murphy at arm.com
Fri Jun 9 04:52:27 PDT 2023
On 2023-05-31 16:48, Catalin Marinas wrote:
[...]
> diff --git a/include/linux/scatterlist.h b/include/linux/scatterlist.h
> index 2f06178996ba..69d87e312263 100644
> --- a/include/linux/scatterlist.h
> +++ b/include/linux/scatterlist.h
> @@ -251,11 +251,13 @@ static inline void sg_unmark_end(struct scatterlist *sg)
> /*
> * One 64-bit architectures there is a 4-byte padding in struct scatterlist
> * (assuming also CONFIG_NEED_SG_DMA_LENGTH is set). Use this padding for DMA
> - * flags bits to indicate when a specific dma address is a bus address.
> + * flags bits to indicate when a specific dma address is a bus address or the
> + * buffer may have been bounced via SWIOTLB.
> */
> #ifdef CONFIG_NEED_SG_DMA_FLAGS
>
> -#define SG_DMA_BUS_ADDRESS (1 << 0)
> +#define SG_DMA_BUS_ADDRESS (1 << 0)
> +#define SG_DMA_SWIOTLB (1 << 1)
>
> /**
> * sg_dma_is_bus_address - Return whether a given segment was marked
> @@ -298,6 +300,34 @@ static inline void sg_dma_unmark_bus_address(struct scatterlist *sg)
> sg->dma_flags &= ~SG_DMA_BUS_ADDRESS;
> }
>
> +/**
> + * sg_dma_use_swiotlb - Return whether the scatterlist was marked for SWIOTLB
> + * bouncing
> + * @sg: SG entry
> + *
> + * Description:
> + * Returns true if the scatterlist was marked for SWIOTLB bouncing. Not all
> + * elements may have been bounced, so the caller would have to check
> + * individual SG entries with is_swiotlb_buffer().
> + */
> +static inline bool sg_dma_use_swiotlb(struct scatterlist *sg)
Nit: since you tweaked the flag name again, we could happily go back to
the pattern with s/use/is/ for this one now too.
> +{
> + return sg->dma_flags & SG_DMA_SWIOTLB;
> +}
> +
> +/**
> + * sg_dma_use_swiotlb - Mark the scatterlist for SWIOTLB bouncing
Oops - s/use/mark/
Feel free to fix those up when applying if there's no other reason for a v7.
Thanks,
Robin.
> + * @sg: SG entry
> + *
> + * Description:
> + * Marks a a scatterlist for SWIOTLB bounce. Not all SG entries may be
> + * bounced.
> + */
> +static inline void sg_dma_mark_swiotlb(struct scatterlist *sg)
> +{
> + sg->dma_flags |= SG_DMA_SWIOTLB;
> +}
> +
> #else
>
> static inline bool sg_dma_is_bus_address(struct scatterlist *sg)
> @@ -310,6 +340,13 @@ static inline void sg_dma_mark_bus_address(struct scatterlist *sg)
> static inline void sg_dma_unmark_bus_address(struct scatterlist *sg)
> {
> }
> +static inline bool sg_dma_use_swiotlb(struct scatterlist *sg)
> +{
> + return false;
> +}
> +static inline void sg_dma_mark_swiotlb(struct scatterlist *sg)
> +{
> +}
>
> #endif /* CONFIG_NEED_SG_DMA_FLAGS */
>
More information about the linux-arm-kernel
mailing list