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} |