• Arnd Bergmann's avatar
    [POWERPC] spufs: invalidate SLB translation before adding a new entry · cc4b7c18
    Arnd Bergmann authored
    When we replace an SLB entry in the MFC after using up all the available
    entries, there is a short window in which an incorrect entry is marked
    as valid.
    
    The problem is that the 'valid' bit is stored in the ESID, which is
    always written after the VSID. Overwriting the VSID first will make the
    original ESID entry point to the new VSID, which means that any
    concurrent DMA accessing the old ESID ends up being redirected to the
    new virtual address.  A few cycles later, we write the new ESID and
    everything is fine again.
    
    That race can be closed by writing a zero entry to the ESID first, which
    makes sure that the VSID is not accessed until we write the new ESID.
    
    Note that we don't actually need to invalidate the SLB entry using the
    invalidation register, which would also flush any ERAT entries for that
    segment, because the segment translation does not become invalid but is
    only removed from the SLB cache.
    Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
    Signed-off-by: default avatarJeremy Kerr <jk@ozlabs.org>
    cc4b7c18
spu_base.c 18.3 KB