pgd.c (b0d03745b18c39b8e86e70f7778f2093d2cd4ed7) pgd.c (6e4beb5e682953212da48ebb9e5c90408b8d38ae)
1/*
2 * linux/arch/arm/mm/pgd.c
3 *
4 * Copyright (C) 1998-2005 Russell King
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.

--- 59 unchanged lines hidden (view full) ---

68no_pte:
69 pmd_free(mm, new_pmd);
70no_pmd:
71 free_pages((unsigned long)new_pgd, 2);
72no_pgd:
73 return NULL;
74}
75
1/*
2 * linux/arch/arm/mm/pgd.c
3 *
4 * Copyright (C) 1998-2005 Russell King
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.

--- 59 unchanged lines hidden (view full) ---

68no_pte:
69 pmd_free(mm, new_pmd);
70no_pmd:
71 free_pages((unsigned long)new_pgd, 2);
72no_pgd:
73 return NULL;
74}
75
76void pgd_free(struct mm_struct *mm, pgd_t *pgd)
76void pgd_free(struct mm_struct *mm, pgd_t *pgd_base)
77{
77{
78 pgd_t *pgd;
78 pmd_t *pmd;
79 pgtable_t pte;
80
79 pmd_t *pmd;
80 pgtable_t pte;
81
81 if (!pgd)
82 if (!pgd_base)
82 return;
83
83 return;
84
84 /* pgd is always present and good */
85 pmd = pmd_off(pgd, 0);
86 if (pmd_none(*pmd))
87 goto free;
88 if (pmd_bad(*pmd)) {
89 pmd_ERROR(*pmd);
90 pmd_clear(pmd);
91 goto free;
92 }
85 pgd = pgd_base + pgd_index(0);
86 if (pgd_none_or_clear_bad(pgd))
87 goto no_pgd;
93
88
89 pmd = pmd_offset(pgd, 0);
90 if (pmd_none_or_clear_bad(pmd))
91 goto no_pmd;
92
94 pte = pmd_pgtable(*pmd);
95 pmd_clear(pmd);
96 pte_free(mm, pte);
93 pte = pmd_pgtable(*pmd);
94 pmd_clear(pmd);
95 pte_free(mm, pte);
96no_pmd:
97 pgd_clear(pgd);
97 pmd_free(mm, pmd);
98 pmd_free(mm, pmd);
98free:
99 free_pages((unsigned long) pgd, 2);
99no_pgd:
100 free_pages((unsigned long) pgd_base, 2);
100}
101}