|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] x86/PV: avoid double stack reset during schedule tail handling
commit 2c2c941686d2aedac0f09b6546c844c391c0f7e8
Author: Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Wed Dec 16 16:42:50 2020 +0100
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Wed Dec 16 16:42:50 2020 +0100
x86/PV: avoid double stack reset during schedule tail handling
Invoking check_wakeup_from_wait() from assembly allows the new
continue_pv_domain() to replace the prior continue_nonidle_domain() as
the tail hook, eliminating an extra reset_stack_and_jump().
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Juergen Gross <jgross@xxxxxxxx>
Reviewed-by: Wei Liu <wl@xxxxxxx>
---
xen/arch/x86/pv/domain.c | 9 ++-------
xen/arch/x86/x86_64/entry.S | 5 ++++-
xen/include/asm-x86/asm_defns.h | 1 -
3 files changed, 6 insertions(+), 9 deletions(-)
diff --git a/xen/arch/x86/pv/domain.c b/xen/arch/x86/pv/domain.c
index 1a607f856e..23d6009143 100644
--- a/xen/arch/x86/pv/domain.c
+++ b/xen/arch/x86/pv/domain.c
@@ -110,12 +110,6 @@ static int parse_pcid(const char *s)
return rc;
}
-static void noreturn continue_nonidle_domain(void)
-{
- check_wakeup_from_wait();
- reset_stack_and_jump(ret_from_intr);
-}
-
static int setup_compat_l4(struct vcpu *v)
{
struct page_info *pg;
@@ -341,13 +335,14 @@ void pv_domain_destroy(struct domain *d)
FREE_XENHEAP_PAGE(d->arch.pv.gdt_ldt_l1tab);
}
+void noreturn continue_pv_domain(void);
int pv_domain_initialise(struct domain *d)
{
static const struct arch_csw pv_csw = {
.from = paravirt_ctxt_switch_from,
.to = paravirt_ctxt_switch_to,
- .tail = continue_nonidle_domain,
+ .tail = continue_pv_domain,
};
int rc = -ENOMEM;
diff --git a/xen/arch/x86/x86_64/entry.S b/xen/arch/x86/x86_64/entry.S
index 000eb9722b..526c388458 100644
--- a/xen/arch/x86/x86_64/entry.S
+++ b/xen/arch/x86/x86_64/entry.S
@@ -557,8 +557,10 @@ ENTRY(dom_crash_sync_extable)
.text
/* No special register assumptions. */
-ENTRY(ret_from_intr)
#ifdef CONFIG_PV
+ENTRY(continue_pv_domain)
+ call check_wakeup_from_wait
+ret_from_intr:
GET_CURRENT(bx)
testb $3, UREGS_cs(%rsp)
jz restore_all_xen
@@ -567,6 +569,7 @@ ENTRY(ret_from_intr)
je test_all_events
jmp compat_test_all_events
#else
+ret_from_intr:
ASSERT_CONTEXT_IS_XEN
jmp restore_all_xen
#endif
diff --git a/xen/include/asm-x86/asm_defns.h b/xen/include/asm-x86/asm_defns.h
index b42a19b654..774a294d15 100644
--- a/xen/include/asm-x86/asm_defns.h
+++ b/xen/include/asm-x86/asm_defns.h
@@ -23,7 +23,6 @@ asm ( "\t.equ CONFIG_INDIRECT_THUNK, "
#include <asm/indirect_thunk_asm.h>
#ifndef __ASSEMBLY__
-void ret_from_intr(void);
/*
* This output constraint should be used for any inline asm which has a "call"
--
generated by git-patchbot for /home/xen/git/xen.git#master
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |