1. 07 1月, 2009 1 次提交
  2. 04 8月, 2008 1 次提交
  3. 25 7月, 2008 3 次提交
  4. 09 7月, 2008 1 次提交
    • D
      Correct hash flushing from huge_ptep_set_wrprotect() · 86df8642
      David Gibson 提交于
      As Andy Whitcroft recently pointed out, the current powerpc version of
      huge_ptep_set_wrprotect() has a bug.  It just calls ptep_set_wrprotect()
      which in turn calls pte_update() then hpte_need_flush() with the 'huge'
      argument set to 0.  This will cause hpte_need_flush() to flush the wrong
      hash entries (of any).  Andy's fix for this is already in the powerpc
      tree as commit 016b33c4.
      
      I have confirmed this is a real bug, not masked by some other
      synchronization, with a new testcase for libhugetlbfs.  A process write
      a (MAP_PRIVATE) hugepage mapping, fork(), then alter the mapping and
      have the child incorrectly see the second write.
      
      Therefore, this should be fixed for 2.6.26, and for the stable tree.
      Here is a suitable patch for 2.6.26, which I think will also be suitable
      for the stable tree (neither of the headers in question has been changed
      much recently).
      
      It is cut down slighlty from Andy's original version, in that it does
      not include a 32-bit version of huge_ptep_set_wrprotect().  Currently,
      hugepages are not supported on any 32-bit powerpc platform.  When they
      are, a suitable 32-bit version can be added - the only 32-bit hardware
      which supports hugepages does not use the conventional hashtable MMU and
      so will have different needs anyway.
      Signed-off-by: NAndy Whitcroft <apw@shadowen.org>
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NBenjamin Herrenschmidt <benh@kernel.crashing.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      86df8642
  5. 01 7月, 2008 1 次提交
    • A
      powerpc: Add 64 bit version of huge_ptep_set_wrprotect · 016b33c4
      Andy Whitcroft 提交于
      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: NAndy Whitcroft <apw@shadowen.org>
      Acked-by: NBenjamin Herrenschmidt <benh@kernel.crashing.org>
      Signed-off-by: NPaul Mackerras <paulus@samba.org>
      016b33c4
  6. 28 4月, 2008 3 次提交