On Thu, 2008-06-26 at 10:55 +0100, Andy Whitcroft wrote:
> 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: Andy Whitcroft <[EMAIL PROTECTED]>

Acked-by: Benjamin Herrenschmidt <[EMAIL PROTECTED]>

Good catch btw !

Cheers,
Ben.


_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Reply via email to