[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Xen-devel] [PATCH v3 2/5] arch, arm: add consistency checks to REMOVE p2m changes
 
- To: Arianna Avanzini <avanzini.arianna@xxxxxxxxx>,  xen-devel@xxxxxxxxxxxxx
 
- From: Julien Grall <julien.grall@xxxxxxxxxx>
 
- Date: Sat, 15 Mar 2014 22:19:36 +0000
 
- Cc: julien.grall@xxxxxxxxxx, paolo.valente@xxxxxxxxxx, keir@xxxxxxx,	stefano.stabellini@xxxxxxxxxxxxx, tim@xxxxxxx,	dario.faggioli@xxxxxxxxxx, Ian.Jackson@xxxxxxxxxxxxx,	Ian.Campbell@xxxxxxxxxxxxx, etrudeau@xxxxxxxxxxxx,	JBeulich@xxxxxxxx, viktor.kleinik@xxxxxxxxxxxxxxx
 
- Delivery-date: Sat, 15 Mar 2014 22:20:04 +0000
 
- List-id: Xen developer discussion <xen-devel.lists.xen.org>
 
 
 
Hello Arianna,
Thanks for the patch.
On 15/03/14 20:11, Arianna Avanzini wrote:
 
---
  xen/arch/arm/p2m.c | 33 +++++++++++++++++++++++++++++++--
  1 file changed, 31 insertions(+), 2 deletions(-)
diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c
index d00c882..47bf154 100644
--- a/xen/arcah/arm/p2m.c
+++ b/xen/arch/arm/p2m.c
@@ -243,7 +243,8 @@ static int apply_p2m_changes(struct domain *d,
      int rc;
      struct p2m_domain *p2m = &d->arch.p2m;
      lpae_t *first = NULL, *second = NULL, *third = NULL;
-    paddr_t addr;
+    p2m_type_t _t;
+    paddr_t addr, _maddr = INVALID_PADDR;
      unsigned long cur_first_page = ~0,
                    cur_first_offset = ~0,
                    cur_second_offset = ~0;
@@ -252,6 +253,20 @@ static int apply_p2m_changes(struct domain *d,
      bool_t populate = (op == INSERT || op == ALLOCATE);
      lpae_t pte;
+    /*
+     * As of now, the lookup is needed only in in case
+     * of REMOVE operation, as a consistency check on
+     * the existence of a mapping between the machine
+     * address and the start guest address given as
+     * parameters.
+     */
+    if (op == REMOVE)
+        /*
+         * Be sure to lookup before grabbing the p2m_lock,
+         * as the p2m_lookup() function holds it too.
+         */
+        _maddr = p2m_lookup(d, start_gpaddr, &_t);
+
 
 Did you try remove path? apply_p2m_changes is taking p2m->lock which is 
also taken by p2m_lookup. With this solution it will end up to a deadlock.
 Anyway, you don't need to use p2m_lookup because you already have all 
the data in pte (if pte.p2m.valid == 1):
   - pte.p2m.type  = p2m type
   - pte.p2m.base  = MFN
 
      spin_lock(&p2m->lock);
      if ( d != current->domain )
@@ -367,9 +382,23 @@ static int apply_p2m_changes(struct domain *d,
                      maddr += PAGE_SIZE;
                  }
                  break;
-            case RELINQUISH:
              case REMOVE:
                  {
+                    /*
+                     * Ensure that, if we are trying to unmap I/O memory
+                     * ranges, the given gfn is p2m_mmio_direct.
+                     */
 
 
+                    if ( t == p2m_mmio_direct ? _t != p2m_mmio_direct : 0 ||
+                         paddr_to_pfn(_maddr) == INVALID_MFN ||
 
 
Testing pte.p2m.valid instead of paddr_to(_maddr)... is right answer.
 Moreover, why do you need to check t? Every call to 
guest_physmap_remove_page is done with a valid mfn (I guess it can be 
enhanced by a BUG_ON(mfn != INVALID_MFN) in this function).
 
+                         maddr != _maddr )
 
 
 maddr is not incremented during where the page is removed. The next 
iteration will likely fail. You need to increment it in various place.
 
+                    {
+                        count++;
+                        break;
 
IHMO, skipping the page is totally wrong. You should return an error here.
Regards,
--
Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
 
 
    
     |