31 lines
1.2 KiB
Diff
31 lines
1.2 KiB
Diff
|
# Commit d3a55d7d9bb518efe08143d050deff9f4ee80ec1
|
||
|
# Date 2013-07-04 10:33:18 +0200
|
||
|
# Author Andrew Cooper <andrew.cooper3@citrix.com>
|
||
|
# Committer Jan Beulich <jbeulich@suse.com>
|
||
|
x86/mm: Ensure useful progress in alloc_l2_table()
|
||
|
|
||
|
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.
|
||
|
|
||
|
Tweak the continuation criteria to fail on the first iteration of the loop.
|
||
|
|
||
|
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
|
||
|
Acked-by: Keir Fraser <keir@xen.org>
|
||
|
|
||
|
--- a/xen/arch/x86/mm.c
|
||
|
+++ b/xen/arch/x86/mm.c
|
||
|
@@ -1278,7 +1278,8 @@ static int alloc_l2_table(struct page_in
|
||
|
|
||
|
for ( i = page->nr_validated_ptes; i < L2_PAGETABLE_ENTRIES; i++ )
|
||
|
{
|
||
|
- if ( preemptible && i && hypercall_preempt_check() )
|
||
|
+ if ( preemptible && i > page->nr_validated_ptes
|
||
|
+ && hypercall_preempt_check() )
|
||
|
{
|
||
|
page->nr_validated_ptes = i;
|
||
|
rc = -EAGAIN;
|