All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] xen/arm: p2m: Don't create new table when the mapping is removed
@ 2013-12-18 17:31 Julien Grall
  2013-12-18 19:28 ` Stefano Stabellini
  2013-12-19  9:38 ` Ian Campbell
  0 siblings, 2 replies; 6+ messages in thread
From: Julien Grall @ 2013-12-18 17:31 UTC (permalink / raw)
  To: xen-devel
  Cc: ian.campbell, patches, Julien Grall, tim, george.dunlap,
	stefano.stabellini

When  Xen is removing/relinquishing mapping, it will create second/third tables
if they don't exist.

Non-existent table means the address range was never mapped, so Xen can safely
skip them.

Signed-off-by: Julien Grall <julien.grall@linaro.org>

---
    Release: This is an improvement for Xen 4.4. It will save time during
    relinquish phase and avoid dummy allocation.
    The downside is the patch is modifying p2m loop which is used everywhere.
---
 xen/arch/arm/p2m.c |   22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c
index d24a6fc..9ef8819 100644
--- a/xen/arch/arm/p2m.c
+++ b/xen/arch/arm/p2m.c
@@ -246,10 +246,12 @@ static int create_p2m_entries(struct domain *d,
                   cur_first_offset = ~0,
                   cur_second_offset = ~0;
     unsigned long count = 0;
+    bool_t populate = (op == INSERT || op == ALLOCATE);
 
     spin_lock(&p2m->lock);
 
-    for(addr = start_gpaddr; addr < end_gpaddr; addr += PAGE_SIZE)
+    addr = start_gpaddr;
+    while ( addr < end_gpaddr )
     {
         if ( cur_first_page != p2m_first_level_index(addr) )
         {
@@ -265,8 +267,15 @@ static int create_p2m_entries(struct domain *d,
 
         if ( !first[first_table_offset(addr)].p2m.valid )
         {
+            if ( !populate )
+            {
+                addr += FIRST_SIZE;
+                continue;
+            }
+
             rc = p2m_create_table(d, &first[first_table_offset(addr)]);
-            if ( rc < 0 ) {
+            if ( rc < 0 )
+            {
                 printk("p2m_populate_ram: L1 failed\n");
                 goto out;
             }
@@ -284,6 +293,12 @@ static int create_p2m_entries(struct domain *d,
 
         if ( !second[second_table_offset(addr)].p2m.valid )
         {
+            if ( !populate )
+            {
+                addr += SECOND_SIZE;
+                continue;
+            }
+
             rc = p2m_create_table(d, &second[second_table_offset(addr)]);
             if ( rc < 0 ) {
                 printk("p2m_populate_ram: L2 failed\n");
@@ -372,6 +387,9 @@ static int create_p2m_entries(struct domain *d,
             }
             count = 0;
         }
+
+        /* Got the next page */
+        addr += PAGE_SIZE;
     }
 
     if ( op == ALLOCATE || op == INSERT )
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2013-12-19 15:28 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-12-18 17:31 [PATCH] xen/arm: p2m: Don't create new table when the mapping is removed Julien Grall
2013-12-18 19:28 ` Stefano Stabellini
2013-12-18 19:29   ` Julien Grall
2013-12-18 19:31     ` Stefano Stabellini
2013-12-19  9:38 ` Ian Campbell
2013-12-19 15:28   ` Julien Grall

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.