James Hogan | 814f91b | 2017-02-02 01:21:35 +0000 | [diff] [blame] | 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); |