pgtable.c 711 B

123456789101112131415161718192021222324252627
  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. pgd_t *pgd_alloc(struct mm_struct *mm)
  11. {
  12. pgd_t *init, *ret = NULL;
  13. struct ptdesc *ptdesc = pagetable_alloc(GFP_KERNEL & ~__GFP_HIGHMEM,
  14. PGD_TABLE_ORDER);
  15. if (ptdesc) {
  16. ret = ptdesc_address(ptdesc);
  17. init = pgd_offset(&init_mm, 0UL);
  18. pgd_init(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. return ret;
  23. }
  24. EXPORT_SYMBOL_GPL(pgd_alloc);