xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] x86/mm: Ensure useful progress in alloc_l2_table()
@ 2013-07-03 11:37 Andrew Cooper
  2013-07-03 12:16 ` Jan Beulich
  0 siblings, 1 reply; 3+ messages in thread
From: Andrew Cooper @ 2013-07-03 11:37 UTC (permalink / raw)
  To: Xen-devel; +Cc: Andrew Cooper, Keir, Jan Beulich

While debugging the issue which turned out to be XSA-58, a printk in this loop
showed that it was quite easy to never make useful progress, because of
consistently failing the preemption check.

One single l2 entry is a reasonable amount of work to do, even if an action is
pending, and also assures forwards progress across repeat continuations.

Move the preemption check to the end of the loop, and adjust it so as to not
cause a continuation if we have completed the l2 table.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Cc: Keir <keir@xen.org>
Cc: Jan Beulich <JBeulich@suse.com>
---
 xen/arch/x86/mm.c |   15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index 77dcafc..245838b 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -1278,13 +1278,6 @@ static int alloc_l2_table(struct page_info *page, unsigned long type,
 
     for ( i = page->nr_validated_ptes; i < L2_PAGETABLE_ENTRIES; i++ )
     {
-        if ( preemptible && i && hypercall_preempt_check() )
-        {
-            page->nr_validated_ptes = i;
-            rc = -EAGAIN;
-            break;
-        }
-
         if ( !is_guest_l2_slot(d, type, i) ||
              (rc = get_page_from_l2e(pl2e[i], pfn, d)) > 0 )
             continue;
@@ -1299,6 +1292,14 @@ static int alloc_l2_table(struct page_info *page, unsigned long type,
         }
 
         adjust_guest_l2e(pl2e[i], d);
+
+        if ( preemptible && i != L2_PAGETABLE_ENTRIES
+             && hypercall_preempt_check() )
+        {
+            page->nr_validated_ptes = i + 1;
+            rc = -EAGAIN;
+            break;
+        }
     }
 
     if ( rc >= 0 && (type & PGT_pae_xen_l2) )
-- 
1.7.10.4

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

end of thread, other threads:[~2013-07-03 12:20 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-07-03 11:37 [PATCH] x86/mm: Ensure useful progress in alloc_l2_table() Andrew Cooper
2013-07-03 12:16 ` Jan Beulich
2013-07-03 12:20   ` Andrew Cooper

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).