|
|
@@ -1340,18 +1340,21 @@ static void domain_flush_devices(struct protection_domain *domain)
|
|
|
* another level increases the size of the address space by 9 bits to a size up
|
|
|
* to 64 bits.
|
|
|
*/
|
|
|
-static bool increase_address_space(struct protection_domain *domain,
|
|
|
+static void increase_address_space(struct protection_domain *domain,
|
|
|
gfp_t gfp)
|
|
|
{
|
|
|
+ unsigned long flags;
|
|
|
u64 *pte;
|
|
|
|
|
|
- if (domain->mode == PAGE_MODE_6_LEVEL)
|
|
|
+ spin_lock_irqsave(&domain->lock, flags);
|
|
|
+
|
|
|
+ if (WARN_ON_ONCE(domain->mode == PAGE_MODE_6_LEVEL))
|
|
|
/* address space already 64 bit large */
|
|
|
- return false;
|
|
|
+ goto out;
|
|
|
|
|
|
pte = (void *)get_zeroed_page(gfp);
|
|
|
if (!pte)
|
|
|
- return false;
|
|
|
+ goto out;
|
|
|
|
|
|
*pte = PM_LEVEL_PDE(domain->mode,
|
|
|
iommu_virt_to_phys(domain->pt_root));
|
|
|
@@ -1359,7 +1362,10 @@ static bool increase_address_space(struct protection_domain *domain,
|
|
|
domain->mode += 1;
|
|
|
domain->updated = true;
|
|
|
|
|
|
- return true;
|
|
|
+out:
|
|
|
+ spin_unlock_irqrestore(&domain->lock, flags);
|
|
|
+
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
static u64 *alloc_pte(struct protection_domain *domain,
|