public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Thomas Gleixner <tglx@linutronix.de>
To: Sean Christopherson <seanjc@google.com>
Cc: "Xin Li (Intel)" <xin@zytor.com>,
	linux-kernel@vger.kernel.org, mingo@redhat.com, bp@alien8.de,
	dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com,
	peterz@infradead.org, andrew.cooper3@citrix.com
Subject: Re: [PATCH v1 3/3] x86/entry: Set FRED RSP0 on return to userspace instead of context switch
Date: Thu, 08 Aug 2024 01:04:11 +0200	[thread overview]
Message-ID: <8734ng0wb8.ffs@tglx> (raw)
In-Reply-To: <ZrPtOTHBfZ2e6RfV@google.com>

On Wed, Aug 07 2024 at 14:55, Sean Christopherson wrote:
> On Wed, Aug 07, 2024, Thomas Gleixner wrote:
>> Though I wonder if this should not have a per CPU cache for that.
>> 
>>         if (cpu_feature_enabled(X86_FEATURE_FRED) {
>>         	unsigned long rsp0 = (unsigned long) task_stack_page(current) + THREAD_SIZE;
>> 
>> 		if (__this_cpu_read(cpu_fred_rsp0) != rsp0) {
>> 			wrmsrns(MSR_IA32_FRED_RSP0, fred_rsp0);
>>                         this_cpu_write(cpu_fred_rsp0, rsp0);
>>                 }
>>         }	
>> 
>> Hmm?
>
> A per-CPU cache would work for KVM too, KVM would just need to stuff the cache
> with the guest's value instead of setting _TIF_LOAD_USER_STATES.

There are two options vs. the cache:

1) Use a cache only

static inline void arch_exit_to_user_mode_prepare(struct pt_regs *regs,
						  unsigned long ti_work)
{
	if (IS_ENABLED(CONFIG_X86_DEBUG_FPU) || unlikely(ti_work))
		arch_exit_work(ti_work);

        fred_rsp0_magic();

2) Use both the TIF bit and the cache

static inline void arch_exit_work(unsigned long ti_work)
{
        if (....)
        ...
        fred_rsp0_magic();
}

#1 has the charm that it avoids arch_exit_work() completely when ti_work
   is 0, but has the unconditional check on the per CPU cache variable
   and the extra conditional on every return

#2 has the charm that it avoids touching the per CPU cache variable on
   return when the TIF bit is not set, but comes with the downside of
   going through the ti_work chain to update RSP0

I'm inclined to claim that #1 wins. Why?

The probability for a RSP0 update is higher than the probability for
ti_work != 0, and for syscall heavy workloads the extra per CPU read and
the conditional is not really relevant when we stick this into struct
pcpu_hot. That cacheline is hot anyway in that code path due to
'current' and other members there.

But that's a problem for micro benchmark experts to figure out. I'm not
one of them :)

In any case the cache should be a win over an unconditionl MSR write
independent of MRMSRNS.

Thanks,

        tglx

  reply	other threads:[~2024-08-07 23:04 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-08-07  5:47 [PATCH v1 0/3] x86: Write FRED RSP0 on return to userspace Xin Li (Intel)
2024-08-07  5:47 ` [PATCH v1 1/3] x86/entry: Test ti_work for zero before processing individual bits Xin Li (Intel)
2024-08-07 16:21   ` Brian Gerst
2024-08-07 23:03     ` Xin Li
2024-08-07 18:08   ` Thomas Gleixner
2024-08-07 18:21     ` Thomas Gleixner
2024-08-07 23:01     ` Xin Li
2024-08-07  5:47 ` [PATCH v1 2/3] x86/msr: Switch between WRMSRNS and WRMSR with the alternatives mechanism Xin Li (Intel)
2024-08-07 18:11   ` Thomas Gleixner
2024-08-09 23:07   ` Andrew Cooper
2024-08-10  0:01     ` H. Peter Anvin
2024-08-10  0:25       ` Andrew Cooper
2024-08-16 17:52     ` Xin Li
2024-08-16 18:40       ` Andrew Cooper
2024-08-16 19:18         ` H. Peter Anvin
2024-08-16 21:45           ` Andrew Cooper
2024-08-16 21:26         ` H. Peter Anvin
2024-08-16 22:27           ` Andrew Cooper
2024-08-16 22:34             ` Andrew Cooper
2024-08-16 23:03               ` H. Peter Anvin
2024-08-16 22:59           ` H. Peter Anvin
2024-08-17 23:51             ` H. Peter Anvin
2024-08-17 14:23       ` Borislav Petkov
2024-08-17 14:43         ` Borislav Petkov
2024-08-17 15:44           ` Xin Li
2024-08-17 19:22           ` H. Peter Anvin
2024-08-18  5:59             ` Borislav Petkov
2024-08-17 19:22         ` H. Peter Anvin
2024-08-18  5:49           ` Borislav Petkov
2024-08-18  6:16             ` H. Peter Anvin
2024-08-07  5:47 ` [PATCH v1 3/3] x86/entry: Set FRED RSP0 on return to userspace instead of context switch Xin Li (Intel)
2024-08-07 18:39   ` Thomas Gleixner
2024-08-07 21:55     ` Sean Christopherson
2024-08-07 23:04       ` Thomas Gleixner [this message]
2024-08-09 10:45   ` Nikolay Borisov
2024-08-09 17:37     ` Xin Li
2024-08-09 22:43       ` H. Peter Anvin

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=8734ng0wb8.ffs@tglx \
    --to=tglx@linutronix.de \
    --cc=andrew.cooper3@citrix.com \
    --cc=bp@alien8.de \
    --cc=dave.hansen@linux.intel.com \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=peterz@infradead.org \
    --cc=seanjc@google.com \
    --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