lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Sun, 25 Mar 2007 23:37:08 -0700 (PDT) From: David Rientjes <rientjes@...gle.com> To: Andrew Morton <akpm@...ux-foundation.org> cc: Hugh Dickins <hugh@...itas.com>, Zachary Amsden <zach@...are.com>, linux-kernel@...r.kernel.org Subject: [patch -mm] i386: use pte_update_defer in ptep_test_and_clear_{dirty,young} Date: Sun, 25 Mar 2007 23:07:43 -0800 From: Zachary Amsden <zach@...are.com> If you actually clear the bit, you need to: + pte_update_defer(vma->vm_mm, addr, ptep); The reason is, when updating PTEs, the hypervisor must be notified. Using atomic operations to do this is fine for all hypervisors I am aware of. However, for hypervisors which shadow page tables, if these PTE modifications are not trapped, you need a post-modification call to fulfill the update of the shadow page table. Cc: Zachary Amsden <zach@...are.com> Cc: Hugh Dickins <hugh@...itas.com> Signed-off-by: David Rientjes <rientjes@...gle.com> --- include/asm-i386/pgtable.h | 26 ++++++++++++++------------ 1 files changed, 14 insertions(+), 12 deletions(-) diff --git a/include/asm-i386/pgtable.h b/include/asm-i386/pgtable.h --- a/include/asm-i386/pgtable.h +++ b/include/asm-i386/pgtable.h @@ -287,18 +287,24 @@ do { \ static inline int ptep_test_and_clear_dirty(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep) { - if (!pte_dirty(*ptep)) - return 0; - return test_and_clear_bit(_PAGE_BIT_DIRTY, &ptep->pte_low); + int ret = 0; + if (pte_dirty(*ptep)) + ret = test_and_clear_bit(_PAGE_BIT_DIRTY, &ptep->pte_low); + if (ret) + pte_update_defer(vma->vm_mm, addr, ptep); + return ret; } #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep) { - if (!pte_young(*ptep)) - return 0; - return test_and_clear_bit(_PAGE_BIT_ACCESSED, &ptep->pte_low); + int ret = 0; + if (pte_young(*ptep)) + ret = test_and_clear_bit(_PAGE_BIT_ACCESSED, &ptep->pte_low); + if (ret) + pte_update_defer(vma->vm_mm, addr, ptep); + return ret; } /* @@ -317,10 +323,8 @@ do { \ ({ \ int __dirty; \ __dirty = ptep_test_and_clear_dirty((vma), (address), (ptep)); \ - if (__dirty) { \ - pte_update_defer((vma)->vm_mm, (address), (ptep)); \ + if (__dirty) \ flush_tlb_page(vma, address); \ - } \ __dirty; \ }) @@ -329,10 +333,8 @@ do { \ ({ \ int __young; \ __young = ptep_test_and_clear_young((vma), (address), (ptep)); \ - if (__young) { \ - pte_update_defer((vma)->vm_mm, (address), (ptep)); \ + if (__young) \ flush_tlb_page(vma, address); \ - } \ __young; \ }) - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists