[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] This fixes a bug in changeset 22526:7a5ee3800417, where the wrong
# HG changeset patch # User Tim Deegan <Tim.Deegan@xxxxxxxxxx> # Date 1300268132 0 # Node ID 8074dff66e9791cef6be06dd9a24176a59f88c5e # Parent c426a7140c9923deefa9446f82fb96961f289616 This fixes a bug in changeset 22526:7a5ee3800417, where the wrong value is read when deciding whether to flush the VTd tables. The effect is minor: in situations where the p2m entry is changed but the mfn is the same, the VTd tables will be unnecessarily flushed. old_entry is left untouched in the second case, since having a present old_entry will cause the an unnecessary check to be taken at the end of the function. Spotted-by: Zhang, Peng Fei <zpfalpc23@xxxxxxxxx> Signed-off-by: George Dunlap <george.dunlap@xxxxxxxxxxxxx> Acked-by: Tim Deegan <Tim.Deegan@xxxxxxxxxx> --- diff -r c426a7140c99 -r 8074dff66e97 xen/arch/x86/mm/hap/p2m-ept.c --- a/xen/arch/x86/mm/hap/p2m-ept.c Tue Mar 15 18:20:46 2011 +0000 +++ b/xen/arch/x86/mm/hap/p2m-ept.c Wed Mar 16 09:35:32 2011 +0000 @@ -374,7 +374,9 @@ needs_sync = 0; /* If we're replacing a non-leaf entry with a leaf entry (1GiB or 2MiB), - * the intermediate tables will be freed below after the ept flush */ + * the intermediate tables will be freed below after the ept flush + * + * Read-then-write is OK because we hold the p2m lock. */ old_entry = *ept_entry; if ( mfn_valid(mfn_x(mfn)) || direct_mmio || p2m_is_paged(p2mt) || @@ -390,10 +392,10 @@ new_entry.access = p2ma; new_entry.rsvd2_snp = (iommu_enabled && iommu_snoop); - if ( new_entry.mfn == mfn_x(mfn) ) + new_entry.mfn = mfn_x(mfn); + + if ( old_entry.mfn == new_entry.mfn ) need_modify_vtd_table = 0; - else - new_entry.mfn = mfn_x(mfn); ept_p2m_type_to_flags(&new_entry, p2mt, p2ma); } @@ -438,10 +440,12 @@ new_entry.access = p2ma; new_entry.rsvd2_snp = (iommu_enabled && iommu_snoop); - if ( new_entry.mfn == mfn_x(mfn) ) + /* the caller should take care of the previous page */ + new_entry.mfn = mfn_x(mfn); + + /* Safe to read-then-write because we hold the p2m lock */ + if ( ept_entry->mfn == new_entry.mfn ) need_modify_vtd_table = 0; - else /* the caller should take care of the previous page */ - new_entry.mfn = mfn_x(mfn); ept_p2m_type_to_flags(&new_entry, p2mt, p2ma); _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |