linux/arch/arm64/mm/pgd.c
<<
>>
Prefs
   1/*
   2 * PGD allocation/freeing
   3 *
   4 * Copyright (C) 2012 ARM Ltd.
   5 * Author: Catalin Marinas <catalin.marinas@arm.com>
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License version 2 as
   9 * published by the Free Software Foundation.
  10 *
  11 * This program is distributed in the hope that it will be useful,
  12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14 * GNU General Public License for more details.
  15 *
  16 * You should have received a copy of the GNU General Public License
  17 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  18 */
  19
  20#include <linux/mm.h>
  21#include <linux/gfp.h>
  22#include <linux/highmem.h>
  23#include <linux/slab.h>
  24
  25#include <asm/pgalloc.h>
  26#include <asm/page.h>
  27#include <asm/tlbflush.h>
  28
  29#include "mm.h"
  30
  31#define PGD_SIZE        (PTRS_PER_PGD * sizeof(pgd_t))
  32
  33pgd_t *pgd_alloc(struct mm_struct *mm)
  34{
  35        pgd_t *new_pgd;
  36
  37        if (PGD_SIZE == PAGE_SIZE)
  38                new_pgd = (pgd_t *)get_zeroed_page(GFP_KERNEL);
  39        else
  40                new_pgd = kzalloc(PGD_SIZE, GFP_KERNEL);
  41
  42        if (!new_pgd)
  43                return NULL;
  44
  45        return new_pgd;
  46}
  47
  48void pgd_free(struct mm_struct *mm, pgd_t *pgd)
  49{
  50        if (PGD_SIZE == PAGE_SIZE)
  51                free_page((unsigned long)pgd);
  52        else
  53                kfree(pgd);
  54}
  55