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

Re: [PATCH] x86/domctl: Reorder user_regs accesses for efficiency


  • To: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
  • From: Frediano Ziglio <freddy77@xxxxxxxxx>
  • Date: Mon, 20 Jul 2026 11:01:21 +0100
  • Arc-authentication-results: i=1; mx.google.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=SDKRzzdGRcnNNkgrabuwOxbftwIMRAbnSY7PxCk6mdU=; fh=wpPYIvM/uAwkGWAfTQr96u7uYNsg7Rgtcx8qhXGsU5c=; b=QjNAmc7OTwrHX7ZZdvzfIlPUhI9UX/wEeNjfajdKjtJoFsyBbqo9oPt+vJVEE/lHkA JeFk3XZHPrOMrq/LmLNzfbYb2N5KUlslHENSEyUbbiFIYiY9OizZ1zCq2jGfTl//xAWZ jw+NtK94cNZRCcFMF304+od3sm/zH8W2Ip9of0XSiA57adGlX7y0cSAbM9d5uQrZpsFm MnkHp3nUwkcNL7uSuVj9rxdWyYGY2PKWKhU7EWH/R93FLI61I7PhRNBxHO4rlVZ2UKIe eGeitv2wvaYlrJlOg+UzaDo3ZIjQxeVv+URXUtzug15Q/E/mO6RjdA6QILJvvzm6s6fH 6Y5Q==; darn=lists.xenproject.org
  • Arc-seal: i=1; a=rsa-sha256; t=1784541693; cv=none; d=google.com; s=arc-20260327; b=G/YosWV+IpUTv59+fZZxXZaE9NxhJx8XMbM8GrahgW7Bf/ICkGL9TVyQ5L/ByagDSc Rrhrd3kJ4aYg+rskpvObeUNwPPHOSXWWuviRAknpAxgjev+RYWjy22V0diAneE0geuH4 DR3FedL/ycCg6HaeRxQJyqqkkYQJklUtp6F63xzs/bV0k0Gx095K1ynca/4Ggb5U6mVZ JcL9RHj1UTKhTTkW6djp50KPDQDUnM3FwsEM/JbLjnfzRk2zevXx9LEyQEydfe6qWQYV VkQws8B8K2+Gn6NIwACGLrx/lyvPBiBeTSjO7ZOygdz+/lw+6cEtCBtvohw+2i/2AGJV s7rg==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=20251104 header.d=gmail.com header.i="@gmail.com" header.h="Content-Transfer-Encoding:Content-Type:Cc:To:Subject:Message-ID:Date:From:In-Reply-To:References:MIME-Version"
  • Cc: Xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxxx>, Jan Beulich <jbeulich@xxxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>, Teddy Astie <teddy.astie@xxxxxxxxxx>, Marek Marczykowski-Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx>
  • Delivery-date: Mon, 20 Jul 2026 10:01:39 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On Mon, 20 Jul 2026 at 10:38, Andrew Cooper <andrew.cooper3@xxxxxxxxxx> wrote:
