[PATCH 3/4] Hugetlb: Reorganize hugetlb_fault to prepare for COW

From: Adam Litke (agl_at_us.ibm.com)
Date: 11/10/05

  • Next message: Adam Litke: "[PATCH 2/4] Hugetlb: Rename find_lock_page to find_or_alloc_huge_page"
    To: akpm@osdl.org
    Date:	Wed, 09 Nov 2005 17:38:47 -0600
    
    

    Hugetlb: Reorganize hugetlb_fault to prepare for COW

    This patch splits the "no_page()" type activity into its own function,
    hugetlb_no_page(). hugetlb_fault() becomes the entry point for hugetlb faults
    and delegates to the appropriate handler depending on the type of fault. Right
    now we still have only hugetlb_no_page() but a later patch introduces a COW
    fault.

    Original post by David Gibson <david@gibson.dropbear.id.au>

    Version 2: Wed 9 Nov 2005
            Broken out into a separate patch

    Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
    Signed-off-by: Adam Litke <agl@us.ibm.com>

    ---
     hugetlb.c |   34 +++++++++++++++++++++++++---------
     1 files changed, 25 insertions(+), 9 deletions(-)
    diff -upN reference/mm/hugetlb.c current/mm/hugetlb.c
    --- reference/mm/hugetlb.c
    +++ current/mm/hugetlb.c
    @@ -370,20 +370,15 @@ out:
     	return page;
     }
     
    -int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,
    -			unsigned long address, int write_access)
    +int hugetlb_no_page(struct mm_struct *mm, struct vm_area_struct *vma,
    +			unsigned long address, pte_t *ptep)
     {
     	int ret = VM_FAULT_SIGBUS;
     	unsigned long idx;
     	unsigned long size;
    -	pte_t *pte;
     	struct page *page;
     	struct address_space *mapping;
     
    -	pte = huge_pte_alloc(mm, address);
    -	if (!pte)
    -		goto out;
    -
     	mapping = vma->vm_file->f_mapping;
     	idx = ((address - vma->vm_start) >> HPAGE_SHIFT)
     		+ (vma->vm_pgoff >> (HPAGE_SHIFT - PAGE_SHIFT));
    @@ -402,11 +397,11 @@ int hugetlb_fault(struct mm_struct *mm, 
     		goto backout;
     
     	ret = VM_FAULT_MINOR;
    -	if (!pte_none(*pte))
    +	if (!pte_none(*ptep))
     		goto backout;
     
     	add_mm_counter(mm, file_rss, HPAGE_SIZE / PAGE_SIZE);
    -	set_huge_pte_at(mm, address, pte, make_huge_pte(vma, page));
    +	set_huge_pte_at(mm, address, ptep, make_huge_pte(vma, page));
     	spin_unlock(&mm->page_table_lock);
     	unlock_page(page);
     out:
    @@ -420,6 +415,27 @@ backout:
     	goto out;
     }
     
    +int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,
    +			unsigned long address, int write_access)
    +{
    +	pte_t *ptep;
    +	pte_t entry;
    +
    +	ptep = huge_pte_alloc(mm, address);
    +	if (!ptep)
    +		return VM_FAULT_OOM;
    +
    +	entry = *ptep;
    +	if (pte_none(entry))
    +		return hugetlb_no_page(mm, vma, address, ptep);
    +
    +	/*
    +	 * We could get here if another thread instantiated the pte
    +	 * before the test above.
    +	 */
    +	return VM_FAULT_MINOR;
    +}
    +
     int follow_hugetlb_page(struct mm_struct *mm, struct vm_area_struct *vma,
     			struct page **pages, struct vm_area_struct **vmas,
     			unsigned long *position, int *length, int i)
    -- 
    Adam Litke - (agl at us.ibm.com)
    IBM Linux Technology Center
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at  http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at  http://www.tux.org/lkml/
    

  • Next message: Adam Litke: "[PATCH 2/4] Hugetlb: Rename find_lock_page to find_or_alloc_huge_page"

    Relevant Pages

    • mlock & COW
      ... I've been battling with a bug related to mlock and COW pages. ... User programs will crash if COW pages become ... I'm not sure if causing a fault on vm_map_protectis a good thing to do. ... routines might be a better place to put the fix. ...
      (freebsd-hackers)
    • Re: [PATCH] Dont needlessly dirty mlocked pages when initially faulting them in.
      ... by telling get_user_pagesto simulate a write fault. ... A simple way to test this is to mlock a multi-GB file, ... Those won't have COW to break and are the onces that do ... writeback and are thus save to touch with write=1. ...
      (Linux-Kernel)
    • Re: BBC FM networks borked
      ... ::: fault. ... :: Isn't auntie getting to be a really deceitful old cow ...
      (uk.tech.broadcast)