|
|
|
|
|
|
|
|
|
|
xen-changelog
[Xen-changelog] [xen-unstable] This fixes a bug in changeset 22526:7a5ee
# 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
|
<Prev in Thread] |
Current Thread |
[Next in Thread> |
- [Xen-changelog] [xen-unstable] This fixes a bug in changeset 22526:7a5ee3800417, where the wrong,
Xen patchbot-unstable <=
|
|
|
|
|