x86/mm/cpa: Fix populate_pgd(): Stop trying to deallocate failed PUDs
[deliverable/linux.git] / arch / x86 / mm / pageattr.c
index 26c93c6e04a015bb199a0ba6a55eef32e9d02f24..2bc6ea153f763793ddda06af489adcc3656b5249 100644 (file)
@@ -1082,6 +1082,8 @@ static int populate_pgd(struct cpa_data *cpa, unsigned long addr)
                pud = (pud_t *)get_zeroed_page(GFP_KERNEL | __GFP_NOTRACK);
                if (!pud)
                        return -1;
+
+               set_pgd(pgd_entry, __pgd(__pa(pud) | _KERNPG_TABLE));
        }
 
        pgprot_val(pgprot) &= ~pgprot_val(cpa->mask_clr);
@@ -1089,16 +1091,11 @@ static int populate_pgd(struct cpa_data *cpa, unsigned long addr)
 
        ret = populate_pud(cpa, addr, pgd_entry, pgprot);
        if (ret < 0) {
-               if (pud)
-                       free_page((unsigned long)pud);
                unmap_pud_range(pgd_entry, addr,
                                addr + (cpa->numpages << PAGE_SHIFT));
                return ret;
        }
 
-       if (pud)
-               set_pgd(pgd_entry, __pgd(__pa(pud) | _KERNPG_TABLE));
-
        cpa->numpages = ret;
        return 0;
 }
This page took 0.029304 seconds and 5 git commands to generate.