1 /* 2 * This file is subject to the terms and conditions of the GNU General Public 3 * License. See the file "COPYING" in the main directory of this archive 4 * for more details. 5 */ 6 #include <linux/export.h> 7 #include <linux/mm.h> 8 #include <linux/string.h> 9 #include <asm/pgalloc.h> 10 11 pgd_t *pgd_alloc(struct mm_struct *mm) 12 { 13 pgd_t *ret, *init; 14 15 ret = (pgd_t *) __get_free_pages(GFP_KERNEL, PGD_ORDER); 16 if (ret) { 17 init = pgd_offset(&init_mm, 0UL); 18 pgd_init((unsigned long)ret); 19 memcpy(ret + USER_PTRS_PER_PGD, init + USER_PTRS_PER_PGD, 20 (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t)); 21 } 22 23 return ret; 24 } 25 EXPORT_SYMBOL_GPL(pgd_alloc); 26