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

From: Stephen Rothwell <[email-masked]>
Date: Mon, 3 Apr 2023 14:36:42 +1000

Hi all,

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);
 +}