mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 16:54:21 +00:00 
			
		
		
		
	iommu/tegra-smmu: Balance IOMMU group reference count
For groups that are shared between multiple devices, care must be taken to acquire a reference for each device, otherwise the IOMMU core ends up dropping the last reference too early, which will cause the group to be released while consumers may still be thinking that they're holding a reference to it. Signed-off-by: Thierry Reding <treding@nvidia.com> Link: https://lore.kernel.org/r/20200806155404.3936074-3-thierry.reding@gmail.com Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
		
							parent
							
								
									002957020e
								
							
						
					
					
						commit
						5b30fbfa2a
					
				
					 1 changed files with 3 additions and 1 deletions
				
			
		|  | @ -818,6 +818,7 @@ static struct iommu_group *tegra_smmu_group_get(struct tegra_smmu *smmu, | |||
| { | ||||
| 	const struct tegra_smmu_group_soc *soc; | ||||
| 	struct tegra_smmu_group *group; | ||||
| 	struct iommu_group *grp; | ||||
| 
 | ||||
| 	soc = tegra_smmu_find_group(smmu, swgroup); | ||||
| 	if (!soc) | ||||
|  | @ -827,8 +828,9 @@ static struct iommu_group *tegra_smmu_group_get(struct tegra_smmu *smmu, | |||
| 
 | ||||
| 	list_for_each_entry(group, &smmu->groups, list) | ||||
| 		if (group->soc == soc) { | ||||
| 			grp = iommu_group_ref_get(group->group); | ||||
| 			mutex_unlock(&smmu->lock); | ||||
| 			return group->group; | ||||
| 			return grp; | ||||
| 		} | ||||
| 
 | ||||
| 	group = devm_kzalloc(smmu->dev, sizeof(*group), GFP_KERNEL); | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Thierry Reding
						Thierry Reding