On Sat, 2019-04-27 at 14:15 -0400, John David Anglin wrote: > 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@xxxxxxxx> > --- > > diff --git a/arch/parisc/mm/hugetlbpage.c > b/arch/parisc/mm/hugetlbpage.c > index d77479ae3af2..d578809e55cf 100644 > --- a/arch/parisc/mm/hugetlbpage.c > +++ b/arch/parisc/mm/hugetlbpage.c > @@ -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); You can't do stuff like this on the problem systems: we can only have one outstanding purge at once on the inter-cpu bus. For them, therefore, we also need a global spinlock. Pulling the tlb purge lock down to the lowest level, so inside purge_tlb_entries() might address a lot of the performance issues while keeping the purges correct on merced class. James