diff options
Diffstat (limited to 'drivers/iommu/amd/io_pgtable.c')
| -rw-r--r-- | drivers/iommu/amd/io_pgtable.c | 10 | 
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/iommu/amd/io_pgtable.c b/drivers/iommu/amd/io_pgtable.c index 1c4961e05c12..bb0ee5c9fde7 100644 --- a/drivers/iommu/amd/io_pgtable.c +++ b/drivers/iommu/amd/io_pgtable.c @@ -182,6 +182,10 @@ static bool increase_address_space(struct protection_domain *domain,  	bool ret = true;  	u64 *pte; +	pte = (void *)get_zeroed_page(gfp); +	if (!pte) +		return false; +  	spin_lock_irqsave(&domain->lock, flags);  	if (address <= PM_LEVEL_SIZE(domain->iop.mode)) @@ -191,10 +195,6 @@ static bool increase_address_space(struct protection_domain *domain,  	if (WARN_ON_ONCE(domain->iop.mode == PAGE_MODE_6_LEVEL))  		goto out; -	pte = (void *)get_zeroed_page(gfp); -	if (!pte) -		goto out; -  	*pte = PM_LEVEL_PDE(domain->iop.mode, iommu_virt_to_phys(domain->iop.root));  	domain->iop.root  = pte; @@ -208,10 +208,12 @@ static bool increase_address_space(struct protection_domain *domain,  	 */  	amd_iommu_domain_set_pgtable(domain, pte, domain->iop.mode); +	pte = NULL;  	ret = true;  out:  	spin_unlock_irqrestore(&domain->lock, flags); +	free_page((unsigned long)pte);  	return ret;  }  | 
