|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] x86/domctl: Reorder user_regs accesses for efficiency
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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |