Previously, when the caller to iommu_domain_unload_entry() passed the value "true" for the parameter "free", there was no guarantee that the invalidation was complete, in other words, dmar_qi_task() was done with the entry, before the caller finally freed the entry.
I think we need to force entry through the qi. From the Intel® Virtualization Technology for Directed I/O Architecture Specification, Rev. 4.0, Order Number: D51397-015
6.5.1 Register-based Invalidation Interface Register-based invalidation has the following limitations: • Register-based invalidation can be used only when queued-invalidations are not enabled.
I remember that the requirement was there from the start.