Skip to content
  • Mike Kravetz's avatar
    sparc64: mm: fix copy_tsb to correctly copy huge page TSBs · 8d665e03
    Mike Kravetz authored
    
    [ Upstream commit 654f4807
    
     ]
    
    When a TSB grows beyond its current capacity, a new TSB is allocated
    and copy_tsb is called to copy entries from the old TSB to the new.
    A hash shift based on page size is used to calculate the index of an
    entry in the TSB.  copy_tsb has hard coded PAGE_SHIFT in these
    calculations.  However, for huge page TSBs the value REAL_HPAGE_SHIFT
    should be used.  As a result, when copy_tsb is called for a huge page
    TSB the entries are placed at the incorrect index in the newly
    allocated TSB.  When doing hardware table walk, the MMU does not
    match these entries and we end up in the TSB miss handling code.
    This code will then create and write an entry to the correct index
    in the TSB.  We take a performance hit for the table walk miss and
    recreation of these entries.
    
    Pass a new parameter to copy_tsb that is the page size shift to be
    used when copying the TSB.
    
    Suggested-by: default avatarAnthony Yznaga <anthony.yznaga@oracle.com>
    Signed-off-by: default avatarMike Kravetz <mike.kravetz@oracle.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    8d665e03