mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Andrew Cooper <andrew.cooper3@citrix.com>
To: Borislav Petkov <bp@alien8.de>, "H. Peter Anvin" <hpa@zytor.com>
Cc: dave.hansen@intel.com, xin@zytor.com,
	linux-kernel@vger.kernel.org, tglx@linutronix.de,
	mingo@redhat.com, dave.hansen@linux.intel.com, x86@kernel.org,
	peterz@infradead.org, nik.borisov@suse.com,
	houwenlong.hwl@antgroup.com, Juergen Gross <jgross@suse.com>
Subject: Re: [PATCH v1 2/4] x86/fred: Write to FRED MSRs with wrmsrns()
Date: Fri, 5 Jul 2024 11:30:16 +0100	[thread overview]
Message-ID: <cda57e5f-acf5-414c-8faa-d2496c02ced9@citrix.com> (raw)
In-Reply-To: <20240705094418.GAZofAcvelmnRzbkoG@fat_crate.local>

On 05/07/2024 10:44 am, Borislav Petkov wrote:
> On Thu, Jul 04, 2024 at 07:45:00PM -0700, H. Peter Anvin wrote:
>> Except that that would be more cleanly spelled wrmsrns()... let's just
>> abstract the whole thing away and let the user use wrmsrns() whenever
>> serialization is not necessary.
> Just don't make it more complex and unreadable than it has to be.
>
> cpu_feature_enabled() already is patching things for optimal perf so even if
> PeterZ prefers the alternative, I say it is ugly and, more importantly,
> unnecessary.

You cite perf.  Look at the disassembly of the two approaches...

cpu_feature_enabled() might give you warm fuzzy feelings that you've
eekd out every ounce of performance, but it's an absolute disaster at a
code generation level by forcing the compiler to lay out both side and
preventing any kind of CSE.  As I've reported before, count the number
of RDPKRU instructions in trivial-looking xsave handling functions for a
glimpse of the practical consequences.


Anyway, none of this is the complicated aspect.  The complicated issue
is the paravirt wrmsr().

TGLX's complaint is that everyone turns on CONFIG_PARAVIRT, and the
paravirt hook for wmsr() is a code generation disaster WRT parameter
handling.  I agree that it's not great, although it's got nothing on the
damage done by cpu_feature_enabled().


But, seeing as I've got everyone's attention, I'll repeat my proposal
for fixing this nicely, in the hope of any feedback on the 3rd posting...

The underlying problem is that parameter setup for the paravirt wrmsr()
follows a C calling convention, so the index/data are manifested into
%rdi/%rsi.  Then, the out-line "native" hook shuffles the index/data
back into %ecx/%edx/%eax, and this cost is borne in all kernels.

Instead, the better way would be to have a hook with a non-standard
calling convention which happens to match the WRMSR instruction.

That way, the native, and simple paravirt paths inline to a single
instruction with no extraneous parameter shuffling, and the shuffling
cost is borne by PARAVIRT_XXL only, where a reg/reg move is nothing
compared to the hypercall involved.

The only complication is the extable #GP hook, but that's fine to place
at the paravirt site as long as the extable handler confirms the #GP
came from a WRMSR{NS,} and not a branch.

~Andrew

  reply	other threads:[~2024-07-05 10:30 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-03  8:54 [PATCH v1 0/4] Enable FRED earlier Xin Li (Intel)
2024-07-03  8:54 ` [PATCH v1 1/4] x86/fred: Parse cmdline param "fred=" in cpu_parse_early_param() Xin Li (Intel)
2024-07-04 11:20   ` Nikolay Borisov
2024-07-07 17:42     ` Xin Li
2024-07-03  8:54 ` [PATCH v1 2/4] x86/fred: Write to FRED MSRs with wrmsrns() Xin Li (Intel)
2024-07-03 15:43   ` Dave Hansen
2024-07-03 15:54     ` Borislav Petkov
2024-07-03 16:00       ` Andrew Cooper
2024-07-03 16:06         ` H. Peter Anvin
2024-07-03 16:17           ` Borislav Petkov
2024-07-05  2:45             ` H. Peter Anvin
2024-07-05  9:44               ` Borislav Petkov
2024-07-05 10:30                 ` Andrew Cooper [this message]
2024-07-05 13:45                   ` Borislav Petkov
2024-07-09 13:58                     ` Xin Li
2024-07-09 20:51                       ` H. Peter Anvin
2024-07-03 16:18           ` Andrew Cooper
2024-07-04  5:57             ` Xin Li
2024-07-04  7:58               ` H. Peter Anvin
2024-07-04  8:23               ` Borislav Petkov
2024-07-04  8:28                 ` H. Peter Anvin
2024-07-03 16:43           ` Dave Hansen
2024-07-03 22:48             ` Xin Li
2024-07-05  9:28         ` Peter Zijlstra
2024-07-05 11:33           ` H. Peter Anvin
2024-07-03  8:54 ` [PATCH v1 3/4] x86/fred: Split FRED RSP initialization into a separate function Xin Li (Intel)
2024-07-03  8:54 ` [PATCH v1 4/4] x86/fred: Enable FRED right after init_mem_mapping() Xin Li (Intel)

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=cda57e5f-acf5-414c-8faa-d2496c02ced9@citrix.com \
    --to=andrew.cooper3@citrix.com \
    --cc=bp@alien8.de \
    --cc=dave.hansen@intel.com \
    --cc=dave.hansen@linux.intel.com \
    --cc=houwenlong.hwl@antgroup.com \
    --cc=hpa@zytor.com \
    --cc=jgross@suse.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=nik.borisov@suse.com \
    --cc=peterz@infradead.org \
    --cc=tglx@linutronix.de \
    --cc=x86@kernel.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

all inboxes | Powered by JetHome®