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

[Xen-changelog] [xen master] xen/arm: p2m: Release the p2m lock before undoing the mappings



commit ed2cddb66b40cacdefd2e7920bde578d8da67fa9
Author:     Julien Grall <julien.grall@xxxxxxx>
AuthorDate: Fri May 20 14:37:42 2016 +0100
Commit:     Stefano Stabellini <sstabellini@xxxxxxxxxx>
CommitDate: Sat May 21 16:16:54 2016 +0100

    xen/arm: p2m: Release the p2m lock before undoing the mappings
    
    Since commit 4b25423a "arch/arm: unmap partially-mapped memory regions",
    Xen has been undoing the P2M mappings when an error occurred during
    insertion or memory allocation.
    
    This is done by calling recursively apply_p2m_changes, however the
    second call is done with the p2m lock taken which will result in a
    deadlock for the current processor.
    
    The p2m lock is here to protect 2 threads modifying concurrently the
    page tables. However, it does not guarantee the ordering of the
    changes. I.e if 2 threads request change on regions that overlaps,
    then the result is undefined.
    
    Therefore it is fine to move the recursive call to undo the changes
    after the lock is released.
    
    Signed-off-by: Julien Grall <julien.grall@xxxxxxx>
    Reviewed-by: Wei Chen <Wei.Chen@xxxxxxx>
    Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
    Tested-by: Wei Chen <Wei.Chen@xxxxxxx>
---
 xen/arch/arm/p2m.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c
index 68c67b0..838d004 100644
--- a/xen/arch/arm/p2m.c
+++ b/xen/arch/arm/p2m.c
@@ -1184,6 +1184,14 @@ out:
     while ( (pg = page_list_remove_head(&free_pages)) )
         free_domheap_page(pg);
 
+    for ( level = P2M_ROOT_LEVEL; level < 4; level ++ )
+    {
+        if ( mappings[level] )
+            unmap_domain_page(mappings[level]);
+    }
+
+    spin_unlock(&p2m->lock);
+
     if ( rc < 0 && ( op == INSERT || op == ALLOCATE ) &&
          addr != start_gpaddr )
     {
@@ -1196,14 +1204,6 @@ out:
                           mattr, 0, p2m_invalid, d->arch.p2m.default_access);
     }
 
-    for ( level = P2M_ROOT_LEVEL; level < 4; level ++ )
-    {
-        if ( mappings[level] )
-            unmap_domain_page(mappings[level]);
-    }
-
-    spin_unlock(&p2m->lock);
-
     return rc;
 }
 
--
generated by git-patchbot for /home/xen/git/xen.git#master

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
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®.