A subsequent patch is going to insert a loop, which interferes with the
continue in the devirtualisation logic.
Replace it with a goto, and a paragraph explaining why we intentionally avoid
setting a->priv = 1.
No functional change.
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
---
CC: Jan Beulich <JBeulich@suse.com>
CC: Roger Pau Monné <roger.pau@citrix.com>
---
xen/arch/x86/alternative.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/xen/arch/x86/alternative.c b/xen/arch/x86/alternative.c
index 5ea7f51b007c..b745f112154a 100644
--- a/xen/arch/x86/alternative.c
+++ b/xen/arch/x86/alternative.c
@@ -328,7 +328,15 @@ static int init_or_livepatch _apply_alternatives(struct alt_instr *start,
buf[4] = 0xff;
}
else
- continue;
+ {
+ /*
+ * The function pointer we're wanting to devirtualise
+ * is still NULL, and we're not sealing yet. Leave
+ * the alternative fully un-processed, in order to try
+ * again next time around.
+ */
+ goto skip_this_alternative;
+ }
}
else if ( force && system_state < SYS_STATE_active )
ASSERT_UNREACHABLE();
@@ -343,6 +351,7 @@ static int init_or_livepatch _apply_alternatives(struct alt_instr *start,
add_nops(buf + a->repl_len, total_len - a->repl_len);
text_poke(orig, buf, total_len);
+ skip_this_alternative:;
}
/*
--
2.39.5