[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 2/5] xen/wait: Extend the description of how this logic actually works


  • To: Xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
  • Date: Mon, 18 Jul 2022 08:18:22 +0100
  • Authentication-results: esa2.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none
  • Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Jan Beulich <JBeulich@xxxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>, Wei Liu <wl@xxxxxxx>
  • Delivery-date: Mon, 18 Jul 2022 07:18:57 +0000
  • Ironport-data: A9a23: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
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
CC: Jan Beulich <JBeulich@xxxxxxxx>
CC: Roger Pau Monné <roger.pau@xxxxxxxxxx>
CC: Wei Liu <wl@xxxxxxx>
---
 xen/common/wait.c | 29 +++++++++++++++++++++++++----
 1 file changed, 25 insertions(+), 4 deletions(-)

diff --git a/xen/common/wait.c b/xen/common/wait.c
index 3ebb884fe738..4dcfa17a8a3f 100644
--- a/xen/common/wait.c
+++ b/xen/common/wait.c
@@ -137,7 +137,19 @@ static void __prepare_to_wait(struct waitqueue_vcpu *wqv)
             do_softirq();
     }
 
-    /* Hand-rolled setjmp(). */
+    /*
+     * Hand-rolled setjmp().
+     *
+     * __prepare_to_wait() is the leaf of a deep calltree.  Preserve the GPRs,
+     * bounds check what we want to stash in wqv->stack, copy the active stack
+     * (up to cpu_info) into wqv->stack, then return normally.  Our caller
+     * will shortly schedule() and discard the current context.
+     *
+     * The copy out is performed with a rep movsb.  When
+     * check_wakeup_from_wait() longjmp()'s back into us, %rsp is pre-adjusted
+     * to be suitable and %rsi/%rdi are swapped, so the rep movsb instead
+     * copies in from wqv->stack over the active stack.
+     */
     asm volatile (
         "push %%rax; push %%rbx; push %%rdx; push %%rbp;"
         "push %%r8;  push %%r9;  push %%r10; push %%r11;"
@@ -199,9 +211,18 @@ void check_wakeup_from_wait(void)
     }
 
     /*
-     * Hand-rolled longjmp().  Returns to __prepare_to_wait(), and lands on a
-     * `rep movs` instruction.  All other GPRs are restored from the stack, so
-     * are available for use here.
+     * Hand-rolled longjmp().
+     *
+     * check_wakeup_from_wait() is always called with a shallow stack,
+     * immediately after the vCPU has been rescheduled.
+     *
+     * Adjust %rsp to be the correct depth for the (deeper) stack we want to
+     * restore, then prepare %rsi, %rdi and %rcx such that when we intercept
+     * the rep movs in __prepare_to_wait(), it copies from wqv->stack over the
+     * active stack.
+     *
+     * All other GPRs are available for use; they're either restored from
+     * wqv->stack or explicitly clobbered.
      */
     asm volatile (
         "mov %1,%%"__OP"sp; jmp .L_wq_resume;"
-- 
2.11.0




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.