Linux IOMMU Development
 help / color / mirror / Atom feed
From: Steven Price <steven.price@arm.com>
To: Robin Murphy <robin.murphy@arm.com>, will@kernel.org
Cc: robh@kernel.org, tomeu.vizoso@collabora.com,
	dri-devel@lists.freedesktop.org,
	iommu@lists.linux-foundation.org,
	linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH] iommu/io-pgtable: Remove tlb_flush_leaf
Date: Thu, 26 Nov 2020 08:33:49 +0000	[thread overview]
Message-ID: <954cd979-a3e4-ddde-8a3e-353124fc1cda@arm.com> (raw)
In-Reply-To: <9844ab0c5cb3da8b2f89c6c2da16941910702b41.1606324115.git.robin.murphy@arm.com>

On 25/11/2020 17:29, Robin Murphy wrote:
> The only user of tlb_flush_leaf is a particularly hairy corner of the
> Arm short-descriptor code, which wants a synchronous invalidation to
> minimise the races inherent in trying to split a large page mapping.
> This is already far enough into "here be dragons" territory that no
> sensible caller should ever hit it, and thus it really doesn't need
> optimising. Although using tlb_flush_walk there may technically be
> more heavyweight than needed, it does the job and saves everyone else
> having to carry around useless baggage.
> 
> Signed-off-by: Robin Murphy <robin.murphy@arm.com>

LGTM

Reviewed-by: Steven Price <steven.price@arm.com>

