|
@@ -394,71 +394,6 @@ static int vma_has_reserves(struct vm_area_struct *vma)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static void clear_gigantic_page(struct page *page,
|
|
|
- unsigned long addr, unsigned long sz)
|
|
|
-{
|
|
|
- int i;
|
|
|
- struct page *p = page;
|
|
|
-
|
|
|
- might_sleep();
|
|
|
- for (i = 0; i < sz/PAGE_SIZE; i++, p = mem_map_next(p, page, i)) {
|
|
|
- cond_resched();
|
|
|
- clear_user_highpage(p, addr + i * PAGE_SIZE);
|
|
|
- }
|
|
|
-}
|
|
|
-static void clear_huge_page(struct page *page,
|
|
|
- unsigned long addr, unsigned long sz)
|
|
|
-{
|
|
|
- int i;
|
|
|
-
|
|
|
- if (unlikely(sz/PAGE_SIZE > MAX_ORDER_NR_PAGES)) {
|
|
|
- clear_gigantic_page(page, addr, sz);
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- might_sleep();
|
|
|
- for (i = 0; i < sz/PAGE_SIZE; i++) {
|
|
|
- cond_resched();
|
|
|
- clear_user_highpage(page + i, addr + i * PAGE_SIZE);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-static void copy_user_gigantic_page(struct page *dst, struct page *src,
|
|
|
- unsigned long addr, struct vm_area_struct *vma)
|
|
|
-{
|
|
|
- int i;
|
|
|
- struct hstate *h = hstate_vma(vma);
|
|
|
- struct page *dst_base = dst;
|
|
|
- struct page *src_base = src;
|
|
|
-
|
|
|
- for (i = 0; i < pages_per_huge_page(h); ) {
|
|
|
- cond_resched();
|
|
|
- copy_user_highpage(dst, src, addr + i*PAGE_SIZE, vma);
|
|
|
-
|
|
|
- i++;
|
|
|
- dst = mem_map_next(dst, dst_base, i);
|
|
|
- src = mem_map_next(src, src_base, i);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-static void copy_user_huge_page(struct page *dst, struct page *src,
|
|
|
- unsigned long addr, struct vm_area_struct *vma)
|
|
|
-{
|
|
|
- int i;
|
|
|
- struct hstate *h = hstate_vma(vma);
|
|
|
-
|
|
|
- if (unlikely(pages_per_huge_page(h) > MAX_ORDER_NR_PAGES)) {
|
|
|
- copy_user_gigantic_page(dst, src, addr, vma);
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- might_sleep();
|
|
|
- for (i = 0; i < pages_per_huge_page(h); i++) {
|
|
|
- cond_resched();
|
|
|
- copy_user_highpage(dst + i, src + i, addr + i*PAGE_SIZE, vma);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
static void copy_gigantic_page(struct page *dst, struct page *src)
|
|
|
{
|
|
|
int i;
|
|
@@ -2454,7 +2389,8 @@ retry_avoidcopy:
|
|
|
return VM_FAULT_OOM;
|
|
|
}
|
|
|
|
|
|
- copy_user_huge_page(new_page, old_page, address, vma);
|
|
|
+ copy_user_huge_page(new_page, old_page, address, vma,
|
|
|
+ pages_per_huge_page(h));
|
|
|
__SetPageUptodate(new_page);
|
|
|
|
|
|
/*
|
|
@@ -2558,7 +2494,7 @@ retry:
|
|
|
ret = -PTR_ERR(page);
|
|
|
goto out;
|
|
|
}
|
|
|
- clear_huge_page(page, address, huge_page_size(h));
|
|
|
+ clear_huge_page(page, address, pages_per_huge_page(h));
|
|
|
__SetPageUptodate(page);
|
|
|
|
|
|
if (vma->vm_flags & VM_MAYSHARE) {
|