Skip to content

Commit

Permalink
ARM: make_coherent: split adjust_pte() in two
Browse files Browse the repository at this point in the history
adjust_pte() walks the page tables, and do_adjust_pte() does the
page table manipulation.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
  • Loading branch information
Russell King committed Jan 20, 2010
1 parent 24bc734 commit c26c20b
Showing 1 changed file with 32 additions and 20 deletions.
52 changes: 32 additions & 20 deletions arch/arm/mm/fault-armv.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,28 +36,12 @@ static unsigned long shared_pte_mask = L_PTE_MT_BUFFERABLE;
* Therefore those configurations which might call adjust_pte (those
* without CONFIG_CPU_CACHE_VIPT) cannot support split page_table_lock.
*/
static int adjust_pte(struct vm_area_struct *vma, unsigned long address)
static int do_adjust_pte(struct vm_area_struct *vma, unsigned long address,
pte_t *ptep)
{
pgd_t *pgd;
pmd_t *pmd;
pte_t *pte, entry;
pte_t entry = *ptep;
int ret;

pgd = pgd_offset(vma->vm_mm, address);
if (pgd_none(*pgd))
goto no_pgd;
if (pgd_bad(*pgd))
goto bad_pgd;

pmd = pmd_offset(pgd, address);
if (pmd_none(*pmd))
goto no_pmd;
if (pmd_bad(*pmd))
goto bad_pmd;

pte = pte_offset_map(pmd, address);
entry = *pte;

/*
* If this page is present, it's actually being shared.
*/
Expand All @@ -74,10 +58,38 @@ static int adjust_pte(struct vm_area_struct *vma, unsigned long address)
(pfn << PAGE_SHIFT) + PAGE_SIZE);
pte_val(entry) &= ~L_PTE_MT_MASK;
pte_val(entry) |= shared_pte_mask;
set_pte_at(vma->vm_mm, address, pte, entry);
set_pte_at(vma->vm_mm, address, ptep, entry);
flush_tlb_page(vma, address);
}

return ret;
}

static int adjust_pte(struct vm_area_struct *vma, unsigned long address)
{
pgd_t *pgd;
pmd_t *pmd;
pte_t *pte;
int ret;

pgd = pgd_offset(vma->vm_mm, address);
if (pgd_none(*pgd))
goto no_pgd;
if (pgd_bad(*pgd))
goto bad_pgd;

pmd = pmd_offset(pgd, address);
if (pmd_none(*pmd))
goto no_pmd;
if (pmd_bad(*pmd))
goto bad_pmd;

pte = pte_offset_map(pmd, address);

ret = do_adjust_pte(vma, address, pte);

pte_unmap(pte);

return ret;

bad_pgd:
Expand Down

0 comments on commit c26c20b

Please sign in to comment.