Skip to content

Commit

Permalink
parisc: Update huge TLB page support to use per-pagetable spinlock
Browse files Browse the repository at this point in the history
This patch updates the parisc huge TLB page support to use per-pagetable spinlocks.

This patch requires Mikulas' per-pagetable spinlock patch and the revised TLB
serialization patch from Helge and myself.  With Mikulas' patch, we need to use
the per-pagetable spinlock for page table updates.  The TLB lock is only used
to serialize TLB flushes on machines with the Merced bus.

Signed-off-by: John David Anglin <dave.anglin@bell.net>
Signed-off-by: Helge Deller <deller@gmx.de>
  • Loading branch information
John David Anglin authored and Helge Deller committed May 3, 2019
1 parent b37d1c1 commit 11c03dc
Showing 1 changed file with 10 additions and 9 deletions.
19 changes: 10 additions & 9 deletions arch/parisc/mm/hugetlbpage.c
Original file line number Diff line number Diff line change
Expand Up @@ -139,9 +139,9 @@ void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
{
unsigned long flags;

purge_tlb_start(flags);
spin_lock_irqsave(pgd_spinlock((mm)->pgd), flags);
__set_huge_pte_at(mm, addr, ptep, entry);
purge_tlb_end(flags);
spin_unlock_irqrestore(pgd_spinlock((mm)->pgd), flags);
}


Expand All @@ -151,10 +151,10 @@ pte_t huge_ptep_get_and_clear(struct mm_struct *mm, unsigned long addr,
unsigned long flags;
pte_t entry;

purge_tlb_start(flags);
spin_lock_irqsave(pgd_spinlock((mm)->pgd), flags);
entry = *ptep;
__set_huge_pte_at(mm, addr, ptep, __pte(0));
purge_tlb_end(flags);
spin_unlock_irqrestore(pgd_spinlock((mm)->pgd), flags);

return entry;
}
Expand All @@ -166,10 +166,10 @@ void huge_ptep_set_wrprotect(struct mm_struct *mm,
unsigned long flags;
pte_t old_pte;

purge_tlb_start(flags);
spin_lock_irqsave(pgd_spinlock((mm)->pgd), flags);
old_pte = *ptep;
__set_huge_pte_at(mm, addr, ptep, pte_wrprotect(old_pte));
purge_tlb_end(flags);
spin_unlock_irqrestore(pgd_spinlock((mm)->pgd), flags);
}

int huge_ptep_set_access_flags(struct vm_area_struct *vma,
Expand All @@ -178,13 +178,14 @@ int huge_ptep_set_access_flags(struct vm_area_struct *vma,
{
unsigned long flags;
int changed;
struct mm_struct *mm = vma->vm_mm;

purge_tlb_start(flags);
spin_lock_irqsave(pgd_spinlock((mm)->pgd), flags);
changed = !pte_same(*ptep, pte);
if (changed) {
__set_huge_pte_at(vma->vm_mm, addr, ptep, pte);
__set_huge_pte_at(mm, addr, ptep, pte);
}
purge_tlb_end(flags);
spin_unlock_irqrestore(pgd_spinlock((mm)->pgd), flags);
return changed;
}

Expand Down

0 comments on commit 11c03dc

Please sign in to comment.