> ---
> 
> Reviewing the Mediatek TLB optimisation patches just left me thinking
> "why do we even have this?"... Panfrost folks, this has zero functional
> impact to you, merely wants an ack for straying outside drivers/iommu.
> 
> Robin.
> 
>   drivers/gpu/drm/msm/msm_iommu.c             |  1 -
>   drivers/gpu/drm/panfrost/panfrost_mmu.c     |  7 ------
>   drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c |  7 ------
>   drivers/iommu/arm/arm-smmu/arm-smmu.c       | 25 +++------------------
>   drivers/iommu/arm/arm-smmu/qcom_iommu.c     |  8 -------
>   drivers/iommu/io-pgtable-arm-v7s.c          |  3 +--
>   drivers/iommu/io-pgtable-arm.c              |  1 -
>   drivers/iommu/ipmmu-vmsa.c                  |  1 -
>   drivers/iommu/msm_iommu.c                   |  7 ------
>   drivers/iommu/mtk_iommu.c                   |  1 -
>   include/linux/io-pgtable.h                  | 11 ---------
>   11 files changed, 4 insertions(+), 68 deletions(-)
> 
> diff --git a/drivers/gpu/drm/msm/msm_iommu.c b/drivers/gpu/drm/msm/msm_iommu.c
> index 22ac7c692a81..50d881794758 100644
> --- a/drivers/gpu/drm/msm/msm_iommu.c
> +++ b/drivers/gpu/drm/msm/msm_iommu.c
> @@ -139,7 +139,6 @@ static void msm_iommu_tlb_add_page(struct iommu_iotlb_gather *gather,
>   static const struct iommu_flush_ops null_tlb_ops = {
>   	.tlb_flush_all = msm_iommu_tlb_flush_all,
>   	.tlb_flush_walk = msm_iommu_tlb_flush_walk,
> -	.tlb_flush_leaf = msm_iommu_tlb_flush_walk,
>   	.tlb_add_page = msm_iommu_tlb_add_page,
>   };
> 
> diff --git a/drivers/gpu/drm/panfrost/panfrost_mmu.c b/drivers/gpu/drm/panfrost/panfrost_mmu.c
> index 776448c527ea..c186914cc4f9 100644
> --- a/drivers/gpu/drm/panfrost/panfrost_mmu.c
> +++ b/drivers/gpu/drm/panfrost/panfrost_mmu.c
> @@ -347,16 +347,9 @@ static void mmu_tlb_flush_walk(unsigned long iova, size_t size, size_t granule,
>   	mmu_tlb_sync_context(cookie);
>   }
> 
> -static void mmu_tlb_flush_leaf(unsigned long iova, size_t size, size_t granule,
> -			       void *cookie)
> -{
> -	mmu_tlb_sync_context(cookie);
> -}
> -
>   static const struct iommu_flush_ops mmu_tlb_ops = {
>   	.tlb_flush_all	= mmu_tlb_inv_context_s1,
>   	.tlb_flush_walk = mmu_tlb_flush_walk,
> -	.tlb_flush_leaf = mmu_tlb_flush_leaf,
>   };
> 
>   int panfrost_mmu_pgtable_alloc(struct panfrost_file_priv *priv)
> diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
> index e634bbe60573..fb684a393118 100644
> --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
> +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
> @@ -1741,16 +1741,9 @@ static void arm_smmu_tlb_inv_walk(unsigned long iova, size_t size,
>   	arm_smmu_tlb_inv_range(iova, size, granule, false, cookie);
>   }
> 
> -static void arm_smmu_tlb_inv_leaf(unsigned long iova, size_t size,
> -				  size_t granule, void *cookie)
> -{
> -	arm_smmu_tlb_inv_range(iova, size, granule, true, cookie);
> -}
> -
>   static const struct iommu_flush_ops arm_smmu_flush_ops = {
>   	.tlb_flush_all	= arm_smmu_tlb_inv_context,
>   	.tlb_flush_walk = arm_smmu_tlb_inv_walk,
> -	.tlb_flush_leaf = arm_smmu_tlb_inv_leaf,
>   	.tlb_add_page	= arm_smmu_tlb_inv_page_nosync,
>   };
> 
> diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu.c b/drivers/iommu/arm/arm-smmu/arm-smmu.c
> index dad7fa86fbd4..0b8c59922a2b 100644
> --- a/drivers/iommu/arm/arm-smmu/arm-smmu.c
> +++ b/drivers/iommu/arm/arm-smmu/arm-smmu.c
> @@ -333,14 +333,6 @@ static void arm_smmu_tlb_inv_walk_s1(unsigned long iova, size_t size,
>   	arm_smmu_tlb_sync_context(cookie);
>   }
> 
> -static void arm_smmu_tlb_inv_leaf_s1(unsigned long iova, size_t size,
> -				     size_t granule, void *cookie)
> -{
> -	arm_smmu_tlb_inv_range_s1(iova, size, granule, cookie,
> -				  ARM_SMMU_CB_S1_TLBIVAL);
> -	arm_smmu_tlb_sync_context(cookie);
> -}
> -
>   static void arm_smmu_tlb_add_page_s1(struct iommu_iotlb_gather *gather,
>   				     unsigned long iova, size_t granule,
>   				     void *cookie)
> @@ -357,14 +349,6 @@ static void arm_smmu_tlb_inv_walk_s2(unsigned long iova, size_t size,
>   	arm_smmu_tlb_sync_context(cookie);
>   }
> 
> -static void arm_smmu_tlb_inv_leaf_s2(unsigned long iova, size_t size,
> -				     size_t granule, void *cookie)
> -{
> -	arm_smmu_tlb_inv_range_s2(iova, size, granule, cookie,
> -				  ARM_SMMU_CB_S2_TLBIIPAS2L);
> -	arm_smmu_tlb_sync_context(cookie);
> -}
> -
>   static void arm_smmu_tlb_add_page_s2(struct iommu_iotlb_gather *gather,
>   				     unsigned long iova, size_t granule,
>   				     void *cookie)
> @@ -373,8 +357,8 @@ static void arm_smmu_tlb_add_page_s2(struct iommu_iotlb_gather *gather,
>   				  ARM_SMMU_CB_S2_TLBIIPAS2L);
>   }
> 
> -static void arm_smmu_tlb_inv_any_s2_v1(unsigned long iova, size_t size,
> -				       size_t granule, void *cookie)
> +static void arm_smmu_tlb_inv_walk_s2_v1(unsigned long iova, size_t size,
> +					size_t granule, void *cookie)
>   {
>   	arm_smmu_tlb_inv_context_s2(cookie);
>   }
> @@ -401,21 +385,18 @@ static void arm_smmu_tlb_add_page_s2_v1(struct iommu_iotlb_gather *gather,
>   static const struct iommu_flush_ops arm_smmu_s1_tlb_ops = {
>   	.tlb_flush_all	= arm_smmu_tlb_inv_context_s1,
>   	.tlb_flush_walk	= arm_smmu_tlb_inv_walk_s1,
> -	.tlb_flush_leaf	= arm_smmu_tlb_inv_leaf_s1,
>   	.tlb_add_page	= arm_smmu_tlb_add_page_s1,
>   };
> 
>   static const struct iommu_flush_ops arm_smmu_s2_tlb_ops_v2 = {
>   	.tlb_flush_all	= arm_smmu_tlb_inv_context_s2,
>   	.tlb_flush_walk	= arm_smmu_tlb_inv_walk_s2,
> -	.tlb_flush_leaf	= arm_smmu_tlb_inv_leaf_s2,
>   	.tlb_add_page	= arm_smmu_tlb_add_page_s2,
>   };
> 
>   static const struct iommu_flush_ops arm_smmu_s2_tlb_ops_v1 = {
>   	.tlb_flush_all	= arm_smmu_tlb_inv_context_s2,
> -	.tlb_flush_walk	= arm_smmu_tlb_inv_any_s2_v1,
> -	.tlb_flush_leaf	= arm_smmu_tlb_inv_any_s2_v1,
> +	.tlb_flush_walk	= arm_smmu_tlb_inv_walk_s2_v1,
>   	.tlb_add_page	= arm_smmu_tlb_add_page_s2_v1,
>   };
> 
> diff --git a/drivers/iommu/arm/arm-smmu/qcom_iommu.c b/drivers/iommu/arm/arm-smmu/qcom_iommu.c
> index b30d6c966e2c..7f280c8d5c53 100644
> --- a/drivers/iommu/arm/arm-smmu/qcom_iommu.c
> +++ b/drivers/iommu/arm/arm-smmu/qcom_iommu.c
> @@ -185,13 +185,6 @@ static void qcom_iommu_tlb_flush_walk(unsigned long iova, size_t size,
>   	qcom_iommu_tlb_sync(cookie);
>   }
> 
> -static void qcom_iommu_tlb_flush_leaf(unsigned long iova, size_t size,
> -				      size_t granule, void *cookie)
> -{
> -	qcom_iommu_tlb_inv_range_nosync(iova, size, granule, true, cookie);
> -	qcom_iommu_tlb_sync(cookie);
> -}
> -
>   static void qcom_iommu_tlb_add_page(struct iommu_iotlb_gather *gather,
>   				    unsigned long iova, size_t granule,
>   				    void *cookie)
> @@ -202,7 +195,6 @@ static void qcom_iommu_tlb_add_page(struct iommu_iotlb_gather *gather,
>   static const struct iommu_flush_ops qcom_flush_ops = {
>   	.tlb_flush_all	= qcom_iommu_tlb_inv_context,
>   	.tlb_flush_walk = qcom_iommu_tlb_flush_walk,
> -	.tlb_flush_leaf = qcom_iommu_tlb_flush_leaf,
>   	.tlb_add_page	= qcom_iommu_tlb_add_page,
>   };
> 
> diff --git a/drivers/iommu/io-pgtable-arm-v7s.c b/drivers/iommu/io-pgtable-arm-v7s.c
> index a688f22cbe3b..3cf72c100add 100644
> --- a/drivers/iommu/io-pgtable-arm-v7s.c
> +++ b/drivers/iommu/io-pgtable-arm-v7s.c
> @@ -584,7 +584,7 @@ static arm_v7s_iopte arm_v7s_split_cont(struct arm_v7s_io_pgtable *data,
>   	__arm_v7s_pte_sync(ptep, ARM_V7S_CONT_PAGES, &iop->cfg);
> 
>   	size *= ARM_V7S_CONT_PAGES;
> -	io_pgtable_tlb_flush_leaf(iop, iova, size, size);
> +	io_pgtable_tlb_flush_walk(iop, iova, size, size);
>   	return pte;
>   }
> 
> @@ -866,7 +866,6 @@ static void __init dummy_tlb_add_page(struct iommu_iotlb_gather *gather,
>   static const struct iommu_flush_ops dummy_tlb_ops __initconst = {
>   	.tlb_flush_all	= dummy_tlb_flush_all,
>   	.tlb_flush_walk	= dummy_tlb_flush,
> -	.tlb_flush_leaf	= dummy_tlb_flush,
>   	.tlb_add_page	= dummy_tlb_add_page,
>   };
> 
> diff --git a/drivers/iommu/io-pgtable-arm.c b/drivers/iommu/io-pgtable-arm.c
> index a7a9bc08dcd1..938830e07dcf 100644
> --- a/drivers/iommu/io-pgtable-arm.c
> +++ b/drivers/iommu/io-pgtable-arm.c
> @@ -1079,7 +1079,6 @@ static void __init dummy_tlb_add_page(struct iommu_iotlb_gather *gather,
>   static const struct iommu_flush_ops dummy_tlb_ops __initconst = {
>   	.tlb_flush_all	= dummy_tlb_flush_all,
>   	.tlb_flush_walk	= dummy_tlb_flush,
> -	.tlb_flush_leaf	= dummy_tlb_flush,
>   	.tlb_add_page	= dummy_tlb_add_page,
>   };
> 
> diff --git a/drivers/iommu/ipmmu-vmsa.c b/drivers/iommu/ipmmu-vmsa.c
> index 0f18abda0e20..d71f10257f15 100644
> --- a/drivers/iommu/ipmmu-vmsa.c
> +++ b/drivers/iommu/ipmmu-vmsa.c
> @@ -325,7 +325,6 @@ static void ipmmu_tlb_flush(unsigned long iova, size_t size,
>   static const struct iommu_flush_ops ipmmu_flush_ops = {
>   	.tlb_flush_all = ipmmu_tlb_flush_all,
>   	.tlb_flush_walk = ipmmu_tlb_flush,
> -	.tlb_flush_leaf = ipmmu_tlb_flush,
>   };
> 
>   /* -----------------------------------------------------------------------------
> diff --git a/drivers/iommu/msm_iommu.c b/drivers/iommu/msm_iommu.c
> index 3615cd6241c4..040e85f70861 100644
> --- a/drivers/iommu/msm_iommu.c
> +++ b/drivers/iommu/msm_iommu.c
> @@ -174,12 +174,6 @@ static void __flush_iotlb_walk(unsigned long iova, size_t size,
>   	__flush_iotlb_range(iova, size, granule, false, cookie);
>   }
> 
> -static void __flush_iotlb_leaf(unsigned long iova, size_t size,
> -			       size_t granule, void *cookie)
> -{
> -	__flush_iotlb_range(iova, size, granule, true, cookie);
> -}
> -
>   static void __flush_iotlb_page(struct iommu_iotlb_gather *gather,
>   			       unsigned long iova, size_t granule, void *cookie)
>   {
> @@ -189,7 +183,6 @@ static void __flush_iotlb_page(struct iommu_iotlb_gather *gather,
>   static const struct iommu_flush_ops msm_iommu_flush_ops = {
>   	.tlb_flush_all = __flush_iotlb,
>   	.tlb_flush_walk = __flush_iotlb_walk,
> -	.tlb_flush_leaf = __flush_iotlb_leaf,
>   	.tlb_add_page = __flush_iotlb_page,
>   };
> 
> diff --git a/drivers/iommu/mtk_iommu.c b/drivers/iommu/mtk_iommu.c
> index c072cee532c2..8e56cec532e7 100644
> --- a/drivers/iommu/mtk_iommu.c
> +++ b/drivers/iommu/mtk_iommu.c
> @@ -240,7 +240,6 @@ static void mtk_iommu_tlb_flush_page_nosync(struct iommu_iotlb_gather *gather,
>   static const struct iommu_flush_ops mtk_iommu_flush_ops = {
>   	.tlb_flush_all = mtk_iommu_tlb_flush_all,
>   	.tlb_flush_walk = mtk_iommu_tlb_flush_range_sync,
> -	.tlb_flush_leaf = mtk_iommu_tlb_flush_range_sync,
>   	.tlb_add_page = mtk_iommu_tlb_flush_page_nosync,
>   };
> 
> diff --git a/include/linux/io-pgtable.h b/include/linux/io-pgtable.h
> index 4cde111e425b..ec9fae37c0e4 100644
> --- a/include/linux/io-pgtable.h
> +++ b/include/linux/io-pgtable.h
> @@ -25,8 +25,6 @@ enum io_pgtable_fmt {
>    * @tlb_flush_walk: Synchronously invalidate all intermediate TLB state
>    *                  (sometimes referred to as the "walk cache") for a virtual
>    *                  address range.
> - * @tlb_flush_leaf: Synchronously invalidate all leaf TLB state for a virtual
> - *                  address range.
>    * @tlb_add_page:   Optional callback to queue up leaf TLB invalidation for a
>    *                  single page.  IOMMUs that cannot batch TLB invalidation
>    *                  operations efficiently will typically issue them here, but
> @@ -40,8 +38,6 @@ struct iommu_flush_ops {
>   	void (*tlb_flush_all)(void *cookie);
>   	void (*tlb_flush_walk)(unsigned long iova, size_t size, size_t granule,
>   			       void *cookie);
> -	void (*tlb_flush_leaf)(unsigned long iova, size_t size, size_t granule,
> -			       void *cookie);
>   	void (*tlb_add_page)(struct iommu_iotlb_gather *gather,
>   			     unsigned long iova, size_t granule, void *cookie);
>   };
> @@ -220,13 +216,6 @@ io_pgtable_tlb_flush_walk(struct io_pgtable *iop, unsigned long iova,
>   	iop->cfg.tlb->tlb_flush_walk(iova, size, granule, iop->cookie);
>   }
> 
> -static inline void
> -io_pgtable_tlb_flush_leaf(struct io_pgtable *iop, unsigned long iova,
> -			  size_t size, size_t granule)
> -{
> -	iop->cfg.tlb->tlb_flush_leaf(iova, size, granule, iop->cookie);
> -}
> -
>   static inline void
>   io_pgtable_tlb_add_page(struct io_pgtable *iop,
>   			struct iommu_iotlb_gather * gather, unsigned long iova,
> --
> 2.17.1
> 

_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

  parent reply	other threads:[~2020-11-26  8:34 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-11-25 17:29 [PATCH] iommu/io-pgtable: Remove tlb_flush_leaf Robin Murphy
2020-11-25 18:24 ` Robin Murphy
2020-11-25 21:10   ` Jordan Crouse
2020-11-26  8:33 ` Steven Price [this message]
2020-12-03 11:53 ` Will Deacon
2020-12-08 15:54 ` Will Deacon

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=954cd979-a3e4-ddde-8a3e-353124fc1cda@arm.com \
    --to=steven.price@arm.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=iommu@lists.linux-foundation.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=robh@kernel.org \
    --cc=robin.murphy@arm.com \
    --cc=tomeu.vizoso@collabora.com \
    --cc=will@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox