* [PATCH 1/3] iommu/amd: Use try_cmpxchg64() in v2_alloc_pte()
@ 2024-05-22 8:26 Uros Bizjak
2024-05-22 8:26 ` [PATCH 2/3] iommu/vt-d: Use try_cmpxchg64() in intel_pasid_get_entry() Uros Bizjak
` (2 more replies)
0 siblings, 3 replies; 11+ messages in thread
From: Uros Bizjak @ 2024-05-22 8:26 UTC (permalink / raw)
To: iommu, linux-kernel
Cc: Uros Bizjak, Joerg Roedel, Suravee Suthikulpanit, Will Deacon,
Robin Murphy
Use try_cmpxchg64() instead of cmpxchg64 (*ptr, old, new) != old in
v2_alloc_pte(). cmpxchg returns success in ZF flag, so this change
saves a compare after cmpxchg (and related move instruction
in front of cmpxchg).
This is the same improvement as implemented for alloc_pte() in:
commit 0d10fe759117 ("iommu/amd: Use try_cmpxchg64 in alloc_pte and free_clear_pte")
Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
Cc: Joerg Roedel <joro@8bytes.org>
Cc: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Cc: Will Deacon <will@kernel.org>
Cc: Robin Murphy <robin.murphy@arm.com>
---
drivers/iommu/amd/io_pgtable_v2.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/iommu/amd/io_pgtable_v2.c b/drivers/iommu/amd/io_pgtable_v2.c
index 78ac37c5ccc1..664e91c88748 100644
--- a/drivers/iommu/amd/io_pgtable_v2.c
+++ b/drivers/iommu/amd/io_pgtable_v2.c
@@ -158,7 +158,7 @@ static u64 *v2_alloc_pte(int nid, u64 *pgd, unsigned long iova,
__npte = set_pgtable_attr(page);
/* pte could have been changed somewhere. */
- if (cmpxchg64(pte, __pte, __npte) != __pte)
+ if (!try_cmpxchg64(pte, &__pte, __npte))
iommu_free_page(page);
else if (IOMMU_PTE_PRESENT(__pte))
*updated = true;
--
2.45.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 2/3] iommu/vt-d: Use try_cmpxchg64() in intel_pasid_get_entry()
2024-05-22 8:26 [PATCH 1/3] iommu/amd: Use try_cmpxchg64() in v2_alloc_pte() Uros Bizjak
@ 2024-05-22 8:26 ` Uros Bizjak
2024-05-23 13:24 ` Baolu Lu
2024-05-24 1:09 ` Baolu Lu
2024-05-22 8:26 ` [PATCH 3/3] iommufd: Use atomic_long_try_cmpxchg() in incr_user_locked_vm() Uros Bizjak
2024-05-23 10:40 ` [PATCH 1/3] iommu/amd: Use try_cmpxchg64() in v2_alloc_pte() Vasant Hegde
2 siblings, 2 replies; 11+ messages in thread
From: Uros Bizjak @ 2024-05-22 8:26 UTC (permalink / raw)
To: iommu, linux-kernel
Cc: Uros Bizjak, David Woodhouse, Lu Baolu, Joerg Roedel, Will Deacon,
Robin Murphy
Use try_cmpxchg64() instead of cmpxchg64 (*ptr, old, new) != old in
intel_pasid_get_entry(). cmpxchg returns success in ZF flag, so
this change saves a compare after cmpxchg (and related move
instruction in front of cmpxchg).
Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: Lu Baolu <baolu.lu@linux.intel.com>
Cc: Joerg Roedel <joro@8bytes.org>
Cc: Will Deacon <will@kernel.org>
Cc: Robin Murphy <robin.murphy@arm.com>
---
drivers/iommu/intel/pasid.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/iommu/intel/pasid.c b/drivers/iommu/intel/pasid.c
index abce19e2ad6f..9bf45bc4b967 100644
--- a/drivers/iommu/intel/pasid.c
+++ b/drivers/iommu/intel/pasid.c
@@ -146,6 +146,8 @@ static struct pasid_entry *intel_pasid_get_entry(struct device *dev, u32 pasid)
retry:
entries = get_pasid_table_from_pde(&dir[dir_index]);
if (!entries) {
+ u64 tmp;
+
entries = iommu_alloc_page_node(info->iommu->node, GFP_ATOMIC);
if (!entries)
return NULL;
@@ -156,8 +158,9 @@ static struct pasid_entry *intel_pasid_get_entry(struct device *dev, u32 pasid)
* clear. However, this entry might be populated by others
* while we are preparing it. Use theirs with a retry.
*/
- if (cmpxchg64(&dir[dir_index].val, 0ULL,
- (u64)virt_to_phys(entries) | PASID_PTE_PRESENT)) {
+ tmp = 0ULL;
+ if (!try_cmpxchg64(&dir[dir_index].val, &tmp,
+ (u64)virt_to_phys(entries) | PASID_PTE_PRESENT)) {
iommu_free_page(entries);
goto retry;
}
--
2.45.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 3/3] iommufd: Use atomic_long_try_cmpxchg() in incr_user_locked_vm()
2024-05-22 8:26 [PATCH 1/3] iommu/amd: Use try_cmpxchg64() in v2_alloc_pte() Uros Bizjak
2024-05-22 8:26 ` [PATCH 2/3] iommu/vt-d: Use try_cmpxchg64() in intel_pasid_get_entry() Uros Bizjak
@ 2024-05-22 8:26 ` Uros Bizjak
2024-05-22 12:45 ` Jason Gunthorpe
2024-05-23 10:40 ` [PATCH 1/3] iommu/amd: Use try_cmpxchg64() in v2_alloc_pte() Vasant Hegde
2 siblings, 1 reply; 11+ messages in thread
From: Uros Bizjak @ 2024-05-22 8:26 UTC (permalink / raw)
To: iommu, linux-kernel
Cc: Uros Bizjak, Jason Gunthorpe, Kevin Tian, Joerg Roedel,
Will Deacon, Robin Murphy
Use atomic_long_try_cmpxchg() instead of
atomic_long_cmpxchg (*ptr, old, new) != old in incr_user_locked_vm().
cmpxchg returns success in ZF flag, so this change saves a compare
after cmpxchg (and related move instruction in front of cmpxchg).
Also, atomic_long_try_cmpxchg() implicitly assigns old *ptr
value to "old" when cmpxchg fails. There is no need to re-read
the value in the loop.
Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
Cc: Jason Gunthorpe <jgg@ziepe.ca>
Cc: Kevin Tian <kevin.tian@intel.com>
Cc: Joerg Roedel <joro@8bytes.org>
Cc: Will Deacon <will@kernel.org>
Cc: Robin Murphy <robin.murphy@arm.com>
---
drivers/iommu/iommufd/pages.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/drivers/iommu/iommufd/pages.c b/drivers/iommu/iommufd/pages.c
index 528f356238b3..117f644a0c5b 100644
--- a/drivers/iommu/iommufd/pages.c
+++ b/drivers/iommu/iommufd/pages.c
@@ -809,13 +809,14 @@ static int incr_user_locked_vm(struct iopt_pages *pages, unsigned long npages)
lock_limit = task_rlimit(pages->source_task, RLIMIT_MEMLOCK) >>
PAGE_SHIFT;
+
+ cur_pages = atomic_long_read(&pages->source_user->locked_vm);
do {
- cur_pages = atomic_long_read(&pages->source_user->locked_vm);
new_pages = cur_pages + npages;
if (new_pages > lock_limit)
return -ENOMEM;
- } while (atomic_long_cmpxchg(&pages->source_user->locked_vm, cur_pages,
- new_pages) != cur_pages);
+ } while (!atomic_long_try_cmpxchg(&pages->source_user->locked_vm,
+ &cur_pages, new_pages));
return 0;
}
--
2.45.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 3/3] iommufd: Use atomic_long_try_cmpxchg() in incr_user_locked_vm()
2024-05-22 8:26 ` [PATCH 3/3] iommufd: Use atomic_long_try_cmpxchg() in incr_user_locked_vm() Uros Bizjak
@ 2024-05-22 12:45 ` Jason Gunthorpe
0 siblings, 0 replies; 11+ messages in thread
From: Jason Gunthorpe @ 2024-05-22 12:45 UTC (permalink / raw)
To: Uros Bizjak
Cc: iommu, linux-kernel, Kevin Tian, Joerg Roedel, Will Deacon,
Robin Murphy
On Wed, May 22, 2024 at 10:26:49AM +0200, Uros Bizjak wrote:
> Use atomic_long_try_cmpxchg() instead of
> atomic_long_cmpxchg (*ptr, old, new) != old in incr_user_locked_vm().
> cmpxchg returns success in ZF flag, so this change saves a compare
> after cmpxchg (and related move instruction in front of cmpxchg).
>
> Also, atomic_long_try_cmpxchg() implicitly assigns old *ptr
> value to "old" when cmpxchg fails. There is no need to re-read
> the value in the loop.
>
> Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
> Cc: Jason Gunthorpe <jgg@ziepe.ca>
> Cc: Kevin Tian <kevin.tian@intel.com>
> Cc: Joerg Roedel <joro@8bytes.org>
> Cc: Will Deacon <will@kernel.org>
> Cc: Robin Murphy <robin.murphy@arm.com>
> ---
> drivers/iommu/iommufd/pages.c | 7 ++++---
> 1 file changed, 4 insertions(+), 3 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
This patch may as well go through Joerg's tree with the whole series
Thanks,
Jason
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/3] iommu/amd: Use try_cmpxchg64() in v2_alloc_pte()
2024-05-22 8:26 [PATCH 1/3] iommu/amd: Use try_cmpxchg64() in v2_alloc_pte() Uros Bizjak
2024-05-22 8:26 ` [PATCH 2/3] iommu/vt-d: Use try_cmpxchg64() in intel_pasid_get_entry() Uros Bizjak
2024-05-22 8:26 ` [PATCH 3/3] iommufd: Use atomic_long_try_cmpxchg() in incr_user_locked_vm() Uros Bizjak
@ 2024-05-23 10:40 ` Vasant Hegde
2 siblings, 0 replies; 11+ messages in thread
From: Vasant Hegde @ 2024-05-23 10:40 UTC (permalink / raw)
To: Uros Bizjak, iommu, linux-kernel
Cc: Joerg Roedel, Suravee Suthikulpanit, Will Deacon, Robin Murphy
On 5/22/2024 1:56 PM, Uros Bizjak wrote:
> Use try_cmpxchg64() instead of cmpxchg64 (*ptr, old, new) != old in
> v2_alloc_pte(). cmpxchg returns success in ZF flag, so this change
> saves a compare after cmpxchg (and related move instruction
> in front of cmpxchg).
>
> This is the same improvement as implemented for alloc_pte() in:
>
> commit 0d10fe759117 ("iommu/amd: Use try_cmpxchg64 in alloc_pte and free_clear_pte")
>
> Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
> Cc: Joerg Roedel <joro@8bytes.org>
> Cc: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
> Cc: Will Deacon <will@kernel.org>
> Cc: Robin Murphy <robin.murphy@arm.com>
Thanks for fixing it. Looks good to me.
Reviewed-by: Vasant Hegde <vasant.hegde@amd.com>
-Vasant
> ---
> drivers/iommu/amd/io_pgtable_v2.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/iommu/amd/io_pgtable_v2.c b/drivers/iommu/amd/io_pgtable_v2.c
> index 78ac37c5ccc1..664e91c88748 100644
> --- a/drivers/iommu/amd/io_pgtable_v2.c
> +++ b/drivers/iommu/amd/io_pgtable_v2.c
> @@ -158,7 +158,7 @@ static u64 *v2_alloc_pte(int nid, u64 *pgd, unsigned long iova,
>
> __npte = set_pgtable_attr(page);
> /* pte could have been changed somewhere. */
> - if (cmpxchg64(pte, __pte, __npte) != __pte)
> + if (!try_cmpxchg64(pte, &__pte, __npte))
> iommu_free_page(page);
> else if (IOMMU_PTE_PRESENT(__pte))
> *updated = true;
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 2/3] iommu/vt-d: Use try_cmpxchg64() in intel_pasid_get_entry()
2024-05-22 8:26 ` [PATCH 2/3] iommu/vt-d: Use try_cmpxchg64() in intel_pasid_get_entry() Uros Bizjak
@ 2024-05-23 13:24 ` Baolu Lu
2024-05-23 13:34 ` Uros Bizjak
2024-05-24 1:09 ` Baolu Lu
1 sibling, 1 reply; 11+ messages in thread
From: Baolu Lu @ 2024-05-23 13:24 UTC (permalink / raw)
To: Uros Bizjak, iommu, linux-kernel
Cc: baolu.lu, David Woodhouse, Joerg Roedel, Will Deacon,
Robin Murphy
On 2024/5/22 16:26, Uros Bizjak wrote:
> Use try_cmpxchg64() instead of cmpxchg64 (*ptr, old, new) != old in
> intel_pasid_get_entry(). cmpxchg returns success in ZF flag, so
> this change saves a compare after cmpxchg (and related move
> instruction in front of cmpxchg).
>
> Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
> Cc: David Woodhouse <dwmw2@infradead.org>
> Cc: Lu Baolu <baolu.lu@linux.intel.com>
> Cc: Joerg Roedel <joro@8bytes.org>
> Cc: Will Deacon <will@kernel.org>
> Cc: Robin Murphy <robin.murphy@arm.com>
> ---
> drivers/iommu/intel/pasid.c | 7 +++++--
> 1 file changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/iommu/intel/pasid.c b/drivers/iommu/intel/pasid.c
> index abce19e2ad6f..9bf45bc4b967 100644
> --- a/drivers/iommu/intel/pasid.c
> +++ b/drivers/iommu/intel/pasid.c
> @@ -146,6 +146,8 @@ static struct pasid_entry *intel_pasid_get_entry(struct device *dev, u32 pasid)
> retry:
> entries = get_pasid_table_from_pde(&dir[dir_index]);
> if (!entries) {
> + u64 tmp;
> +
> entries = iommu_alloc_page_node(info->iommu->node, GFP_ATOMIC);
> if (!entries)
> return NULL;
> @@ -156,8 +158,9 @@ static struct pasid_entry *intel_pasid_get_entry(struct device *dev, u32 pasid)
> * clear. However, this entry might be populated by others
> * while we are preparing it. Use theirs with a retry.
> */
> - if (cmpxchg64(&dir[dir_index].val, 0ULL,
> - (u64)virt_to_phys(entries) | PASID_PTE_PRESENT)) {
> + tmp = 0ULL;
nit: can this simply be
tmp = 0;
?
> + if (!try_cmpxchg64(&dir[dir_index].val, &tmp,
> + (u64)virt_to_phys(entries) | PASID_PTE_PRESENT)) {
Above change will cause a dead loop during boot. It should be
if (try_cmpxchg64(&dir[dir_index].val, &tmp,
(u64)virt_to_phys(entries) | PASID_PTE_PRESENT)) {
> iommu_free_page(entries);
> goto retry;
> }
Best regards,
baolu
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 2/3] iommu/vt-d: Use try_cmpxchg64() in intel_pasid_get_entry()
2024-05-23 13:24 ` Baolu Lu
@ 2024-05-23 13:34 ` Uros Bizjak
2024-05-23 13:44 ` Baolu Lu
0 siblings, 1 reply; 11+ messages in thread
From: Uros Bizjak @ 2024-05-23 13:34 UTC (permalink / raw)
To: Baolu Lu
Cc: iommu, linux-kernel, David Woodhouse, Joerg Roedel, Will Deacon,
Robin Murphy
On Thu, May 23, 2024 at 3:24 PM Baolu Lu <baolu.lu@linux.intel.com> wrote:
>
> On 2024/5/22 16:26, Uros Bizjak wrote:
> > Use try_cmpxchg64() instead of cmpxchg64 (*ptr, old, new) != old in
> > intel_pasid_get_entry(). cmpxchg returns success in ZF flag, so
> > this change saves a compare after cmpxchg (and related move
> > instruction in front of cmpxchg).
> >
> > Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
> > Cc: David Woodhouse <dwmw2@infradead.org>
> > Cc: Lu Baolu <baolu.lu@linux.intel.com>
> > Cc: Joerg Roedel <joro@8bytes.org>
> > Cc: Will Deacon <will@kernel.org>
> > Cc: Robin Murphy <robin.murphy@arm.com>
> > ---
> > drivers/iommu/intel/pasid.c | 7 +++++--
> > 1 file changed, 5 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/iommu/intel/pasid.c b/drivers/iommu/intel/pasid.c
> > index abce19e2ad6f..9bf45bc4b967 100644
> > --- a/drivers/iommu/intel/pasid.c
> > +++ b/drivers/iommu/intel/pasid.c
> > @@ -146,6 +146,8 @@ static struct pasid_entry *intel_pasid_get_entry(struct device *dev, u32 pasid)
> > retry:
> > entries = get_pasid_table_from_pde(&dir[dir_index]);
> > if (!entries) {
> > + u64 tmp;
> > +
> > entries = iommu_alloc_page_node(info->iommu->node, GFP_ATOMIC);
> > if (!entries)
> > return NULL;
> > @@ -156,8 +158,9 @@ static struct pasid_entry *intel_pasid_get_entry(struct device *dev, u32 pasid)
> > * clear. However, this entry might be populated by others
> > * while we are preparing it. Use theirs with a retry.
> > */
> > - if (cmpxchg64(&dir[dir_index].val, 0ULL,
> > - (u64)virt_to_phys(entries) | PASID_PTE_PRESENT)) {
> > + tmp = 0ULL;
>
> nit: can this simply be
> tmp = 0;
> ?
I just took the same suffix as it was in the original code, but for
zero literal, it does not make any change. I can change it, it
preferred.
> > + if (!try_cmpxchg64(&dir[dir_index].val, &tmp,
> > + (u64)virt_to_phys(entries) | PASID_PTE_PRESENT)) {
>
> Above change will cause a dead loop during boot. It should be
No, it is correct as written:
if (cmpxchg64(*ptr, 0, new))
can be written as:
if (cmpxchg64(*ptr, 0, new) != 0)
this is equivalent to:
tmp = 0ULL;
if (!try_cmpxchg64(*ptr, &tmp, new))
Thanks,
Uros.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 2/3] iommu/vt-d: Use try_cmpxchg64() in intel_pasid_get_entry()
2024-05-23 13:34 ` Uros Bizjak
@ 2024-05-23 13:44 ` Baolu Lu
2024-05-23 13:57 ` Uros Bizjak
0 siblings, 1 reply; 11+ messages in thread
From: Baolu Lu @ 2024-05-23 13:44 UTC (permalink / raw)
To: Uros Bizjak
Cc: baolu.lu, iommu, linux-kernel, David Woodhouse, Joerg Roedel,
Will Deacon, Robin Murphy
On 2024/5/23 21:34, Uros Bizjak wrote:
>>> + if (!try_cmpxchg64(&dir[dir_index].val, &tmp,
>>> + (u64)virt_to_phys(entries) | PASID_PTE_PRESENT)) {
>> Above change will cause a dead loop during boot. It should be
> No, it is correct as written:
>
> if (cmpxchg64(*ptr, 0, new))
>
> can be written as:
>
> if (cmpxchg64(*ptr, 0, new) != 0)
>
> this is equivalent to:
>
> tmp = 0ULL;
> if (!try_cmpxchg64(*ptr, &tmp, new))
The return value of both cmpxchg64() and try_cmpxchg64() is the old
value that was loaded from the memory location, right?
If so,
if (cmpxchg64(*ptr, 0, new) != 0)
is not equivalent to
if (!try_cmpxchg64(*ptr, &tmp, new))
Best regards,
baolu
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 2/3] iommu/vt-d: Use try_cmpxchg64() in intel_pasid_get_entry()
2024-05-23 13:44 ` Baolu Lu
@ 2024-05-23 13:57 ` Uros Bizjak
2024-05-24 1:08 ` Baolu Lu
0 siblings, 1 reply; 11+ messages in thread
From: Uros Bizjak @ 2024-05-23 13:57 UTC (permalink / raw)
To: Baolu Lu
Cc: iommu, linux-kernel, David Woodhouse, Joerg Roedel, Will Deacon,
Robin Murphy
On Thu, May 23, 2024 at 3:44 PM Baolu Lu <baolu.lu@linux.intel.com> wrote:
>
> On 2024/5/23 21:34, Uros Bizjak wrote:
> >>> + if (!try_cmpxchg64(&dir[dir_index].val, &tmp,
> >>> + (u64)virt_to_phys(entries) | PASID_PTE_PRESENT)) {
> >> Above change will cause a dead loop during boot. It should be
> > No, it is correct as written:
> >
> > if (cmpxchg64(*ptr, 0, new))
> >
> > can be written as:
> >
> > if (cmpxchg64(*ptr, 0, new) != 0)
> >
> > this is equivalent to:
> >
> > tmp = 0ULL;
> > if (!try_cmpxchg64(*ptr, &tmp, new))
>
> The return value of both cmpxchg64() and try_cmpxchg64() is the old
> value that was loaded from the memory location, right?
Actually, try_cmpxchg() returns true if successful and false if it fails.
tmp = 0ULL;
if (!try_cmpxchg64(*ptr, &tmp, new))
The logic in the above snippet can be interpreted as:
if we fail to compare *ptr with 0, then:
iommu_free_page(entries);
goto retry;
as intended in the original code.
Thanks,
Uros.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 2/3] iommu/vt-d: Use try_cmpxchg64() in intel_pasid_get_entry()
2024-05-23 13:57 ` Uros Bizjak
@ 2024-05-24 1:08 ` Baolu Lu
0 siblings, 0 replies; 11+ messages in thread
From: Baolu Lu @ 2024-05-24 1:08 UTC (permalink / raw)
To: Uros Bizjak
Cc: baolu.lu, iommu, linux-kernel, David Woodhouse, Joerg Roedel,
Will Deacon, Robin Murphy
On 5/23/24 9:57 PM, Uros Bizjak wrote:
> On Thu, May 23, 2024 at 3:44 PM Baolu Lu<baolu.lu@linux.intel.com> wrote:
>> On 2024/5/23 21:34, Uros Bizjak wrote:
>>>>> + if (!try_cmpxchg64(&dir[dir_index].val, &tmp,
>>>>> + (u64)virt_to_phys(entries) | PASID_PTE_PRESENT)) {
>>>> Above change will cause a dead loop during boot. It should be
>>> No, it is correct as written:
>>>
>>> if (cmpxchg64(*ptr, 0, new))
>>>
>>> can be written as:
>>>
>>> if (cmpxchg64(*ptr, 0, new) != 0)
>>>
>>> this is equivalent to:
>>>
>>> tmp = 0ULL;
>>> if (!try_cmpxchg64(*ptr, &tmp, new))
>> The return value of both cmpxchg64() and try_cmpxchg64() is the old
>> value that was loaded from the memory location, right?
> Actually, try_cmpxchg() returns true if successful and false if it fails.
Oh! I misunderstood this.
>
> tmp = 0ULL;
> if (!try_cmpxchg64(*ptr, &tmp, new))
>
> The logic in the above snippet can be interpreted as:
>
> if we fail to compare *ptr with 0, then:
>
> iommu_free_page(entries);
> goto retry;
>
> as intended in the original code.
Okay, it's fine.
Best regards,
baolu
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 2/3] iommu/vt-d: Use try_cmpxchg64() in intel_pasid_get_entry()
2024-05-22 8:26 ` [PATCH 2/3] iommu/vt-d: Use try_cmpxchg64() in intel_pasid_get_entry() Uros Bizjak
2024-05-23 13:24 ` Baolu Lu
@ 2024-05-24 1:09 ` Baolu Lu
1 sibling, 0 replies; 11+ messages in thread
From: Baolu Lu @ 2024-05-24 1:09 UTC (permalink / raw)
To: Uros Bizjak, iommu, linux-kernel
Cc: baolu.lu, David Woodhouse, Joerg Roedel, Will Deacon,
Robin Murphy
On 5/22/24 4:26 PM, Uros Bizjak wrote:
> Use try_cmpxchg64() instead of cmpxchg64 (*ptr, old, new) != old in
> intel_pasid_get_entry(). cmpxchg returns success in ZF flag, so
> this change saves a compare after cmpxchg (and related move
> instruction in front of cmpxchg).
>
> Signed-off-by: Uros Bizjak<ubizjak@gmail.com>
> Cc: David Woodhouse<dwmw2@infradead.org>
> Cc: Lu Baolu<baolu.lu@linux.intel.com>
> Cc: Joerg Roedel<joro@8bytes.org>
> Cc: Will Deacon<will@kernel.org>
> Cc: Robin Murphy<robin.murphy@arm.com>
> ---
> drivers/iommu/intel/pasid.c | 7 +++++--
> 1 file changed, 5 insertions(+), 2 deletions(-)
Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com>
Best regards,
baolu
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2024-05-24 1:11 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-05-22 8:26 [PATCH 1/3] iommu/amd: Use try_cmpxchg64() in v2_alloc_pte() Uros Bizjak
2024-05-22 8:26 ` [PATCH 2/3] iommu/vt-d: Use try_cmpxchg64() in intel_pasid_get_entry() Uros Bizjak
2024-05-23 13:24 ` Baolu Lu
2024-05-23 13:34 ` Uros Bizjak
2024-05-23 13:44 ` Baolu Lu
2024-05-23 13:57 ` Uros Bizjak
2024-05-24 1:08 ` Baolu Lu
2024-05-24 1:09 ` Baolu Lu
2024-05-22 8:26 ` [PATCH 3/3] iommufd: Use atomic_long_try_cmpxchg() in incr_user_locked_vm() Uros Bizjak
2024-05-22 12:45 ` Jason Gunthorpe
2024-05-23 10:40 ` [PATCH 1/3] iommu/amd: Use try_cmpxchg64() in v2_alloc_pte() Vasant Hegde
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox