Example #1
0
pgd_t *pgd_alloc(struct mm_struct *mm)
{
    int i;
    pgd_t *pgd = quicklist_alloc(0, GFP_KERNEL, pgd_ctor);

    if (PTRS_PER_PMD == 1 || !pgd)
        return pgd;

    for (i = 0; i < UNSHARED_PTRS_PER_PGD; ++i) {
        pmd_t *pmd = pmd_cache_alloc(i);

        if (!pmd)
            goto out_oom;

        paravirt_alloc_pd(__pa(pmd) >> PAGE_SHIFT);
        set_pgd(&pgd[i], __pgd(1 + __pa(pmd)));
    }
    return pgd;

out_oom:
    for (i--; i >= 0; i--) {
        pgd_t pgdent = pgd[i];
        void* pmd = (void *)__va(pgd_val(pgdent)-1);
        paravirt_release_pd(__pa(pmd) >> PAGE_SHIFT);
        pmd_cache_free(pmd, i);
    }
    quicklist_free(0, pgd_dtor, pgd);
    return NULL;
}
Example #2
0
void pgd_free(pgd_t *pgd)
{
    int i;

    /* in the PAE case user pgd entries are overwritten before usage */
    if (PTRS_PER_PMD > 1)
        for (i = 0; i < UNSHARED_PTRS_PER_PGD; ++i) {
            pgd_t pgdent = pgd[i];
            void* pmd = (void *)__va(pgd_val(pgdent)-1);
            paravirt_release_pd(__pa(pmd) >> PAGE_SHIFT);
            pmd_cache_free(pmd, i);
        }
    /* in the non-PAE case, free_pgtables() clears user pgd entries */
    quicklist_free(0, pgd_dtor, pgd);
}
Example #3
0
void pgd_free(struct mm_struct *mm, pgd_t *pgd)
{
    quicklist_free(0, pgd_dtor, pgd);
}
Example #4
0
void pgd_free(struct mm_struct *mm, pgd_t *pgd)
{
	/* in the non-PAE case, clear_page_tables() clears user pgd entries */
 	quicklist_free(0, pgd_dtor, pgd);
}