Skip to contentSkip to conversation

Two p2m bug fixes

PATCH Applied Andres Lagar-Cavilla 2 participants 4 messages Jan 13, 2012 – Jan 19, 2012

lore
Share & tools
lore
#1 lore raw

PATCH 1/1 x86/mm: Don't ASSERT() for a valid mfn on paged p2m entries in guest_physmap_add

 xen/arch/x86/mm/p2m.c |  4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)
xen/arch/x86/mm/p2m.c +2 -2
diff -r 4aa843efe1ac -r 1ab50ad829d6 xen/arch/x86/mm/p2m.c
@@ -489,7 +489,7 @@ guest_physmap_add_entry(struct domain *d
             
             return -EINVAL;
         }
-        else if ( p2m_is_ram(ot) )
+        else if ( p2m_is_ram(ot) && !p2m_is_paged(ot) )
         {
             ASSERT(mfn_valid(omfn));
             set_gpfn_from_mfn(mfn_x(omfn), INVALID_M2P_ENTRY);
@@ -514,7 +514,7 @@ guest_physmap_add_entry(struct domain *d
             P2M_DEBUG("aliased! mfn=%#lx, old gfn=%#lx, new gfn=%#lx\n",
                       mfn + i, ogfn, gfn + i);
             omfn = p2m->get_entry(p2m, ogfn, &ot, &a, p2m_query, NULL);
-            if ( p2m_is_ram(ot) )
+            if ( p2m_is_ram(ot) && !p2m_is_paged(ot) )
             {
                 ASSERT(mfn_valid(omfn));
                 P2M_DEBUG("old gfn=%#lx -> mfn %#lx\n",
#2 lore raw

PATCH 1/1 Correct p2m unlocking during grant table map

In reply to Andres Lagar-Cavilla
 xen/common/grant_table.c |  8 ++++++--
 1 files changed, 6 insertions(+), 2 deletions(-)

We were not putting gfn's consistently.

xen/common/grant_table.c +6 -2
diff -r 1ab50ad829d6 -r abdb908c0aed xen/common/grant_table.c
@@ -141,7 +141,7 @@ shared_entry_header(struct grant_table *
 #define active_entry(t, e) \
     ((t)->active[(e)/ACGNT_PER_PAGE][(e)%ACGNT_PER_PAGE])
 
-/* Check if the page has been paged out */
+/* Check if the page has been paged out. If rc == GNTST_okay, caller must do put_gfn(rd, gfn) */
 static int __get_paged_frame(unsigned long gfn, unsigned long *frame, int readonly, struct domain *rd)
 {
     int rc = GNTST_okay;
@@ -573,7 +573,10 @@ __gnttab_map_grant_ref(
             gfn = sha1 ? sha1->frame : sha2->full_page.frame;
             rc = __get_paged_frame(gfn, &frame, !!(op->flags & GNTMAP_readonly), rd);
             if ( rc != GNTST_okay )
+            {
+                gfn = INVALID_GFN;
                 goto unlock_out;
+            }
             act->gfn = gfn;
             act->domid = ld->domain_id;
             act->frame = frame;
@@ -700,7 +703,8 @@ __gnttab_map_grant_ref(
     op->handle       = handle;
     op->status       = GNTST_okay;
 
-    put_gfn(rd, gfn);
+    if ( gfn != INVALID_GFN )
+        put_gfn(rd, gfn);
     rcu_unlock_domain(rd);
     return;
Applied
#3 lore raw
In reply to Andres Lagar-Cavilla
Quoted 4 lines · Andres Lagar-Cavilla

- An assert for an invalid mfn was being triggered in guest_physmap_add_entry, even though the target gfn was paged out.

- Fix how gfn's are put when mapping grants.

Applied, thanks.

Tim.