[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