Subject: Re: linux-next: manual merge of the tip tree with the iommu tree

From: Stephen Rothwell <[email-masked]>
Date: Mon, 3 Apr 2023 15:11:48 +1000

Hi all,

On Mon, 3 Apr 2023 14:36:42 +1000 Stephen Rothwell <[email-masked]> wrote:
>
> Today's linux-next merge of the tip tree got conflicts in:
> 
>   drivers/iommu/iommu-sva.c
>   include/linux/sched/mm.h
>   include/linux/ioasid.h
> 
> between commits:
> 
>   cd3891158a77 ("iommu/sva: Move PASID helpers to sva code")
>   4e14176ab13f ("iommu/sva: Stop using ioasid_set for SVA")
>   1a14bf0fc7ed ("iommu/sva: Use GFP_KERNEL for pasid allocation")
> 
> from the iommu tree and commit:
> 
>   400b9b93441c ("iommu/sva: Replace pasid_valid() helper with mm_valid_pasid()")
> 
> from the tip tree.
> 
> I fixed it up (I used the former version of include/linux/sched/mm.h,
> removed include/linux/ioasid.h, updated drivers/iommu/iommu-sva.c
> as below and applied the following patch) and can carry the fix as
> necessary. This is now fixed as far as linux-next is concerned, but any
> non trivial conflicts should be mentioned to your upstream maintainer
> when your tree is submitted for merging.  You may also want to consider
> cooperating with the maintainer of the conflicting tree to minimise any
> particularly complex conflicts.
> 
> From: Stephen Rothwell <[email-masked]>
> Date: Mon, 3 Apr 2023 14:32:58 +1000
> Subject: [PATCH] fixup for "iommu/sva: Replace pasid_valid() helper with mm_valid_pasid()"
> 
> interacting with "iommu/sva: Replace pasid_valid() helper with
> mm_valid_pasid()" and "iommu: Remove ioasid infrastructure"
> 
> Signed-off-by: Stephen Rothwell <[email-masked]>
> ---
>  include/linux/iommu.h | 10 +++++-----
>  1 file changed, 5 insertions(+), 5 deletions(-)
> 
> diff --git a/include/linux/iommu.h b/include/linux/iommu.h
> index 54f535ff9868..0c5d4c3b59cd 100644
> --- a/include/linux/iommu.h
> +++ b/include/linux/iommu.h
> @@ -1172,16 +1172,15 @@ static inline bool tegra_dev_iommu_get_stream_id(struct device *dev, u32 *stream
>  	return false;
>  }
>  
> -static inline bool pasid_valid(ioasid_t ioasid)
> -{
> -	return ioasid != IOMMU_PASID_INVALID;
> -}
> -
>  #ifdef CONFIG_IOMMU_SVA
>  static inline void mm_pasid_init(struct mm_struct *mm)
>  {
>  	mm->pasid = IOMMU_PASID_INVALID;
>  }
> +static inline bool mm_valid_pasid(struct mm_struct *mm)
> +{
> +	return mm->pasid != IOMMU_PASID_INVALID;
> +}
>  void mm_pasid_drop(struct mm_struct *mm);
>  struct iommu_sva *iommu_sva_bind_device(struct device *dev,
>  					struct mm_struct *mm);
> @@ -1203,6 +1202,7 @@ static inline u32 iommu_sva_get_pasid(struct iommu_sva *handle)
>  	return IOMMU_PASID_INVALID;
>  }
>  static inline void mm_pasid_init(struct mm_struct *mm) {}
> +static inline bool mm_valid_pasid(struct mm_struct *mm) { return false; }
>  static inline void mm_pasid_drop(struct mm_struct *mm) {}
>  #endif /* CONFIG_IOMMU_SVA */
>  
> -- 
> 2.39.2
> 
> -- 
> Cheers,
> Stephen Rothwell
> 
> diff --cc drivers/iommu/iommu-sva.c
> index c434b95dc8eb,dd76a1a09cf7..000000000000
> --- a/drivers/iommu/iommu-sva.c
> +++ b/drivers/iommu/iommu-sva.c
> @@@ -9,14 -10,26 +10,14 @@@
>   #include "iommu-sva.h"
>   
>   static DEFINE_MUTEX(iommu_sva_lock);
>  -static DECLARE_IOASID_SET(iommu_sva_pasid);
>  +static DEFINE_IDA(iommu_global_pasid_ida);
>   
>  -/**
>  - * iommu_sva_alloc_pasid - Allocate a PASID for the mm
>  - * @mm: the mm
>  - * @min: minimum PASID value (inclusive)
>  - * @max: maximum PASID value (inclusive)
>  - *
>  - * Try to allocate a PASID for this mm, or take a reference to the existing one
>  - * provided it fits within the [@min, @max] range. On success the PASID is
>  - * available in mm->pasid and will be available for the lifetime of the mm.
>  - *
>  - * Returns 0 on success and < 0 on error.
>  - */
>  -int iommu_sva_alloc_pasid(struct mm_struct *mm, ioasid_t min, ioasid_t max)
>  +/* Allocate a PASID for the mm within range (inclusive) */
>  +static int iommu_sva_alloc_pasid(struct mm_struct *mm, ioasid_t min, ioasid_t max)
>   {
>   	int ret = 0;
>  -	ioasid_t pasid;
>   
> - 	if (!pasid_valid(min) || !pasid_valid(max) ||
>  -	if (min == INVALID_IOASID || max == INVALID_IOASID ||
> ++	if (min == IOMMU_PASID_INVALID || max == IOMMU_PASID_INVALID ||
>   	    min == 0 || max < min)
>   		return -EINVAL;
>   
> @@@ -205,11 -242,3 +209,11 @@@ out_put_mm
>   
>   	return status;
>   }
>  +
>  +void mm_pasid_drop(struct mm_struct *mm)
>  +{
> - 	if (likely(!pasid_valid(mm->pasid)))
> ++	if (likely(!mm_valid_pasid(mm)))
>  +		return;
>  +
>  +	ida_free(&iommu_global_pasid_ida, mm->pasid);
>  +}

It also needs this:

From: Stephen Rothwell <[email-masked]>
Date: Mon, 3 Apr 2023 14:58:05 +1000
Subject: [PATCH] extra fixup for "iommu/sva: Replace pasid_valid() helper with mm_valid_pasid()"

interacting with "iommu/sva: Replace pasid_valid() helper with
mm_valid_pasid()" and "iommu: Remove ioasid infrastructure"

Signed-off-by: Stephen Rothwell <[email-masked]>
---
 arch/x86/kernel/process_64.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c
index 74c7e84a94d8..3bcbc165c5bb 100644
--- a/arch/x86/kernel/process_64.c
+++ b/arch/x86/kernel/process_64.c
@@ -39,6 +39,7 @@
 #include <linux/io.h>
 #include <linux/ftrace.h>
 #include <linux/syscalls.h>
+#include <linux/iommu.h>
 
 #include <asm/processor.h>
 #include <asm/pkru.h>
-- 
2.39.2

-- 
Cheers,
Stephen Rothwell