[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] [IA64] Resolve a race in tlb_track_search_and_remove()



# HG changeset patch
# User awilliam@xxxxxxxxxxxx
# Date 1168628618 25200
# Node ID 8835443fa3b37b5dde5e71a0e7ca49b9237b9cda
# Parent  9cbb1d6fb34ab5b831c78a3b3c8e0382739a624d
[IA64] Resolve a race in tlb_track_search_and_remove()

When tlb_track_search_and_remove() is about to remove a found entry,
another cpu might update p2m entry and insert the entry right before that.
It must be aware of it.

Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
---
 xen/arch/ia64/xen/tlb_track.c |   25 +++++++++++++++++++++++++
 1 files changed, 25 insertions(+)

diff -r 9cbb1d6fb34a -r 8835443fa3b3 xen/arch/ia64/xen/tlb_track.c
--- a/xen/arch/ia64/xen/tlb_track.c     Thu Jan 11 17:03:25 2007 -0700
+++ b/xen/arch/ia64/xen/tlb_track.c     Fri Jan 12 12:03:38 2007 -0700
@@ -454,6 +454,31 @@ tlb_track_search_and_remove(struct tlb_t
             continue;
 
         if (pte_pfn(entry->pte_val) == mfn) {
+            /*
+             * PARANOIA
+             * We're here after zapping p2m entry.  However another pCPU
+             * may update the same p2m entry entry the same mfn at the
+             * same time in theory.  In such a case, we can't determine
+             * whether this entry is for us or for the racy p2m update.
+             * Such a guest domain's racy behaviour doesn't make sense,
+             * but is allowed.  Go the very pessimistic way.  Leave this
+             * entry to be found later and do full flush at this time.
+             *
+             * NOTE: Updating tlb tracking hash is protected by spin lock and
+             *       setting _PAGE_TLB_INSERTED and_PAGE_TLB_INSERTED_MANY bits
+             *       is serialized by the same spin lock.
+             *       See tlb_track_insert_or_dirty().
+             */
+            pte_t current_pte = *ptep;
+            if (unlikely(pte_pfn(current_pte) == mfn &&
+                         pte_tlb_tracking(current_pte) &&
+                         pte_tlb_inserted(current_pte))) {
+                BUG_ON(pte_tlb_inserted_many(current_pte));
+                spin_unlock(&tlb_track->hash_lock);
+                perfc_incrc(tlb_track_sar_many);
+                return TLB_TRACK_MANY;
+            }
+
             list_del(&entry->list);
             spin_unlock(&tlb_track->hash_lock);
             *entryp = entry;

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.