• Andy Whitcroft's avatar
    powerpc: Add 64 bit version of huge_ptep_set_wrprotect · 016b33c4
    Andy Whitcroft authored
    The implementation of huge_ptep_set_wrprotect() directly calls
    ptep_set_wrprotect() to mark a hugepte write protected.  However this
    call is not appropriate on ppc64 kernels as this is a small page only
    implementation.  This can lead to the hash not being flushed correctly
    when a mapping is being converted to COW, allowing processes to continue
    using the original copy.
    
    Currently huge_ptep_set_wrprotect() unconditionally calls
    ptep_set_wrprotect().  This is fine on ppc32 kernels as this call is
    generic.  On 64 bit this is implemented as:
    
    	pte_update(mm, addr, ptep, _PAGE_RW, 0);
    
    On ppc64 this last parameter is the page size and is passed directly on
    to hpte_need_flush():
    
    	hpte_need_flush(mm, addr, ptep, old, huge);
    
    And this directly affects the page size we pass to flush_hash_page():
    
    	flush_hash_page(vaddr, rpte, psize, ssize, 0);
    
    As this changes the way the hash is calculated we will flush the wrong
    pages, potentially leaving live hashes to the original page.
    
    Move the definition of huge_ptep_set_wrprotect() to the 32/64 bit specific
    headers.
    Signed-off-by: default avatarAndy Whitcroft <apw@shadowen.org>
    Acked-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
    Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
    016b33c4
pgtable-ppc32.h 27.1 KB