On 2022-03-04 04:46, yf.wang--- via iommu wrote:
From: Yunfei Wang yf.wang@mediatek.com
In alloc_iova_fast function, if an iova alloc request fail, it will free the iova ranges present in the percpu iova rcaches and free global iova rcache and then retry, but flushing CPU iova rcaches only for each online CPU, which will cause incomplete rcache cleaning, and iova rcaches of not online CPU cannot be flushed, because iova rcaches may also lead to fragmentation of iova space, so the next retry action may still be fail.
Based on the above, so need to flushing all iova rcaches for each possible CPU, use for_each_possible_cpu instead of for_each_online_cpu like in free_iova_rcaches function, so that all rcaches can be completely released to try replenishing IOVAs.
OK, so either there's a mystery bug where IOVAs somehow get freed on offline CPUs, or the hotplug notifier isn't working correctly, or you've contrived a situation where alloc_iova_fast() is actually racing against iova_cpuhp_dead(). In the latter case, the solution is "don't do that".
This change should not be necessary.
Thanks, Robin.
Signed-off-by: Yunfei Wang yf.wang@mediatek.com Cc: stable@vger.kernel.org # 5.4.*
drivers/iommu/iova.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/iommu/iova.c b/drivers/iommu/iova.c index b28c9435b898..5a0637cd7bc2 100644 --- a/drivers/iommu/iova.c +++ b/drivers/iommu/iova.c @@ -460,7 +460,7 @@ alloc_iova_fast(struct iova_domain *iovad, unsigned long size, /* Try replenishing IOVAs by flushing rcache. */ flush_rcache = false;
for_each_online_cpu(cpu)
free_global_cached_iovas(iovad); goto retry;for_each_possible_cpu(cpu) free_cpu_cached_iovas(cpu, iovad);
iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu