mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-26 22:24:09 +08:00
ARM: make_coherent: split adjust_pte() in two
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>
This commit is contained in:
parent
24bc7347da
commit
c26c20b823
@ -36,28 +36,12 @@ static unsigned long shared_pte_mask = L_PTE_MT_BUFFERABLE;
|
|||||||
* Therefore those configurations which might call adjust_pte (those
|
* Therefore those configurations which might call adjust_pte (those
|
||||||
* without CONFIG_CPU_CACHE_VIPT) cannot support split page_table_lock.
|
* 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;
|
pte_t entry = *ptep;
|
||||||
pmd_t *pmd;
|
|
||||||
pte_t *pte, entry;
|
|
||||||
int ret;
|
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.
|
* If this page is present, it's actually being shared.
|
||||||
*/
|
*/
|
||||||
@ -74,10 +58,38 @@ static int adjust_pte(struct vm_area_struct *vma, unsigned long address)
|
|||||||
(pfn << PAGE_SHIFT) + PAGE_SIZE);
|
(pfn << PAGE_SHIFT) + PAGE_SIZE);
|
||||||
pte_val(entry) &= ~L_PTE_MT_MASK;
|
pte_val(entry) &= ~L_PTE_MT_MASK;
|
||||||
pte_val(entry) |= shared_pte_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);
|
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);
|
pte_unmap(pte);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
bad_pgd:
|
bad_pgd:
|
||||||
|
Loading…
Reference in New Issue
Block a user