>
> The current order is derived from expanding XLAT_cpu_user_regs() which uses
> the x86_32 cpu_user_regs order.  This is correct for one the blocks, but not
> the others.
>
> In order to work with the prefetcher, rather than against it, loads want to be
> in field order.  Make this so for the three paths reading an x86_64
> cpu_user_regs.
>
> No functional change.
>
> Reported-by: Jan Beulich <jbeulich@xxxxxxxx>
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> ---
> CC: Jan Beulich <jbeulich@xxxxxxxx>
> CC: Roger Pau Monné <roger.pau@xxxxxxxxxx>
> CC: Teddy Astie <teddy.astie@xxxxxxxxxx>
> CC: Marek Marczykowski-Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx>
> ---
>  xen/arch/x86/domain.c |  6 +++---
>  xen/arch/x86/domctl.c | 10 +++++-----
>  2 files changed, 8 insertions(+), 8 deletions(-)
>
> diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
> index 53a86ba373a4..996b50af7a17 100644
> --- a/xen/arch/x86/domain.c
> +++ b/xen/arch/x86/domain.c
> @@ -1259,17 +1259,17 @@ int arch_set_info_guest(
>          v->arch.user_regs.r14               = c.nat->user_regs.r14;
>          v->arch.user_regs.r13               = c.nat->user_regs.r13;
>          v->arch.user_regs.r12               = c.nat->user_regs.r12;
> +        v->arch.user_regs.rbp               = c.nat->user_regs.rbp;
> +        v->arch.user_regs.rbx               = c.nat->user_regs.rbx;
>          v->arch.user_regs.r11               = c.nat->user_regs.r11;
>          v->arch.user_regs.r10               = c.nat->user_regs.r10;
>          v->arch.user_regs.r9                = c.nat->user_regs.r9;
>          v->arch.user_regs.r8                = c.nat->user_regs.r8;
> -        v->arch.user_regs.rbx               = c.nat->user_regs.rbx;
> +        v->arch.user_regs.rax               = c.nat->user_regs.rax;
>          v->arch.user_regs.rcx               = c.nat->user_regs.rcx;
>          v->arch.user_regs.rdx               = c.nat->user_regs.rdx;
>          v->arch.user_regs.rsi               = c.nat->user_regs.rsi;
>          v->arch.user_regs.rdi               = c.nat->user_regs.rdi;
> -        v->arch.user_regs.rbp               = c.nat->user_regs.rbp;
> -        v->arch.user_regs.rax               = c.nat->user_regs.rax;
>          v->arch.user_regs.rip               = c.nat->user_regs.rip;
>          v->arch.user_regs.cs                = c.nat->user_regs.cs;
>          v->arch.user_regs.rflags            = (c.nat->user_regs.rflags & 
> X86_EFLAGS_ALL) | X86_EFLAGS_MBS;
> diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c
> index 3ea4c650eee0..2ecd81d89b09 100644
> --- a/xen/arch/x86/domctl.c
> +++ b/xen/arch/x86/domctl.c
> @@ -1485,17 +1485,17 @@ void arch_get_info_guest(struct vcpu *v, 
> vcpu_guest_context_u c)
>          c.nat->user_regs.r14               = v->arch.user_regs.r14;
>          c.nat->user_regs.r13               = v->arch.user_regs.r13;
>          c.nat->user_regs.r12               = v->arch.user_regs.r12;
> +        c.nat->user_regs.rbp               = v->arch.user_regs.rbp;
> +        c.nat->user_regs.rbx               = v->arch.user_regs.rbx;
>          c.nat->user_regs.r11               = v->arch.user_regs.r11;
>          c.nat->user_regs.r10               = v->arch.user_regs.r10;
>          c.nat->user_regs.r9                = v->arch.user_regs.r9;
>          c.nat->user_regs.r8                = v->arch.user_regs.r8;
> -        c.nat->user_regs.rbx               = v->arch.user_regs.rbx;
> +        c.nat->user_regs.rax               = v->arch.user_regs.rax;
>          c.nat->user_regs.rcx               = v->arch.user_regs.rcx;
>          c.nat->user_regs.rdx               = v->arch.user_regs.rdx;
>          c.nat->user_regs.rsi               = v->arch.user_regs.rsi;
>          c.nat->user_regs.rdi               = v->arch.user_regs.rdi;
> -        c.nat->user_regs.rbp               = v->arch.user_regs.rbp;
> -        c.nat->user_regs.rax               = v->arch.user_regs.rax;
>          c.nat->user_regs.rip               = v->arch.user_regs.rip;
>          c.nat->user_regs.cs                = v->arch.user_regs.cs;
>          c.nat->user_regs.rflags            = v->arch.user_regs.rflags;
> @@ -1514,13 +1514,13 @@ void arch_get_info_guest(struct vcpu *v, 
> vcpu_guest_context_u c)
>      else
>      {
>          /* Backing memory is pre-zeroed. */
> +        c.cmp->user_regs.ebp               = v->arch.user_regs.ebp;
>          c.cmp->user_regs.ebx               = v->arch.user_regs.ebx;
> +        c.cmp->user_regs.eax               = v->arch.user_regs.eax;
>          c.cmp->user_regs.ecx               = v->arch.user_regs.ecx;
>          c.cmp->user_regs.edx               = v->arch.user_regs.edx;
>          c.cmp->user_regs.esi               = v->arch.user_regs.esi;
>          c.cmp->user_regs.edi               = v->arch.user_regs.edi;
> -        c.cmp->user_regs.ebp               = v->arch.user_regs.ebp;
> -        c.cmp->user_regs.eax               = v->arch.user_regs.eax;
>          c.cmp->user_regs.eip               = v->arch.user_regs.eip;
>          c.cmp->user_regs.cs                = v->arch.user_regs.cs;
>          c.cmp->user_regs.eflags            = v->arch.user_regs.eflags;

Reviewed-by: Frediano Ziglio <frediano.ziglio@xxxxxxxxxx>

Frediano



 


Rackspace

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