Merge tag 'iommu-fixes-v6.19-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/iommu/linux

Pull iommu fixes from Joerg Roedel:

- Fix a performance regression cause by the new Generic IO-Page-Table
code detected in Intel VT-d driver

- Command queue flushing fix for NVidia version of the ARM-SMMU-v3

* tag 'iommu-fixes-v6.19-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/iommu/linux:
iommu/tegra241-cmdqv: Reset VCMDQ in tegra241_vcmdq_hw_init_user()
iommupt: Only cache flush memory changed by unmap

+13 -1
+3
drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c
··· 1078 1078 { 1079 1079 char header[64]; 1080 1080 1081 + /* Reset VCMDQ */ 1082 + tegra241_vcmdq_hw_deinit(vcmdq); 1083 + 1081 1084 /* Configure the vcmdq only; User space does the enabling */ 1082 1085 writeq_relaxed(vcmdq->cmdq.q.q_base, REG_VCMDQ_PAGE1(vcmdq, BASE)); 1083 1086
+10 -1
drivers/iommu/generic_pt/iommu_pt.h
··· 931 931 struct pt_table_p *table) 932 932 { 933 933 struct pt_state pts = pt_init(range, level, table); 934 + unsigned int flush_start_index = UINT_MAX; 935 + unsigned int flush_end_index = UINT_MAX; 934 936 struct pt_unmap_args *unmap = arg; 935 937 unsigned int num_oas = 0; 936 938 unsigned int start_index; ··· 988 986 iommu_pages_list_add(&unmap->free_list, 989 987 pts.table_lower); 990 988 pt_clear_entries(&pts, ilog2(1)); 989 + if (pts.index < flush_start_index) 990 + flush_start_index = pts.index; 991 + flush_end_index = pts.index + 1; 991 992 } 992 993 pts.index++; 993 994 } else { ··· 1004 999 num_contig_lg2 = pt_entry_num_contig_lg2(&pts); 1005 1000 pt_clear_entries(&pts, num_contig_lg2); 1006 1001 num_oas += log2_to_int(num_contig_lg2); 1002 + if (pts.index < flush_start_index) 1003 + flush_start_index = pts.index; 1007 1004 pts.index += log2_to_int(num_contig_lg2); 1005 + flush_end_index = pts.index; 1008 1006 } 1009 1007 if (pts.index >= pts.end_index) 1010 1008 break; ··· 1015 1007 } while (true); 1016 1008 1017 1009 unmap->unmapped += log2_mul(num_oas, pt_table_item_lg2sz(&pts)); 1018 - flush_writes_range(&pts, start_index, pts.index); 1010 + if (flush_start_index != flush_end_index) 1011 + flush_writes_range(&pts, flush_start_index, flush_end_index); 1019 1012 1020 1013 return ret; 1021 1014 }