• Paul Mackerras's avatar
    [POWERPC] Clear sub-page HPTE present bits when demoting page size · 65ba6cdc
    Paul Mackerras authored
    When we demote a slice from 64k to 4k, and we are about to insert an
    HPTE for a 4k subpage and we notice that there is an existing 64k
    HPTE, we first invalidate that HPTE before inserting the new 4k
    subpage HPTE.  Since the bits that encode which hash bucket the old
    HPTE was in overlap with the bits that encode which of the 16 subpages
    have HPTEs, we need to clear out the subpage HPTE-present bits before
    starting to insert HPTEs for the 4k subpages.  If we don't do that, we
    can erroneously think that a subpage already has an HPTE when it
    doesn't.
    
    That in itself wouldn't be such a problem except that when we go to
    update the HPTE that we think is present on machines with a
    hypervisor, the hypervisor can tell us that the HPTE we think is there
    is actually there even though it isn't, which can lead to a process
    getting stuck in a loop, continually faulting.  The reason for the
    confusion is that the AVPN (abbreviated virtual page number) we are
    looking for in the HPTE for a 4k subpage can actually match the AVPN
    in a stale HPTE for another 64k page.  For example, the HPTE for
    the 4k subpage at 0x84000f000 will be in the same hash bucket and have
    the same AVPN as the HPTE for the 64k page at 0x8400f0000.
    
    This fixes the code to clear out the subpage HPTE-present bits.
    Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
    65ba6cdc
hash_low_64.S 25.3 KB