2005-04-16 16:20:36 -06:00
|
|
|
/*
|
|
|
|
* arch/sh/mm/hugetlbpage.c
|
|
|
|
*
|
|
|
|
* SuperH HugeTLB page support.
|
|
|
|
*
|
|
|
|
* Cloned from sparc64 by Paul Mundt.
|
|
|
|
*
|
|
|
|
* Copyright (C) 2002, 2003 David S. Miller (davem@redhat.com)
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <linux/init.h>
|
|
|
|
#include <linux/fs.h>
|
|
|
|
#include <linux/mm.h>
|
|
|
|
#include <linux/hugetlb.h>
|
|
|
|
#include <linux/pagemap.h>
|
|
|
|
#include <linux/sysctl.h>
|
|
|
|
|
|
|
|
#include <asm/mman.h>
|
|
|
|
#include <asm/pgalloc.h>
|
|
|
|
#include <asm/tlb.h>
|
|
|
|
#include <asm/tlbflush.h>
|
|
|
|
#include <asm/cacheflush.h>
|
|
|
|
|
2008-07-23 22:27:41 -06:00
|
|
|
pte_t *huge_pte_alloc(struct mm_struct *mm,
|
|
|
|
unsigned long addr, unsigned long sz)
|
2005-04-16 16:20:36 -06:00
|
|
|
{
|
|
|
|
pgd_t *pgd;
|
2006-09-26 22:11:57 -06:00
|
|
|
pud_t *pud;
|
2005-04-16 16:20:36 -06:00
|
|
|
pmd_t *pmd;
|
|
|
|
pte_t *pte = NULL;
|
|
|
|
|
|
|
|
pgd = pgd_offset(mm, addr);
|
|
|
|
if (pgd) {
|
2006-09-26 22:11:57 -06:00
|
|
|
pud = pud_alloc(mm, pgd, addr);
|
|
|
|
if (pud) {
|
|
|
|
pmd = pmd_alloc(mm, pud, addr);
|
|
|
|
if (pmd)
|
2011-01-13 16:46:43 -07:00
|
|
|
pte = pte_alloc_map(mm, NULL, pmd, addr);
|
2006-09-26 22:11:57 -06:00
|
|
|
}
|
2005-04-16 16:20:36 -06:00
|
|
|
}
|
2006-09-26 22:11:57 -06:00
|
|
|
|
2005-04-16 16:20:36 -06:00
|
|
|
return pte;
|
|
|
|
}
|
|
|
|
|
2005-06-21 18:14:44 -06:00
|
|
|
pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
|
2005-04-16 16:20:36 -06:00
|
|
|
{
|
|
|
|
pgd_t *pgd;
|
2006-09-26 22:11:57 -06:00
|
|
|
pud_t *pud;
|
2005-04-16 16:20:36 -06:00
|
|
|
pmd_t *pmd;
|
|
|
|
pte_t *pte = NULL;
|
|
|
|
|
|
|
|
pgd = pgd_offset(mm, addr);
|
|
|
|
if (pgd) {
|
2006-09-26 22:11:57 -06:00
|
|
|
pud = pud_offset(pgd, addr);
|
|
|
|
if (pud) {
|
|
|
|
pmd = pmd_offset(pud, addr);
|
|
|
|
if (pmd)
|
|
|
|
pte = pte_offset_map(pmd, addr);
|
|
|
|
}
|
2005-06-21 18:14:44 -06:00
|
|
|
}
|
2005-04-16 16:20:36 -06:00
|
|
|
|
2006-09-26 22:11:57 -06:00
|
|
|
return pte;
|
2005-04-16 16:20:36 -06:00
|
|
|
}
|
|
|
|
|
2006-12-06 21:32:03 -07:00
|
|
|
int huge_pmd_unshare(struct mm_struct *mm, unsigned long *addr, pte_t *ptep)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2005-04-16 16:20:36 -06:00
|
|
|
struct page *follow_huge_addr(struct mm_struct *mm,
|
|
|
|
unsigned long address, int write)
|
|
|
|
{
|
|
|
|
return ERR_PTR(-EINVAL);
|
|
|
|
}
|
|
|
|
|
|
|
|
int pmd_huge(pmd_t pmd)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-07-23 22:27:50 -06:00
|
|
|
int pud_huge(pud_t pud)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2005-04-16 16:20:36 -06:00
|
|
|
struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address,
|
|
|
|
pmd_t *pmd, int write)
|
|
|
|
{
|
|
|
|
return NULL;
|
|
|
|
}
|