From: "H. Peter Anvin" <hpa@zytor.com>
To: Juergen Gross <jgross@suse.com>,
linux-kernel@vger.kernel.org, x86@kernel.org,
linux-coco@lists.linux.dev, kvm@vger.kernel.org,
linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev,
llvm@lists.linux.dev
Cc: Thomas Gleixner <tglx@kernel.org>, Ingo Molnar <mingo@redhat.com>,
Borislav Petkov <bp@alien8.de>,
Dave Hansen <dave.hansen@linux.intel.com>,
Kiryl Shutsemau <kas@kernel.org>,
Rick Edgecombe <rick.p.edgecombe@intel.com>,
Sean Christopherson <seanjc@google.com>,
Paolo Bonzini <pbonzini@redhat.com>,
"K. Y. Srinivasan" <kys@microsoft.com>,
Haiyang Zhang <haiyangz@microsoft.com>,
Wei Liu <wei.liu@kernel.org>, Dexuan Cui <decui@microsoft.com>,
Long Li <longli@microsoft.com>,
Vitaly Kuznetsov <vkuznets@redhat.com>,
Boris Ostrovsky <boris.ostrovsky@oracle.com>,
xen-devel@lists.xenproject.org,
Ajay Kaher <ajay.kaher@broadcom.com>,
Alexey Makhalov <alexey.makhalov@broadcom.com>,
Broadcom internal kernel review list
<bcm-kernel-feedback-list@broadcom.com>,
Andy Lutomirski <luto@kernel.org>,
Peter Zijlstra <peterz@infradead.org>, Xin Li <xin@zytor.com>,
Nathan Chancellor <nathan@kernel.org>,
Nick Desaulniers <nick.desaulniers+lkml@gmail.com>,
Bill Wendling <morbo@google.com>,
Justin Stitt <justinstitt@google.com>,
Josh Poimboeuf <jpoimboe@kernel.org>,
andy.cooper@citrix.com
Subject: Re: [PATCH v3 00/16] x86/msr: Inline rdmsr/wrmsr instructions
Date: Wed, 18 Feb 2026 12:37:50 -0800 [thread overview]
Message-ID: <3D1FE2A7-F237-4232-9E39-6AFC75F3A4F0@zytor.com> (raw)
In-Reply-To: <20260218082133.400602-1-jgross@suse.com>
On February 18, 2026 12:21:17 AM PST, Juergen Gross <jgross@suse.com> wrote:
>When building a kernel with CONFIG_PARAVIRT_XXL the paravirt
>infrastructure will always use functions for reading or writing MSRs,
>even when running on bare metal.
>
>Switch to inline RDMSR/WRMSR instructions in this case, reducing the
>paravirt overhead.
>
>The first patch is a prerequisite fix for alternative patching. Its
>is needed due to the initial indirect call needs to be padded with
>NOPs in some cases with the following patches.
>
>In order to make this less intrusive, some further reorganization of
>the MSR access helpers is done in the patches 1-6.
>
>The next 4 patches are converting the non-paravirt case to use direct
>inlining of the MSR access instructions, including the WRMSRNS
>instruction and the immediate variants of RDMSR and WRMSR if possible.
>
>Patches 11-13 are some further preparations for making the real switch
>to directly patch in the native MSR instructions easier.
>
>Patch 14 is switching the paravirt MSR function interface from normal
>call ABI to one more similar to the native MSR instructions.
>
>Patch 15 is a little cleanup patch.
>
>Patch 16 is the final step for patching in the native MSR instructions
>when not running as a Xen PV guest.
>
>This series has been tested to work with Xen PV and on bare metal.
>
>Note that there is more room for improvement. This series is sent out
>to get a first impression how the code will basically look like.
Does that mean you are considering this patchset an RFC? If so, you should put that in the subject header.
>Right now the same problem is solved differently for the paravirt and
>the non-paravirt cases. In case this is not desired, there are two
>possibilities to merge the two implementations. Both solutions have
>the common idea to have rather similar code for paravirt and
>non-paravirt variants, but just use a different main macro for
>generating the respective code. For making the code of both possible
>scenarios more similar, the following variants are possible:
>
>1. Remove the micro-optimizations of the non-paravirt case, making
> it similar to the paravirt code in my series. This has the
> advantage of being more simple, but might have a very small
> negative performance impact (probably not really detectable).
>
>2. Add the same micro-optimizations to the paravirt case, requiring
> to enhance paravirt patching to support a to be patched indirect
> call in the middle of the initial code snipplet.
>
>In both cases the native MSR function variants would no longer be
>usable in the paravirt case, but this would mostly affect Xen, as it
>would need to open code the WRMSR/RDMSR instructions to be used
>instead the native_*msr*() functions.
>
>Changes since V2:
>- switch back to the paravirt approach
>
>Changes since V1:
>- Use Xin Li's approach for inlining
>- Several new patches
>
>Juergen Gross (16):
> x86/alternative: Support alt_replace_call() with instructions after
> call
> coco/tdx: Rename MSR access helpers
> x86/sev: Replace call of native_wrmsr() with native_wrmsrq()
> KVM: x86: Remove the KVM private read_msr() function
> x86/msr: Minimize usage of native_*() msr access functions
> x86/msr: Move MSR trace calls one function level up
> x86/opcode: Add immediate form MSR instructions
> x86/extable: Add support for immediate form MSR instructions
> x86/msr: Use the alternatives mechanism for WRMSR
> x86/msr: Use the alternatives mechanism for RDMSR
> x86/alternatives: Add ALTERNATIVE_4()
> x86/paravirt: Split off MSR related hooks into new header
> x86/paravirt: Prepare support of MSR instruction interfaces
> x86/paravirt: Switch MSR access pv_ops functions to instruction
> interfaces
> x86/msr: Reduce number of low level MSR access helpers
> x86/paravirt: Use alternatives for MSR access with paravirt
>
> arch/x86/coco/sev/internal.h | 7 +-
> arch/x86/coco/tdx/tdx.c | 8 +-
> arch/x86/hyperv/ivm.c | 2 +-
> arch/x86/include/asm/alternative.h | 6 +
> arch/x86/include/asm/fred.h | 2 +-
> arch/x86/include/asm/kvm_host.h | 10 -
> arch/x86/include/asm/msr.h | 345 ++++++++++++++++------
> arch/x86/include/asm/paravirt-msr.h | 148 ++++++++++
> arch/x86/include/asm/paravirt.h | 67 -----
> arch/x86/include/asm/paravirt_types.h | 57 ++--
> arch/x86/include/asm/qspinlock_paravirt.h | 4 +-
> arch/x86/kernel/alternative.c | 5 +-
> arch/x86/kernel/cpu/mshyperv.c | 7 +-
> arch/x86/kernel/kvmclock.c | 2 +-
> arch/x86/kernel/paravirt.c | 42 ++-
> arch/x86/kvm/svm/svm.c | 16 +-
> arch/x86/kvm/vmx/tdx.c | 2 +-
> arch/x86/kvm/vmx/vmx.c | 8 +-
> arch/x86/lib/x86-opcode-map.txt | 5 +-
> arch/x86/mm/extable.c | 35 ++-
> arch/x86/xen/enlighten_pv.c | 52 +++-
> arch/x86/xen/pmu.c | 4 +-
> tools/arch/x86/lib/x86-opcode-map.txt | 5 +-
> tools/objtool/check.c | 1 +
> 24 files changed, 576 insertions(+), 264 deletions(-)
> create mode 100644 arch/x86/include/asm/paravirt-msr.h
>
Could you clarify *on the high design level* what "go back to the paravirt approach" means, and the motivation for that?
Note that for Xen *most* MSRs fall in one of two categories: those that are dropped entirely and those that are just passed straight on to the hardware.
I don't know if anyone cares about optimizing PV Xen anymore, but at least in theory Xen can un-paravirtualize most sites.
next prev parent reply other threads:[~2026-02-18 20:54 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-18 8:21 [PATCH v3 00/16] x86/msr: Inline rdmsr/wrmsr instructions Juergen Gross
2026-02-18 8:21 ` [PATCH v3 06/16] x86/msr: Move MSR trace calls one function level up Juergen Gross
2026-02-18 8:21 ` [PATCH v3 12/16] x86/paravirt: Split off MSR related hooks into new header Juergen Gross
2026-02-18 8:21 ` [PATCH v3 13/16] x86/paravirt: Prepare support of MSR instruction interfaces Juergen Gross
2026-02-18 8:21 ` [PATCH v3 14/16] x86/paravirt: Switch MSR access pv_ops functions to " Juergen Gross
2026-02-18 8:21 ` [PATCH v3 16/16] x86/paravirt: Use alternatives for MSR access with paravirt Juergen Gross
2026-02-18 13:49 ` kernel test robot
2026-02-18 15:49 ` Juergen Gross
2026-02-18 20:37 ` H. Peter Anvin [this message]
2026-02-19 6:28 ` [PATCH v3 00/16] x86/msr: Inline rdmsr/wrmsr instructions Jürgen Groß
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3D1FE2A7-F237-4232-9E39-6AFC75F3A4F0@zytor.com \
--to=hpa@zytor.com \
--cc=ajay.kaher@broadcom.com \
--cc=alexey.makhalov@broadcom.com \
--cc=andy.cooper@citrix.com \
--cc=bcm-kernel-feedback-list@broadcom.com \
--cc=boris.ostrovsky@oracle.com \
--cc=bp@alien8.de \
--cc=dave.hansen@linux.intel.com \
--cc=decui@microsoft.com \
--cc=haiyangz@microsoft.com \
--cc=jgross@suse.com \
--cc=jpoimboe@kernel.org \
--cc=justinstitt@google.com \
--cc=kas@kernel.org \
--cc=kvm@vger.kernel.org \
--cc=kys@microsoft.com \
--cc=linux-coco@lists.linux.dev \
--cc=linux-hyperv@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=llvm@lists.linux.dev \
--cc=longli@microsoft.com \
--cc=luto@kernel.org \
--cc=mingo@redhat.com \
--cc=morbo@google.com \
--cc=nathan@kernel.org \
--cc=nick.desaulniers+lkml@gmail.com \
--cc=pbonzini@redhat.com \
--cc=peterz@infradead.org \
--cc=rick.p.edgecombe@intel.com \
--cc=seanjc@google.com \
--cc=tglx@kernel.org \
--cc=virtualization@lists.linux.dev \
--cc=vkuznets@redhat.com \
--cc=wei.liu@kernel.org \
--cc=x86@kernel.org \
--cc=xen-devel@lists.xenproject.org \
--cc=xin@zytor.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox