From: Jason Gunthorpe <jgg@nvidia.com>
To: Joao Martins <joao.m.martins@oracle.com>
Cc: Shameerali Kolothum Thodi <shameerali.kolothum.thodi@huawei.com>,
"Tian, Kevin" <kevin.tian@intel.com>,
"robin.murphy@arm.com" <robin.murphy@arm.com>,
"will@kernel.org" <will@kernel.org>,
"joro@8bytes.org" <joro@8bytes.org>,
"ryan.roberts@arm.com" <ryan.roberts@arm.com>,
"nicolinc@nvidia.com" <nicolinc@nvidia.com>,
"mshavit@google.com" <mshavit@google.com>,
"eric.auger@redhat.com" <eric.auger@redhat.com>,
jiangkunkun <jiangkunkun@huawei.com>,
zhukeqian <zhukeqian1@huawei.com>, Linuxarm <linuxarm@huawei.com>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>,
"iommu@lists.linux.dev" <iommu@lists.linux.dev>
Subject: Re: [PATCH v3 2/4] iommu/io-pgtable-arm: Add read_and_clear_dirty() support
Date: Wed, 22 May 2024 14:50:53 -0300 [thread overview]
Message-ID: <20240522175053.GF20229@nvidia.com> (raw)
In-Reply-To: <cb2ab7ee-9e31-468d-85cb-71e70d7a7e0e@oracle.com>
On Wed, May 22, 2024 at 06:10:59PM +0100, Joao Martins wrote:
> On 22/05/2024 17:56, Jason Gunthorpe wrote:
> > On Wed, May 22, 2024 at 03:37:57PM +0100, Joao Martins wrote:
> >
> >> This is just to catch the case where IOMMUFD can call into read_and_clear()
> >> without dirty tracking enabled and without a bitmap structure to clear dirty
> >> bits -- in order to ensure a clean PTE data snapshot after start().
> >
> > Is that broken then?
> >
>
> It's not: The check errors out the caller ends up calling read-and-clear with a
> bitmap but without having started dirty tracking. the iopt_clear_dirty_data()
> passes a null bitmap, it goes through and it walks and clears the IOPTEs
> *without* recording them in the bitmap.
It is not "without recording them in the bitmap", saying that is the
confusing thing. The purpose of that 'if' is to return -EINVAL if
dirty tracking is not turned on and we query the bitmap.
More like this puts it in the common code and writes it in a more
straightforward way with better locking:
diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c
index d35c1b8c8e65ce..b2cb557d3ea427 100644
--- a/drivers/iommu/amd/iommu.c
+++ b/drivers/iommu/amd/iommu.c
@@ -2645,13 +2645,6 @@ static int amd_iommu_read_and_clear_dirty(struct iommu_domain *domain,
if (!ops || !ops->read_and_clear_dirty)
return -EOPNOTSUPP;
- spin_lock_irqsave(&pdomain->lock, lflags);
- if (!pdomain->dirty_tracking && dirty->bitmap) {
- spin_unlock_irqrestore(&pdomain->lock, lflags);
- return -EINVAL;
- }
- spin_unlock_irqrestore(&pdomain->lock, lflags);
-
return ops->read_and_clear_dirty(ops, iova, size, flags, dirty);
}
diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
index 50eb9aed47cc58..844f2cf061911f 100644
--- a/drivers/iommu/intel/iommu.c
+++ b/drivers/iommu/intel/iommu.c
@@ -4797,15 +4797,6 @@ static int intel_iommu_read_and_clear_dirty(struct iommu_domain *domain,
unsigned long end = iova + size - 1;
unsigned long pgsize;
- /*
- * IOMMUFD core calls into a dirty tracking disabled domain without an
- * IOVA bitmap set in order to clean dirty bits in all PTEs that might
- * have occurred when we stopped dirty tracking. This ensures that we
- * never inherit dirtied bits from a previous cycle.
- */
- if (!dmar_domain->dirty_tracking && dirty->bitmap)
- return -EINVAL;
-
do {
struct dma_pte *pte;
int lvl = 0;
diff --git a/drivers/iommu/iommufd/io_pagetable.c b/drivers/iommu/iommufd/io_pagetable.c
index 05fd9d3abf1b80..d116179809042d 100644
--- a/drivers/iommu/iommufd/io_pagetable.c
+++ b/drivers/iommu/iommufd/io_pagetable.c
@@ -536,7 +536,10 @@ int iopt_read_and_clear_dirty_data(struct io_pagetable *iopt,
return ret;
down_read(&iopt->iova_rwsem);
- ret = iommu_read_and_clear_dirty(domain, iopt, flags, bitmap);
+ if (!iopt->dirty_tracking_enabled)
+ ret = -EINVAL;
+ else
+ ret = iommu_read_and_clear_dirty(domain, iopt, flags, bitmap);
up_read(&iopt->iova_rwsem);
return ret;
@@ -580,7 +583,11 @@ int iopt_set_dirty_tracking(struct io_pagetable *iopt,
if (!ops)
return -EOPNOTSUPP;
- down_read(&iopt->iova_rwsem);
+ down_write(&iopt->iova_rwsem);
+ if (iopt->dirty_tracking_enabled == enable) {
+ ret = 0;
+ goto out_unlock;
+ }
/* Clear dirty bits from PTEs to ensure a clean snapshot */
if (enable) {
@@ -590,9 +597,11 @@ int iopt_set_dirty_tracking(struct io_pagetable *iopt,
}
ret = ops->set_dirty_tracking(domain, enable);
-
+ if (ret)
+ goto out_unlock;
+ iopt->dirty_tracking_enabled = enable;
out_unlock:
- up_read(&iopt->iova_rwsem);
+ up_write(&iopt->iova_rwsem);
return ret;
}
diff --git a/drivers/iommu/iommufd/iommufd_private.h b/drivers/iommu/iommufd/iommufd_private.h
index 991f864d1f9bc1..de3761e15cab54 100644
--- a/drivers/iommu/iommufd/iommufd_private.h
+++ b/drivers/iommu/iommufd/iommufd_private.h
@@ -52,6 +52,7 @@ struct io_pagetable {
/* IOVA that cannot be allocated, struct iopt_reserved */
struct rb_root_cached reserved_itree;
u8 disable_large_pages;
+ u8 dirty_tracking_enabled;
unsigned long iova_alignment;
};
WARNING: multiple messages have this Message-ID (diff)
From: Jason Gunthorpe <jgg@nvidia.com>
To: Joao Martins <joao.m.martins@oracle.com>
Cc: Shameerali Kolothum Thodi <shameerali.kolothum.thodi@huawei.com>,
"Tian, Kevin" <kevin.tian@intel.com>,
"robin.murphy@arm.com" <robin.murphy@arm.com>,
"will@kernel.org" <will@kernel.org>,
"joro@8bytes.org" <joro@8bytes.org>,
"ryan.roberts@arm.com" <ryan.roberts@arm.com>,
"nicolinc@nvidia.com" <nicolinc@nvidia.com>,
"mshavit@google.com" <mshavit@google.com>,
"eric.auger@redhat.com" <eric.auger@redhat.com>,
jiangkunkun <jiangkunkun@huawei.com>,
zhukeqian <zhukeqian1@huawei.com>, Linuxarm <linuxarm@huawei.com>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>,
"iommu@lists.linux.dev" <iommu@lists.linux.dev>
Subject: Re: [PATCH v3 2/4] iommu/io-pgtable-arm: Add read_and_clear_dirty() support
Date: Wed, 22 May 2024 14:50:53 -0300 [thread overview]
Message-ID: <20240522175053.GF20229@nvidia.com> (raw)
In-Reply-To: <cb2ab7ee-9e31-468d-85cb-71e70d7a7e0e@oracle.com>
On Wed, May 22, 2024 at 06:10:59PM +0100, Joao Martins wrote:
> On 22/05/2024 17:56, Jason Gunthorpe wrote:
> > On Wed, May 22, 2024 at 03:37:57PM +0100, Joao Martins wrote:
> >
> >> This is just to catch the case where IOMMUFD can call into read_and_clear()
> >> without dirty tracking enabled and without a bitmap structure to clear dirty
> >> bits -- in order to ensure a clean PTE data snapshot after start().
> >
> > Is that broken then?
> >
>
> It's not: The check errors out the caller ends up calling read-and-clear with a
> bitmap but without having started dirty tracking. the iopt_clear_dirty_data()
> passes a null bitmap, it goes through and it walks and clears the IOPTEs
> *without* recording them in the bitmap.
It is not "without recording them in the bitmap", saying that is the
confusing thing. The purpose of that 'if' is to return -EINVAL if
dirty tracking is not turned on and we query the bitmap.
More like this puts it in the common code and writes it in a more
straightforward way with better locking:
diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c
index d35c1b8c8e65ce..b2cb557d3ea427 100644
--- a/drivers/iommu/amd/iommu.c
+++ b/drivers/iommu/amd/iommu.c
@@ -2645,13 +2645,6 @@ static int amd_iommu_read_and_clear_dirty(struct iommu_domain *domain,
if (!ops || !ops->read_and_clear_dirty)
return -EOPNOTSUPP;
- spin_lock_irqsave(&pdomain->lock, lflags);
- if (!pdomain->dirty_tracking && dirty->bitmap) {
- spin_unlock_irqrestore(&pdomain->lock, lflags);
- return -EINVAL;
- }
- spin_unlock_irqrestore(&pdomain->lock, lflags);
-
return ops->read_and_clear_dirty(ops, iova, size, flags, dirty);
}
diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
index 50eb9aed47cc58..844f2cf061911f 100644
--- a/drivers/iommu/intel/iommu.c
+++ b/drivers/iommu/intel/iommu.c
@@ -4797,15 +4797,6 @@ static int intel_iommu_read_and_clear_dirty(struct iommu_domain *domain,
unsigned long end = iova + size - 1;
unsigned long pgsize;
- /*
- * IOMMUFD core calls into a dirty tracking disabled domain without an
- * IOVA bitmap set in order to clean dirty bits in all PTEs that might
- * have occurred when we stopped dirty tracking. This ensures that we
- * never inherit dirtied bits from a previous cycle.
- */
- if (!dmar_domain->dirty_tracking && dirty->bitmap)
- return -EINVAL;
-
do {
struct dma_pte *pte;
int lvl = 0;
diff --git a/drivers/iommu/iommufd/io_pagetable.c b/drivers/iommu/iommufd/io_pagetable.c
index 05fd9d3abf1b80..d116179809042d 100644
--- a/drivers/iommu/iommufd/io_pagetable.c
+++ b/drivers/iommu/iommufd/io_pagetable.c
@@ -536,7 +536,10 @@ int iopt_read_and_clear_dirty_data(struct io_pagetable *iopt,
return ret;
down_read(&iopt->iova_rwsem);
- ret = iommu_read_and_clear_dirty(domain, iopt, flags, bitmap);
+ if (!iopt->dirty_tracking_enabled)
+ ret = -EINVAL;
+ else
+ ret = iommu_read_and_clear_dirty(domain, iopt, flags, bitmap);
up_read(&iopt->iova_rwsem);
return ret;
@@ -580,7 +583,11 @@ int iopt_set_dirty_tracking(struct io_pagetable *iopt,
if (!ops)
return -EOPNOTSUPP;
- down_read(&iopt->iova_rwsem);
+ down_write(&iopt->iova_rwsem);
+ if (iopt->dirty_tracking_enabled == enable) {
+ ret = 0;
+ goto out_unlock;
+ }
/* Clear dirty bits from PTEs to ensure a clean snapshot */
if (enable) {
@@ -590,9 +597,11 @@ int iopt_set_dirty_tracking(struct io_pagetable *iopt,
}
ret = ops->set_dirty_tracking(domain, enable);
-
+ if (ret)
+ goto out_unlock;
+ iopt->dirty_tracking_enabled = enable;
out_unlock:
- up_read(&iopt->iova_rwsem);
+ up_write(&iopt->iova_rwsem);
return ret;
}
diff --git a/drivers/iommu/iommufd/iommufd_private.h b/drivers/iommu/iommufd/iommufd_private.h
index 991f864d1f9bc1..de3761e15cab54 100644
--- a/drivers/iommu/iommufd/iommufd_private.h
+++ b/drivers/iommu/iommufd/iommufd_private.h
@@ -52,6 +52,7 @@ struct io_pagetable {
/* IOVA that cannot be allocated, struct iopt_reserved */
struct rb_root_cached reserved_itree;
u8 disable_large_pages;
+ u8 dirty_tracking_enabled;
unsigned long iova_alignment;
};
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2024-05-22 17:51 UTC|newest]
Thread overview: 76+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-30 13:43 [PATCH v3 0/4] iommu/smmuv3: Add IOMMUFD dirty tracking support for SMMUv3 Shameer Kolothum
2024-04-30 13:43 ` Shameer Kolothum
2024-04-30 13:43 ` [PATCH v3 1/4] iommu/arm-smmu-v3: Add feature detection for HTTU Shameer Kolothum
2024-04-30 13:43 ` Shameer Kolothum
2024-05-22 7:02 ` Tian, Kevin
2024-05-22 7:02 ` Tian, Kevin
2024-04-30 13:43 ` [PATCH v3 2/4] iommu/io-pgtable-arm: Add read_and_clear_dirty() support Shameer Kolothum
2024-04-30 13:43 ` Shameer Kolothum
2024-04-30 14:51 ` Ryan Roberts
2024-04-30 14:51 ` Ryan Roberts
2024-05-12 12:51 ` Jason Gunthorpe
2024-05-12 12:51 ` Jason Gunthorpe
2024-05-22 7:12 ` Tian, Kevin
2024-05-22 7:12 ` Tian, Kevin
2024-05-22 12:37 ` Jason Gunthorpe
2024-05-22 12:37 ` Jason Gunthorpe
2024-05-22 14:03 ` Shameerali Kolothum Thodi
2024-05-22 14:03 ` Shameerali Kolothum Thodi
2024-05-22 14:37 ` Joao Martins
2024-05-22 14:37 ` Joao Martins
2024-05-22 16:56 ` Jason Gunthorpe
2024-05-22 16:56 ` Jason Gunthorpe
2024-05-22 17:10 ` Joao Martins
2024-05-22 17:10 ` Joao Martins
2024-05-22 17:50 ` Jason Gunthorpe [this message]
2024-05-22 17:50 ` Jason Gunthorpe
2024-05-22 18:15 ` Joao Martins
2024-05-22 18:15 ` Joao Martins
2024-05-22 18:39 ` Joao Martins
2024-05-22 18:39 ` Joao Martins
2024-05-23 3:30 ` Tian, Kevin
2024-05-23 3:30 ` Tian, Kevin
2024-05-24 11:30 ` Joao Martins
2024-05-24 11:30 ` Joao Martins
2024-05-24 14:07 ` Jason Gunthorpe
2024-05-24 14:07 ` Jason Gunthorpe
2024-05-27 1:21 ` Tian, Kevin
2024-05-27 1:21 ` Tian, Kevin
2024-05-27 9:50 ` Joao Martins
2024-05-27 9:50 ` Joao Martins
2024-06-01 18:55 ` Jason Gunthorpe
2024-06-01 18:55 ` Jason Gunthorpe
2024-06-03 18:50 ` Joao Martins
2024-06-03 18:50 ` Joao Martins
2024-04-30 13:43 ` [PATCH v3 3/4] iommu/arm-smmu-v3: Add support for dirty tracking in domain alloc Shameer Kolothum
2024-04-30 13:43 ` Shameer Kolothum
2024-04-30 15:05 ` Ryan Roberts
2024-04-30 15:05 ` Ryan Roberts
2024-05-12 12:57 ` Jason Gunthorpe
2024-05-12 12:57 ` Jason Gunthorpe
2024-05-22 7:16 ` Tian, Kevin
2024-05-22 7:16 ` Tian, Kevin
2024-05-22 12:38 ` Jason Gunthorpe
2024-05-22 12:38 ` Jason Gunthorpe
2024-05-22 14:30 ` Shameerali Kolothum Thodi
2024-05-22 14:30 ` Shameerali Kolothum Thodi
2024-05-22 23:49 ` Tian, Kevin
2024-05-22 23:49 ` Tian, Kevin
2024-04-30 13:43 ` [PATCH v3 4/4] iommu/arm-smmu-v3: Enable HTTU for stage1 with io-pgtable mapping Shameer Kolothum
2024-04-30 13:43 ` Shameer Kolothum
2024-05-12 12:08 ` Jason Gunthorpe
2024-05-12 12:08 ` Jason Gunthorpe
2024-05-22 7:19 ` Tian, Kevin
2024-05-22 7:19 ` Tian, Kevin
2024-05-22 12:39 ` Jason Gunthorpe
2024-05-22 12:39 ` Jason Gunthorpe
2024-05-22 23:52 ` Tian, Kevin
2024-05-22 23:52 ` Tian, Kevin
2024-05-22 13:26 ` Shameerali Kolothum Thodi
2024-05-22 13:26 ` Shameerali Kolothum Thodi
2024-05-22 13:41 ` Jason Gunthorpe
2024-05-22 13:41 ` Jason Gunthorpe
2024-05-12 12:58 ` [PATCH v3 0/4] iommu/smmuv3: Add IOMMUFD dirty tracking support for SMMUv3 Jason Gunthorpe
2024-05-12 12:58 ` Jason Gunthorpe
2024-05-22 13:28 ` Shameerali Kolothum Thodi
2024-05-22 13:28 ` Shameerali Kolothum Thodi
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=20240522175053.GF20229@nvidia.com \
--to=jgg@nvidia.com \
--cc=eric.auger@redhat.com \
--cc=iommu@lists.linux.dev \
--cc=jiangkunkun@huawei.com \
--cc=joao.m.martins@oracle.com \
--cc=joro@8bytes.org \
--cc=kevin.tian@intel.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linuxarm@huawei.com \
--cc=mshavit@google.com \
--cc=nicolinc@nvidia.com \
--cc=robin.murphy@arm.com \
--cc=ryan.roberts@arm.com \
--cc=shameerali.kolothum.thodi@huawei.com \
--cc=will@kernel.org \
--cc=zhukeqian1@huawei.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.