* [PATCH v2 1/1] iommu/vt-d: Remove caching mode check before device TLB flush
@ 2024-04-10 5:58 Lu Baolu
2024-04-10 6:14 ` Tian, Kevin
` (2 more replies)
0 siblings, 3 replies; 9+ messages in thread
From: Lu Baolu @ 2024-04-10 5:58 UTC (permalink / raw)
To: iommu
Cc: Kevin Tian, Yi Liu, Jacob Pan, Joerg Roedel, Will Deacon,
Robin Murphy, linux-kernel, Lu Baolu
The Caching Mode (CM) of the Intel IOMMU indicates if the hardware
implementation caches not-present or erroneous translation-structure
entries except the first-stage translation. The caching mode is
irrelevant to the device TLB , therefore there is no need to check
it before a device TLB invalidation operation.
iommu_flush_iotlb_psi() is called in map and unmap paths. The caching
mode check before device TLB invalidation will cause device TLB
invalidation always issued if IOMMU is not running in caching mode.
This is wrong and causes unnecessary performance overhead.
The removal of caching mode check in intel_flush_iotlb_all() doesn't
impact anything no matter the IOMMU is working in caching mode or not.
Commit <29b32839725f> ("iommu/vt-d: Do not use flush-queue when
caching-mode is on") has already disabled flush-queue for caching mode,
hence caching mode will never call intel_flush_iotlb_all().
Fixes: bf92df30df90 ("intel-iommu: Only avoid flushing device IOTLB for domain ID 0 in caching mode")
Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
---
drivers/iommu/intel/iommu.c | 9 ++-------
1 file changed, 2 insertions(+), 7 deletions(-)
Change log:
v2:
- Squash two patches into a single one.
- No functionality changes.
v1: https://lore.kernel.org/linux-iommu/20240407144232.190355-1-baolu.lu@linux.intel.com/
diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
index 50eb9aed47cc..681789b1258d 100644
--- a/drivers/iommu/intel/iommu.c
+++ b/drivers/iommu/intel/iommu.c
@@ -1501,11 +1501,7 @@ static void iommu_flush_iotlb_psi(struct intel_iommu *iommu,
else
__iommu_flush_iotlb_psi(iommu, did, pfn, pages, ih);
- /*
- * In caching mode, changes of pages from non-present to present require
- * flush. However, device IOTLB doesn't need to be flushed in this case.
- */
- if (!cap_caching_mode(iommu->cap) || !map)
+ if (!map)
iommu_flush_dev_iotlb(domain, addr, mask);
}
@@ -1579,8 +1575,7 @@ static void intel_flush_iotlb_all(struct iommu_domain *domain)
iommu->flush.flush_iotlb(iommu, did, 0, 0,
DMA_TLB_DSI_FLUSH);
- if (!cap_caching_mode(iommu->cap))
- iommu_flush_dev_iotlb(dmar_domain, 0, MAX_AGAW_PFN_WIDTH);
+ iommu_flush_dev_iotlb(dmar_domain, 0, MAX_AGAW_PFN_WIDTH);
}
if (dmar_domain->nested_parent)
--
2.34.1
^ permalink raw reply related [flat|nested] 9+ messages in thread* RE: [PATCH v2 1/1] iommu/vt-d: Remove caching mode check before device TLB flush
2024-04-10 5:58 [PATCH v2 1/1] iommu/vt-d: Remove caching mode check before device TLB flush Lu Baolu
@ 2024-04-10 6:14 ` Tian, Kevin
2024-04-10 6:30 ` Yi Liu
2024-04-11 13:13 ` Robin Murphy
2 siblings, 0 replies; 9+ messages in thread
From: Tian, Kevin @ 2024-04-10 6:14 UTC (permalink / raw)
To: Lu Baolu, iommu@lists.linux.dev
Cc: Liu, Yi L, Jacob Pan, Joerg Roedel, Will Deacon, Robin Murphy,
linux-kernel@vger.kernel.org
> From: Lu Baolu <baolu.lu@linux.intel.com>
> Sent: Wednesday, April 10, 2024 1:58 PM
>
> The Caching Mode (CM) of the Intel IOMMU indicates if the hardware
> implementation caches not-present or erroneous translation-structure
> entries except the first-stage translation. The caching mode is
> irrelevant to the device TLB , therefore there is no need to check
> it before a device TLB invalidation operation.
>
> iommu_flush_iotlb_psi() is called in map and unmap paths. The caching
> mode check before device TLB invalidation will cause device TLB
> invalidation always issued if IOMMU is not running in caching mode.
> This is wrong and causes unnecessary performance overhead.
>
> The removal of caching mode check in intel_flush_iotlb_all() doesn't
> impact anything no matter the IOMMU is working in caching mode or not.
> Commit <29b32839725f> ("iommu/vt-d: Do not use flush-queue when
> caching-mode is on") has already disabled flush-queue for caching mode,
> hence caching mode will never call intel_flush_iotlb_all().
>
> Fixes: bf92df30df90 ("intel-iommu: Only avoid flushing device IOTLB for
> domain ID 0 in caching mode")
> Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH v2 1/1] iommu/vt-d: Remove caching mode check before device TLB flush
2024-04-10 5:58 [PATCH v2 1/1] iommu/vt-d: Remove caching mode check before device TLB flush Lu Baolu
2024-04-10 6:14 ` Tian, Kevin
@ 2024-04-10 6:30 ` Yi Liu
2024-04-10 8:02 ` Baolu Lu
2024-04-11 13:13 ` Robin Murphy
2 siblings, 1 reply; 9+ messages in thread
From: Yi Liu @ 2024-04-10 6:30 UTC (permalink / raw)
To: Lu Baolu, iommu
Cc: Kevin Tian, Jacob Pan, Joerg Roedel, Will Deacon, Robin Murphy,
linux-kernel
On 2024/4/10 13:58, Lu Baolu wrote:
> The Caching Mode (CM) of the Intel IOMMU indicates if the hardware
> implementation caches not-present or erroneous translation-structure
> entries except the first-stage translation. The caching mode is
> irrelevant to the device TLB , therefore there is no need to check
> it before a device TLB invalidation operation.
>
> iommu_flush_iotlb_psi() is called in map and unmap paths. The caching
> mode check before device TLB invalidation will cause device TLB
> invalidation always issued if IOMMU is not running in caching mode.
> This is wrong and causes unnecessary performance overhead.
I don't think the original code is wrong. As I replied before, if CM==0,
the iommu_flush_iotlb_psi() is only called in unmap path, in which the
@map is false. [1] The reason to make the change is to make the logic
simpler. :)
[1]
https://lore.kernel.org/linux-iommu/ac7fdf0f-ecb9-415f-9c1b-600536b92ca5@intel.com/
> The removal of caching mode check in intel_flush_iotlb_all() doesn't
> impact anything no matter the IOMMU is working in caching mode or not.
> Commit <29b32839725f> ("iommu/vt-d: Do not use flush-queue when
> caching-mode is on") has already disabled flush-queue for caching mode,
> hence caching mode will never call intel_flush_iotlb_all().
>
> Fixes: bf92df30df90 ("intel-iommu: Only avoid flushing device IOTLB for domain ID 0 in caching mode")
> Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
> ---
> drivers/iommu/intel/iommu.c | 9 ++-------
> 1 file changed, 2 insertions(+), 7 deletions(-)
>
> Change log:
>
> v2:
> - Squash two patches into a single one.
> - No functionality changes.
>
> v1: https://lore.kernel.org/linux-iommu/20240407144232.190355-1-baolu.lu@linux.intel.com/
>
> diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
> index 50eb9aed47cc..681789b1258d 100644
> --- a/drivers/iommu/intel/iommu.c
> +++ b/drivers/iommu/intel/iommu.c
> @@ -1501,11 +1501,7 @@ static void iommu_flush_iotlb_psi(struct intel_iommu *iommu,
> else
> __iommu_flush_iotlb_psi(iommu, did, pfn, pages, ih);
>
> - /*
> - * In caching mode, changes of pages from non-present to present require
> - * flush. However, device IOTLB doesn't need to be flushed in this case.
> - */
> - if (!cap_caching_mode(iommu->cap) || !map)
> + if (!map)
> iommu_flush_dev_iotlb(domain, addr, mask);
> }
>
> @@ -1579,8 +1575,7 @@ static void intel_flush_iotlb_all(struct iommu_domain *domain)
> iommu->flush.flush_iotlb(iommu, did, 0, 0,
> DMA_TLB_DSI_FLUSH);
>
> - if (!cap_caching_mode(iommu->cap))
> - iommu_flush_dev_iotlb(dmar_domain, 0, MAX_AGAW_PFN_WIDTH);
> + iommu_flush_dev_iotlb(dmar_domain, 0, MAX_AGAW_PFN_WIDTH);
why not one more step to move it out of the iommu_array loop? There is
no more reason to keep it in the loop.
> }
>
> if (dmar_domain->nested_parent)
--
Regards,
Yi Liu
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH v2 1/1] iommu/vt-d: Remove caching mode check before device TLB flush
2024-04-10 6:30 ` Yi Liu
@ 2024-04-10 8:02 ` Baolu Lu
2024-04-10 9:14 ` Yi Liu
0 siblings, 1 reply; 9+ messages in thread
From: Baolu Lu @ 2024-04-10 8:02 UTC (permalink / raw)
To: Yi Liu, iommu
Cc: baolu.lu, Kevin Tian, Jacob Pan, Joerg Roedel, Will Deacon,
Robin Murphy, linux-kernel
On 2024/4/10 14:30, Yi Liu wrote:
> On 2024/4/10 13:58, Lu Baolu wrote:
>> The Caching Mode (CM) of the Intel IOMMU indicates if the hardware
>> implementation caches not-present or erroneous translation-structure
>> entries except the first-stage translation. The caching mode is
>> irrelevant to the device TLB , therefore there is no need to check
>> it before a device TLB invalidation operation.
>>
>> iommu_flush_iotlb_psi() is called in map and unmap paths. The caching
>> mode check before device TLB invalidation will cause device TLB
>> invalidation always issued if IOMMU is not running in caching mode.
>> This is wrong and causes unnecessary performance overhead.
>
> I don't think the original code is wrong. As I replied before, if CM==0,
> the iommu_flush_iotlb_psi() is only called in unmap path, in which the
> @map is false. [1] The reason to make the change is to make the logic
> simpler. 🙂
Oh, I see. There is a magic
if (cap_caching_mode(iommu->cap) && !domain->use_first_level)
iommu_flush_iotlb_psi(iommu, domain, pfn, pages, 0, 1);
in __mapping_notify_one().
So if it's caching mode, then
- iommu_flush_iotlb_psi() will be called with @map=1 from
__mapping_notify_one(), "!cap_caching_mode(iommu->cap) || !map" is
not true, and device TLB is not invalidated.
- iommu_flush_iotlb_psi() will also be called with @map=0 from
intel_iommu_tlb_sync(), device TLB is issued there.
That's the expected behavior for caching mode.
If it's not the caching mode, then
- iommu_flush_iotlb_psi() will be called with @map=0 from
intel_iommu_tlb_sync(), device TLB is issued there.
That's also the expected behavior.
So the existing code is correct but obscure and difficult to understand,
right? If so, we should make this patch as a cleanup rather than a fix.
Best regards,
baolu
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH v2 1/1] iommu/vt-d: Remove caching mode check before device TLB flush
2024-04-10 8:02 ` Baolu Lu
@ 2024-04-10 9:14 ` Yi Liu
2024-04-10 10:38 ` Baolu Lu
0 siblings, 1 reply; 9+ messages in thread
From: Yi Liu @ 2024-04-10 9:14 UTC (permalink / raw)
To: Baolu Lu, iommu
Cc: Kevin Tian, Jacob Pan, Joerg Roedel, Will Deacon, Robin Murphy,
linux-kernel
On 2024/4/10 16:02, Baolu Lu wrote:
> On 2024/4/10 14:30, Yi Liu wrote:
>> On 2024/4/10 13:58, Lu Baolu wrote:
>>> The Caching Mode (CM) of the Intel IOMMU indicates if the hardware
>>> implementation caches not-present or erroneous translation-structure
>>> entries except the first-stage translation. The caching mode is
>>> irrelevant to the device TLB , therefore there is no need to check
>>> it before a device TLB invalidation operation.
>>>
>>> iommu_flush_iotlb_psi() is called in map and unmap paths. The caching
>>> mode check before device TLB invalidation will cause device TLB
>>> invalidation always issued if IOMMU is not running in caching mode.
>>> This is wrong and causes unnecessary performance overhead.
>>
>> I don't think the original code is wrong. As I replied before, if CM==0,
>> the iommu_flush_iotlb_psi() is only called in unmap path, in which the
>> @map is false. [1] The reason to make the change is to make the logic
>> simpler. 🙂
>
> Oh, I see. There is a magic
>
> if (cap_caching_mode(iommu->cap) && !domain->use_first_level)
> iommu_flush_iotlb_psi(iommu, domain, pfn, pages, 0, 1);
>
> in __mapping_notify_one().
>
> So if it's caching mode, then
>
> - iommu_flush_iotlb_psi() will be called with @map=1 from
> __mapping_notify_one(), "!cap_caching_mode(iommu->cap) || !map" is
> not true, and device TLB is not invalidated.
> - iommu_flush_iotlb_psi() will also be called with @map=0 from
> intel_iommu_tlb_sync(), device TLB is issued there.
>
> That's the expected behavior for caching mode.
>
> If it's not the caching mode, then
>
> - iommu_flush_iotlb_psi() will be called with @map=0 from
> intel_iommu_tlb_sync(), device TLB is issued there.
>
> That's also the expected behavior.
>
> So the existing code is correct but obscure and difficult to understand,
> right? If so, we should make this patch as a cleanup rather than a fix.
aha, yes. As the below table, iommu_flush_iotlb_psi() does flush device TLB
as expected. But there is a NA case. When CM==0, it should not be possible
to call iommu_flush_iotlb_psi() with @map==1 as cache invalidation is not
required when CM==0. So the existing code logic is really confusing,
checking @map is enough and clearer. Since the old code works, so perhaps
no fix tag is needed. :)
+----+------+-----------+------------+
| \ | | |
| \ @map | | |
| CM \ | 0 | 1 |
| \ | | |
+------+---+------------+------------+
| | | |
| 0 | Y | NA |
+----------+------------+------------+
| | | |
| 1 | Y | N |
+----------+------------+------------+
Y means flush dev-TLB please
N means no need to flush dev-TLB
NA means not applied
BTW. I think it is better to have the below change in a separate patch.
The below change does fix a improper dev-TLB flushing behavior. Also
how about Kevin's concern in the end of [1]. I didn't see your respond
about it.
@@ -1579,8 +1575,7 @@ static void intel_flush_iotlb_all(struct iommu_domain
*domain)
iommu->flush.flush_iotlb(iommu, did, 0, 0,
DMA_TLB_DSI_FLUSH);
- if (!cap_caching_mode(iommu->cap))
- iommu_flush_dev_iotlb(dmar_domain, 0, MAX_AGAW_PFN_WIDTH);
+ iommu_flush_dev_iotlb(dmar_domain, 0, MAX_AGAW_PFN_WIDTH);
}
if (dmar_domain->nested_parent)
[1]
https://lore.kernel.org/linux-iommu/BN9PR11MB52764F42C20B6B18DDE7E66B8C072@BN9PR11MB5276.namprd11.prod.outlook.com/
--
Regards,
Yi Liu
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 1/1] iommu/vt-d: Remove caching mode check before device TLB flush
2024-04-10 9:14 ` Yi Liu
@ 2024-04-10 10:38 ` Baolu Lu
2024-04-12 9:34 ` Yi Liu
0 siblings, 1 reply; 9+ messages in thread
From: Baolu Lu @ 2024-04-10 10:38 UTC (permalink / raw)
To: Yi Liu, iommu
Cc: baolu.lu, Kevin Tian, Jacob Pan, Joerg Roedel, Will Deacon,
Robin Murphy, linux-kernel
On 2024/4/10 17:14, Yi Liu wrote:
>
>
> On 2024/4/10 16:02, Baolu Lu wrote:
>> On 2024/4/10 14:30, Yi Liu wrote:
>>> On 2024/4/10 13:58, Lu Baolu wrote:
>>>> The Caching Mode (CM) of the Intel IOMMU indicates if the hardware
>>>> implementation caches not-present or erroneous translation-structure
>>>> entries except the first-stage translation. The caching mode is
>>>> irrelevant to the device TLB , therefore there is no need to check
>>>> it before a device TLB invalidation operation.
>>>>
>>>> iommu_flush_iotlb_psi() is called in map and unmap paths. The caching
>>>> mode check before device TLB invalidation will cause device TLB
>>>> invalidation always issued if IOMMU is not running in caching mode.
>>>> This is wrong and causes unnecessary performance overhead.
>>>
>>> I don't think the original code is wrong. As I replied before, if CM==0,
>>> the iommu_flush_iotlb_psi() is only called in unmap path, in which the
>>> @map is false. [1] The reason to make the change is to make the logic
>>> simpler. 🙂
>>
>> Oh, I see. There is a magic
>>
>> if (cap_caching_mode(iommu->cap) && !domain->use_first_level)
>> iommu_flush_iotlb_psi(iommu, domain, pfn, pages, 0, 1);
>>
>> in __mapping_notify_one().
>>
>> So if it's caching mode, then
>>
>> - iommu_flush_iotlb_psi() will be called with @map=1 from
>> __mapping_notify_one(), "!cap_caching_mode(iommu->cap) || !map" is
>> not true, and device TLB is not invalidated.
>> - iommu_flush_iotlb_psi() will also be called with @map=0 from
>> intel_iommu_tlb_sync(), device TLB is issued there.
>>
>> That's the expected behavior for caching mode.
>>
>> If it's not the caching mode, then
>>
>> - iommu_flush_iotlb_psi() will be called with @map=0 from
>> intel_iommu_tlb_sync(), device TLB is issued there.
>>
>> That's also the expected behavior.
>>
>> So the existing code is correct but obscure and difficult to understand,
>> right? If so, we should make this patch as a cleanup rather than a fix.
>
> aha, yes. As the below table, iommu_flush_iotlb_psi() does flush device TLB
> as expected. But there is a NA case. When CM==0, it should not be possible
> to call iommu_flush_iotlb_psi() with @map==1 as cache invalidation is not
> required when CM==0. So the existing code logic is really confusing,
> checking @map is enough and clearer. Since the old code works, so perhaps
> no fix tag is needed. :)
>
> +----+------+-----------+------------+
> | \ | | |
> | \ @map | | |
> | CM \ | 0 | 1 |
> | \ | | |
> +------+---+------------+------------+
> | | | |
> | 0 | Y | NA |
> +----------+------------+------------+
> | | | |
> | 1 | Y | N |
> +----------+------------+------------+
>
> Y means flush dev-TLB please
> N means no need to flush dev-TLB
> NA means not applied
Yes. We have the same understanding now. :-)
>
> BTW. I think it is better to have the below change in a separate patch.
> The below change does fix a improper dev-TLB flushing behavior. Also
> how about Kevin's concern in the end of [1]. I didn't see your respond
> about it.
I had an offline discussion with him and I included the conclusion in
the commit message of this patch.
Best regards,
baolu
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 1/1] iommu/vt-d: Remove caching mode check before device TLB flush
2024-04-10 10:38 ` Baolu Lu
@ 2024-04-12 9:34 ` Yi Liu
0 siblings, 0 replies; 9+ messages in thread
From: Yi Liu @ 2024-04-12 9:34 UTC (permalink / raw)
To: Baolu Lu, iommu
Cc: Kevin Tian, Jacob Pan, Joerg Roedel, Will Deacon, Robin Murphy,
linux-kernel
On 2024/4/10 18:38, Baolu Lu wrote:
> On 2024/4/10 17:14, Yi Liu wrote:
>>
>>
>> On 2024/4/10 16:02, Baolu Lu wrote:
>>> On 2024/4/10 14:30, Yi Liu wrote:
>>>> On 2024/4/10 13:58, Lu Baolu wrote:
>>>>> The Caching Mode (CM) of the Intel IOMMU indicates if the hardware
>>>>> implementation caches not-present or erroneous translation-structure
>>>>> entries except the first-stage translation. The caching mode is
>>>>> irrelevant to the device TLB , therefore there is no need to check
>>>>> it before a device TLB invalidation operation.
>>>>>
>>>>> iommu_flush_iotlb_psi() is called in map and unmap paths. The caching
>>>>> mode check before device TLB invalidation will cause device TLB
>>>>> invalidation always issued if IOMMU is not running in caching mode.
>>>>> This is wrong and causes unnecessary performance overhead.
>>>>
>>>> I don't think the original code is wrong. As I replied before, if CM==0,
>>>> the iommu_flush_iotlb_psi() is only called in unmap path, in which the
>>>> @map is false. [1] The reason to make the change is to make the logic
>>>> simpler. 🙂
>>>
>>> Oh, I see. There is a magic
>>>
>>> if (cap_caching_mode(iommu->cap) && !domain->use_first_level)
>>> iommu_flush_iotlb_psi(iommu, domain, pfn, pages, 0, 1);
>>>
>>> in __mapping_notify_one().
>>>
>>> So if it's caching mode, then
>>>
>>> - iommu_flush_iotlb_psi() will be called with @map=1 from
>>> __mapping_notify_one(), "!cap_caching_mode(iommu->cap) || !map" is
>>> not true, and device TLB is not invalidated.
>>> - iommu_flush_iotlb_psi() will also be called with @map=0 from
>>> intel_iommu_tlb_sync(), device TLB is issued there.
>>>
>>> That's the expected behavior for caching mode.
>>>
>>> If it's not the caching mode, then
>>>
>>> - iommu_flush_iotlb_psi() will be called with @map=0 from
>>> intel_iommu_tlb_sync(), device TLB is issued there.
>>>
>>> That's also the expected behavior.
>>>
>>> So the existing code is correct but obscure and difficult to understand,
>>> right? If so, we should make this patch as a cleanup rather than a fix.
>>
>> aha, yes. As the below table, iommu_flush_iotlb_psi() does flush device TLB
>> as expected. But there is a NA case. When CM==0, it should not be possible
>> to call iommu_flush_iotlb_psi() with @map==1 as cache invalidation is not
>> required when CM==0. So the existing code logic is really confusing,
>> checking @map is enough and clearer. Since the old code works, so perhaps
>> no fix tag is needed. :)
>>
>> +----+------+-----------+------------+
>> | \ | | |
>> | \ @map | | |
>> | CM \ | 0 | 1 |
>> | \ | | |
>> +------+---+------------+------------+
>> | | | |
>> | 0 | Y | NA |
>> +----------+------------+------------+
>> | | | |
>> | 1 | Y | N |
>> +----------+------------+------------+
>>
>> Y means flush dev-TLB please
>> N means no need to flush dev-TLB
>> NA means not applied
>
> Yes. We have the same understanding now. :-)
yeah, would be helpful to refine the commit message w.r.t. this change.
>>
>> BTW. I think it is better to have the below change in a separate patch.
>> The below change does fix a improper dev-TLB flushing behavior. Also
>> how about Kevin's concern in the end of [1]. I didn't see your respond
>> about it.
>
> I had an offline discussion with him and I included the conclusion in
> the commit message of this patch.
ok. So the key reason is that intel_flush_iotlb_all() is not called at
all if CM==1 after that commit. So there is nothing fixed by this change.
right? This just makes the logic cleaner. Perhaps no need for a fix tag.
Reviewed-by: Yi Liu <yi.l.liu@intel.com>
--
Regards,
Yi Liu
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 1/1] iommu/vt-d: Remove caching mode check before device TLB flush
2024-04-10 5:58 [PATCH v2 1/1] iommu/vt-d: Remove caching mode check before device TLB flush Lu Baolu
2024-04-10 6:14 ` Tian, Kevin
2024-04-10 6:30 ` Yi Liu
@ 2024-04-11 13:13 ` Robin Murphy
2024-04-11 13:48 ` Baolu Lu
2 siblings, 1 reply; 9+ messages in thread
From: Robin Murphy @ 2024-04-11 13:13 UTC (permalink / raw)
To: Lu Baolu, iommu
Cc: Kevin Tian, Yi Liu, Jacob Pan, Joerg Roedel, Will Deacon,
linux-kernel
On 10/04/2024 6:58 am, Lu Baolu wrote:
> The Caching Mode (CM) of the Intel IOMMU indicates if the hardware
> implementation caches not-present or erroneous translation-structure
> entries except the first-stage translation. The caching mode is
> irrelevant to the device TLB , therefore there is no need to check
> it before a device TLB invalidation operation.
>
> iommu_flush_iotlb_psi() is called in map and unmap paths. The caching
> mode check before device TLB invalidation will cause device TLB
> invalidation always issued if IOMMU is not running in caching mode.
> This is wrong and causes unnecessary performance overhead.
>
> The removal of caching mode check in intel_flush_iotlb_all() doesn't
> impact anything no matter the IOMMU is working in caching mode or not.
> Commit <29b32839725f> ("iommu/vt-d: Do not use flush-queue when
> caching-mode is on") has already disabled flush-queue for caching mode,
> hence caching mode will never call intel_flush_iotlb_all().
Well, technically it might still, at domain creation via
iommu_create_device_direct_mappings(), but domain->has_iotlb_device
should definitely be false at that point :)
Cheers,
Robin.
> Fixes: bf92df30df90 ("intel-iommu: Only avoid flushing device IOTLB for domain ID 0 in caching mode")
> Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
> ---
> drivers/iommu/intel/iommu.c | 9 ++-------
> 1 file changed, 2 insertions(+), 7 deletions(-)
>
> Change log:
>
> v2:
> - Squash two patches into a single one.
> - No functionality changes.
>
> v1: https://lore.kernel.org/linux-iommu/20240407144232.190355-1-baolu.lu@linux.intel.com/
>
> diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
> index 50eb9aed47cc..681789b1258d 100644
> --- a/drivers/iommu/intel/iommu.c
> +++ b/drivers/iommu/intel/iommu.c
> @@ -1501,11 +1501,7 @@ static void iommu_flush_iotlb_psi(struct intel_iommu *iommu,
> else
> __iommu_flush_iotlb_psi(iommu, did, pfn, pages, ih);
>
> - /*
> - * In caching mode, changes of pages from non-present to present require
> - * flush. However, device IOTLB doesn't need to be flushed in this case.
> - */
> - if (!cap_caching_mode(iommu->cap) || !map)
> + if (!map)
> iommu_flush_dev_iotlb(domain, addr, mask);
> }
>
> @@ -1579,8 +1575,7 @@ static void intel_flush_iotlb_all(struct iommu_domain *domain)
> iommu->flush.flush_iotlb(iommu, did, 0, 0,
> DMA_TLB_DSI_FLUSH);
>
> - if (!cap_caching_mode(iommu->cap))
> - iommu_flush_dev_iotlb(dmar_domain, 0, MAX_AGAW_PFN_WIDTH);
> + iommu_flush_dev_iotlb(dmar_domain, 0, MAX_AGAW_PFN_WIDTH);
> }
>
> if (dmar_domain->nested_parent)
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH v2 1/1] iommu/vt-d: Remove caching mode check before device TLB flush
2024-04-11 13:13 ` Robin Murphy
@ 2024-04-11 13:48 ` Baolu Lu
0 siblings, 0 replies; 9+ messages in thread
From: Baolu Lu @ 2024-04-11 13:48 UTC (permalink / raw)
To: Robin Murphy, iommu
Cc: baolu.lu, Kevin Tian, Yi Liu, Jacob Pan, Joerg Roedel,
Will Deacon, linux-kernel
On 2024/4/11 21:13, Robin Murphy wrote:
> On 10/04/2024 6:58 am, Lu Baolu wrote:
>> The Caching Mode (CM) of the Intel IOMMU indicates if the hardware
>> implementation caches not-present or erroneous translation-structure
>> entries except the first-stage translation. The caching mode is
>> irrelevant to the device TLB , therefore there is no need to check
>> it before a device TLB invalidation operation.
>>
>> iommu_flush_iotlb_psi() is called in map and unmap paths. The caching
>> mode check before device TLB invalidation will cause device TLB
>> invalidation always issued if IOMMU is not running in caching mode.
>> This is wrong and causes unnecessary performance overhead.
>>
>> The removal of caching mode check in intel_flush_iotlb_all() doesn't
>> impact anything no matter the IOMMU is working in caching mode or not.
>> Commit <29b32839725f> ("iommu/vt-d: Do not use flush-queue when
>> caching-mode is on") has already disabled flush-queue for caching mode,
>> hence caching mode will never call intel_flush_iotlb_all().
>
> Well, technically it might still, at domain creation via
> iommu_create_device_direct_mappings(), but domain->has_iotlb_device
> should definitely be false at that point 🙂
Oh! I overlooked that path. :-)
Yes. iommu_create_device_direct_mappings() is called before setting the
domain to device for intel iommu driver, hence in practice the
domain->has_iotlb_device is always false.
Best regards,
baolu
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2024-04-12 9:31 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-04-10 5:58 [PATCH v2 1/1] iommu/vt-d: Remove caching mode check before device TLB flush Lu Baolu
2024-04-10 6:14 ` Tian, Kevin
2024-04-10 6:30 ` Yi Liu
2024-04-10 8:02 ` Baolu Lu
2024-04-10 9:14 ` Yi Liu
2024-04-10 10:38 ` Baolu Lu
2024-04-12 9:34 ` Yi Liu
2024-04-11 13:13 ` Robin Murphy
2024-04-11 13:48 ` Baolu Lu
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox