|
@@ -1104,8 +1104,6 @@ static int populate_pgd(struct cpa_data *cpa, unsigned long addr)
|
|
pud = (pud_t *)get_zeroed_page(GFP_KERNEL | __GFP_NOTRACK);
|
|
pud = (pud_t *)get_zeroed_page(GFP_KERNEL | __GFP_NOTRACK);
|
|
if (!pud)
|
|
if (!pud)
|
|
return -1;
|
|
return -1;
|
|
-
|
|
|
|
- set_pgd(pgd_entry, __pgd(__pa(pud) | _KERNPG_TABLE));
|
|
|
|
}
|
|
}
|
|
|
|
|
|
pgprot_val(pgprot) &= ~pgprot_val(cpa->mask_clr);
|
|
pgprot_val(pgprot) &= ~pgprot_val(cpa->mask_clr);
|
|
@@ -1113,11 +1111,16 @@ static int populate_pgd(struct cpa_data *cpa, unsigned long addr)
|
|
|
|
|
|
ret = populate_pud(cpa, addr, pgd_entry, pgprot);
|
|
ret = populate_pud(cpa, addr, pgd_entry, pgprot);
|
|
if (ret < 0) {
|
|
if (ret < 0) {
|
|
- unmap_pgd_range(cpa->pgd, addr,
|
|
|
|
|
|
+ if (pud)
|
|
|
|
+ free_page((unsigned long)pud);
|
|
|
|
+ unmap_pud_range(pgd_entry, addr,
|
|
addr + (cpa->numpages << PAGE_SHIFT));
|
|
addr + (cpa->numpages << PAGE_SHIFT));
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (pud)
|
|
|
|
+ set_pgd(pgd_entry, __pgd(__pa(pud) | _KERNPG_TABLE));
|
|
|
|
+
|
|
cpa->numpages = ret;
|
|
cpa->numpages = ret;
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|