• Helge Deller's avatar
    parisc: Optimize per-pagetable spinlocks · b7795074
    Helge Deller authored
    On parisc a spinlock is stored in the next page behind the pgd which
    protects against parallel accesses to the pgd. That's why one additional
    page (PGD_ALLOC_ORDER) is allocated for the pgd.
    
    Matthew Wilcox suggested that we instead should use a pointer in the
    struct page table for this spinlock and noted, that the comments for the
    PGD_ORDER and PMD_ORDER defines were wrong.
    
    Both suggestions are addressed with this patch. Instead of having an own
    spinlock to protect the pgd, we now switch to use the existing
    page_table_lock.  Additionally, beside loading the pgd into cr25 in
    switch_mm_irqs_off(), the physical address of this lock is loaded into
    cr28 (tr4), so that we can avoid implementing a complicated lookup in
    assembly for this lock in the TLB fault handlers.
    
    The existing Hybrid L2/L3 page table scheme (where the pmd is adjacent
    to the pgd) has been dropped with this patch.
    
    Remove the locking in set_pte() and the huge-page pte functions too.
    They trigger a spinlock recursion on 32bit machines and seem unnecessary.
    Suggested-by: default avatarMatthew Wilcox <willy@infradead.org>
    Fixes: b37d1c18 ("parisc: Use per-pagetable spinlock")
    Signed-off-by: default avatarJohn David Anglin <dave.anglin@bell.net>
    Signed-off-by: default avatarHelge Deller <deller@gmx.de>
    b7795074
page.h 5.39 KB