git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
vserver 2.0-rc4
[linux-2.6.git]
/
arch
/
sparc64
/
mm
/
hugetlbpage.c
diff --git
a/arch/sparc64/mm/hugetlbpage.c
b/arch/sparc64/mm/hugetlbpage.c
index
1df587b
..
c43156a
100644
(file)
--- a/
arch/sparc64/mm/hugetlbpage.c
+++ b/
arch/sparc64/mm/hugetlbpage.c
@@
-24,14
+24,18
@@
static pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr)
{
pgd_t *pgd;
static pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr)
{
pgd_t *pgd;
+ pud_t *pud;
pmd_t *pmd;
pte_t *pte = NULL;
pgd = pgd_offset(mm, addr);
if (pgd) {
pmd_t *pmd;
pte_t *pte = NULL;
pgd = pgd_offset(mm, addr);
if (pgd) {
- pmd = pmd_alloc(mm, pgd, addr);
- if (pmd)
- pte = pte_alloc_map(mm, pmd, addr);
+ pud = pud_offset(pgd, addr);
+ if (pud) {
+ pmd = pmd_alloc(mm, pud, addr);
+ if (pmd)
+ pte = pte_alloc_map(mm, pmd, addr);
+ }
}
return pte;
}
}
return pte;
}
@@
-39,14
+43,18
@@
static pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr)
static pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
{
pgd_t *pgd;
static pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
{
pgd_t *pgd;
+ pud_t *pud;
pmd_t *pmd;
pte_t *pte = NULL;
pgd = pgd_offset(mm, addr);
if (pgd) {
pmd_t *pmd;
pte_t *pte = NULL;
pgd = pgd_offset(mm, addr);
if (pgd) {
- pmd = pmd_offset(pgd, addr);
- if (pmd)
- pte = pte_offset_map(pmd, addr);
+ pud = pud_offset(pgd, addr);
+ if (pud) {
+ pmd = pmd_offset(pud, addr);
+ if (pmd)
+ pte = pte_offset_map(pmd, addr);
+ }
}
return pte;
}
}
return pte;
}
@@
-59,7
+67,7
@@
static void set_huge_pte(struct mm_struct *mm, struct vm_area_struct *vma,
unsigned long i;
pte_t entry;
unsigned long i;
pte_t entry;
-
mm->rss += (
HPAGE_SIZE / PAGE_SIZE);
+
vx_rsspages_add(mm,
HPAGE_SIZE / PAGE_SIZE);
if (write_access)
entry = pte_mkwrite(pte_mkdirty(mk_pte(page,
if (write_access)
entry = pte_mkwrite(pte_mkdirty(mk_pte(page,
@@
-112,7
+120,7
@@
int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src,
pte_val(entry) += PAGE_SIZE;
dst_pte++;
}
pte_val(entry) += PAGE_SIZE;
dst_pte++;
}
-
dst->rss += (
HPAGE_SIZE / PAGE_SIZE);
+
vx_rsspages_add(dst,
HPAGE_SIZE / PAGE_SIZE);
addr += HPAGE_SIZE;
}
return 0;
addr += HPAGE_SIZE;
}
return 0;
@@
-203,7
+211,7
@@
void unmap_hugepage_range(struct vm_area_struct *vma,
pte++;
}
}
pte++;
}
}
-
mm->rss -= (end - start) >> PAGE_SHIFT
;
+
vx_rsspages_sub(mm, (end - start) >> PAGE_SHIFT)
;
flush_tlb_range(vma, start, end);
}
flush_tlb_range(vma, start, end);
}
@@
-245,8
+253,9
@@
int hugetlb_prefault(struct address_space *mapping, struct vm_area_struct *vma)
goto out;
}
ret = add_to_page_cache(page, mapping, idx, GFP_ATOMIC);
goto out;
}
ret = add_to_page_cache(page, mapping, idx, GFP_ATOMIC);
- unlock_page(page);
- if (ret) {
+ if (! ret) {
+ unlock_page(page);
+ } else {
hugetlb_put_quota(mapping);
free_huge_page(page);
goto out;
hugetlb_put_quota(mapping);
free_huge_page(page);
goto out;