Re: [PATCH v1 2/6] iommu/vt-d: Use IDA interface to manage iommu sequence id

2022-06-30 Thread Lu Baolu

On 6/30/22 4:21 PM, Tian, Kevin wrote:

From: Lu Baolu 
Sent: Saturday, June 25, 2022 8:52 PM

@@ -1062,11 +1040,14 @@ static int alloc_iommu(struct dmar_drhd_unit
*drhd)
if (!iommu)
return -ENOMEM;

-   if (dmar_alloc_seq_id(iommu) < 0) {
+   iommu->seq_id = ida_alloc_range(_seq_ids, 0,
+   DMAR_UNITS_SUPPORTED,


should be "DMAR_UNITS_SUPPORTED - 1"


Yes, according to "@max: Highest ID to allocate.". Updated.


GFP_KERNEL);
+   if (iommu->seq_id < 0) {
pr_err("Failed to allocate seq_id\n");
err = -ENOSPC;
goto error;
}


ida_alloc_range() returns error code already. No need to change it.



Agreed. Updated as below:

diff --git a/drivers/iommu/intel/dmar.c b/drivers/iommu/intel/dmar.c
index bf43889b9d2a..6327b34f5aa7 100644
--- a/drivers/iommu/intel/dmar.c
+++ b/drivers/iommu/intel/dmar.c
@@ -1041,10 +1041,10 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd)
return -ENOMEM;

iommu->seq_id = ida_alloc_range(_seq_ids, 0,
-   DMAR_UNITS_SUPPORTED, GFP_KERNEL);
+   DMAR_UNITS_SUPPORTED - 1, 
GFP_KERNEL);

if (iommu->seq_id < 0) {
pr_err("Failed to allocate seq_id\n");
-   err = -ENOSPC;
+   err = iommu->seq_id;
goto error;
}
sprintf(iommu->name, "dmar%d", iommu->seq_id);

Best regards,
baolu
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


RE: [PATCH v1 2/6] iommu/vt-d: Use IDA interface to manage iommu sequence id

2022-06-30 Thread Tian, Kevin
> From: Lu Baolu 
> Sent: Saturday, June 25, 2022 8:52 PM
> 
> @@ -1062,11 +1040,14 @@ static int alloc_iommu(struct dmar_drhd_unit
> *drhd)
>   if (!iommu)
>   return -ENOMEM;
> 
> - if (dmar_alloc_seq_id(iommu) < 0) {
> + iommu->seq_id = ida_alloc_range(_seq_ids, 0,
> + DMAR_UNITS_SUPPORTED,

should be "DMAR_UNITS_SUPPORTED - 1"

> GFP_KERNEL);
> + if (iommu->seq_id < 0) {
>   pr_err("Failed to allocate seq_id\n");
>   err = -ENOSPC;
>   goto error;
>   }

ida_alloc_range() returns error code already. No need to change it.

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


[PATCH v1 2/6] iommu/vt-d: Use IDA interface to manage iommu sequence id

2022-06-25 Thread Lu Baolu
Switch dmar unit sequence id allocation and release from bitmap to IDA
interface.

Signed-off-by: Lu Baolu 
---
 drivers/iommu/intel/dmar.c | 33 +++--
 1 file changed, 7 insertions(+), 26 deletions(-)

diff --git a/drivers/iommu/intel/dmar.c b/drivers/iommu/intel/dmar.c
index 2a5e0f91e647..bf43889b9d2a 100644
--- a/drivers/iommu/intel/dmar.c
+++ b/drivers/iommu/intel/dmar.c
@@ -60,7 +60,7 @@ LIST_HEAD(dmar_drhd_units);
 
 struct acpi_table_header * __initdata dmar_tbl;
 static int dmar_dev_scope_status = 1;
-static unsigned long dmar_seq_ids[BITS_TO_LONGS(DMAR_UNITS_SUPPORTED)];
+static DEFINE_IDA(dmar_seq_ids);
 
 static int alloc_iommu(struct dmar_drhd_unit *drhd);
 static void free_iommu(struct intel_iommu *iommu);
@@ -1023,28 +1023,6 @@ static int map_iommu(struct intel_iommu *iommu, u64 
phys_addr)
return err;
 }
 
-static int dmar_alloc_seq_id(struct intel_iommu *iommu)
-{
-   iommu->seq_id = find_first_zero_bit(dmar_seq_ids,
-   DMAR_UNITS_SUPPORTED);
-   if (iommu->seq_id >= DMAR_UNITS_SUPPORTED) {
-   iommu->seq_id = -1;
-   } else {
-   set_bit(iommu->seq_id, dmar_seq_ids);
-   sprintf(iommu->name, "dmar%d", iommu->seq_id);
-   }
-
-   return iommu->seq_id;
-}
-
-static void dmar_free_seq_id(struct intel_iommu *iommu)
-{
-   if (iommu->seq_id >= 0) {
-   clear_bit(iommu->seq_id, dmar_seq_ids);
-   iommu->seq_id = -1;
-   }
-}
-
 static int alloc_iommu(struct dmar_drhd_unit *drhd)
 {
struct intel_iommu *iommu;
@@ -1062,11 +1040,14 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd)
if (!iommu)
return -ENOMEM;
 
-   if (dmar_alloc_seq_id(iommu) < 0) {
+   iommu->seq_id = ida_alloc_range(_seq_ids, 0,
+   DMAR_UNITS_SUPPORTED, GFP_KERNEL);
+   if (iommu->seq_id < 0) {
pr_err("Failed to allocate seq_id\n");
err = -ENOSPC;
goto error;
}
+   sprintf(iommu->name, "dmar%d", iommu->seq_id);
 
err = map_iommu(iommu, drhd->reg_base_addr);
if (err) {
@@ -1150,7 +1131,7 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd)
 err_unmap:
unmap_iommu(iommu);
 error_free_seq_id:
-   dmar_free_seq_id(iommu);
+   ida_free(_seq_ids, iommu->seq_id);
 error:
kfree(iommu);
return err;
@@ -1183,7 +1164,7 @@ static void free_iommu(struct intel_iommu *iommu)
if (iommu->reg)
unmap_iommu(iommu);
 
-   dmar_free_seq_id(iommu);
+   ida_free(_seq_ids, iommu->seq_id);
kfree(iommu);
 }
 
-- 
2.25.1

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