void protection_domain_free(struct protection_domain *domain)
{
- if (!domain)
- return;
-
WARN_ON(!list_empty(&domain->dev_list));
-
- if (domain->iop.pgtbl.cfg.tlb)
- free_io_pgtable_ops(&domain->iop.pgtbl.ops);
-
- if (domain->id)
- domain_id_free(domain->id);
-
+ free_io_pgtable_ops(&domain->iop.pgtbl.ops);
+ domain_id_free(domain->id);
kfree(domain);
}
domain->id = domain_id_alloc();
if (!domain->id)
- goto out_err;
+ goto err_free;
spin_lock_init(&domain->lock);
INIT_LIST_HEAD(&domain->dev_list);
pgtable = AMD_IOMMU_V1;
break;
default:
- goto out_err;
+ goto err_id;
}
switch (pgtable) {
domain->pd_mode = PD_MODE_V2;
break;
default:
- goto out_err;
+ goto err_id;
}
pgtbl_ops =
alloc_io_pgtable_ops(pgtable, &domain->iop.pgtbl.cfg, domain);
if (!pgtbl_ops)
- goto out_err;
+ goto err_id;
return domain;
-out_err:
- protection_domain_free(domain);
+err_id:
+ domain_id_free(domain->id);
+err_free:
+ kfree(domain);
return NULL;
}
struct protection_domain *domain;
unsigned long flags;
- if (!dom)
- return;
-
domain = to_pdomain(dom);
spin_lock_irqsave(&domain->lock, flags);