From: Nadav Amit <namit@vmware.com>
To: Andy Lutomirski <luto@kernel.org>
Cc: Dave Hansen <dave.hansen@intel.com>,
Peter Zijlstra <peterz@infradead.org>,
LKML <linux-kernel@vger.kernel.org>,
Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
the arch/x86 maintainers <x86@kernel.org>,
Thomas Gleixner <tglx@linutronix.de>,
Dave Hansen <dave.hansen@linux.intel.com>,
Paolo Bonzini <pbonzini@redhat.com>,
"kvm@vger.kernel.org" <kvm@vger.kernel.org>
Subject: Re: [PATCH 6/9] KVM: x86: Provide paravirtualized flush_tlb_multi()
Date: Wed, 26 Jun 2019 06:30:50 +0000 [thread overview]
Message-ID: <A52332CE-80A2-4705-ABB0-3CDDB7AEC889@vmware.com> (raw)
In-Reply-To: <CALCETrUPKj1rRn1bKDYkwZ8cv1navBne72kTCtGHjnhTM0cOVw@mail.gmail.com>
> On Jun 25, 2019, at 8:56 PM, Andy Lutomirski <luto@kernel.org> wrote:
>
> On Tue, Jun 25, 2019 at 8:41 PM Nadav Amit <namit@vmware.com> wrote:
>>> On Jun 25, 2019, at 8:35 PM, Andy Lutomirski <luto@kernel.org> wrote:
>>>
>>> On Tue, Jun 25, 2019 at 7:39 PM Nadav Amit <namit@vmware.com> wrote:
>>>>> On Jun 25, 2019, at 2:40 PM, Dave Hansen <dave.hansen@intel.com> wrote:
>>>>>
>>>>> On 6/12/19 11:48 PM, Nadav Amit wrote:
>>>>>> Support the new interface of flush_tlb_multi, which also flushes the
>>>>>> local CPU's TLB, instead of flush_tlb_others that does not. This
>>>>>> interface is more performant since it parallelize remote and local TLB
>>>>>> flushes.
>>>>>>
>>>>>> The actual implementation of flush_tlb_multi() is almost identical to
>>>>>> that of flush_tlb_others().
>>>>>
>>>>> This confused me a bit. I thought we didn't support paravirtualized
>>>>> flush_tlb_multi() from reading earlier in the series.
>>>>>
>>>>> But, it seems like that might be Xen-only and doesn't apply to KVM and
>>>>> paravirtualized KVM has no problem supporting flush_tlb_multi(). Is
>>>>> that right? It might be good to include some of that background in the
>>>>> changelog to set the context.
>>>>
>>>> I’ll try to improve the change-logs a bit. There is no inherent reason for
>>>> PV TLB-flushers not to implement their own flush_tlb_multi(). It is left
>>>> for future work, and here are some reasons:
>>>>
>>>> 1. Hyper-V/Xen TLB-flushing code is not very simple
>>>> 2. I don’t have a proper setup
>>>> 3. I am lazy
>>>
>>> In the long run, I think that we're going to want a way for one CPU to
>>> do a remote flush and then, with appropriate locking, update the
>>> tlb_gen fields for the remote CPU. Getting this right may be a bit
>>> nontrivial.
>>
>> What do you mean by “do a remote flush”?
>
> I mean a PV-assisted flush on a CPU other than the CPU that started
> it. If you look at flush_tlb_func_common(), it's doing some work that
> is rather fancier than just flushing the TLB. By replacing it with
> just a pure flush on Xen or Hyper-V, we're losing the potential CR3
> switch and this bit:
>
> /* Both paths above update our state to mm_tlb_gen. */
> this_cpu_write(cpu_tlbstate.ctxs[loaded_mm_asid].tlb_gen, mm_tlb_gen);
>
> Skipping the former can hurt idle performance, although we should
> consider just disabling all the lazy optimizations on systems with PV
> flush. (And I've asked Intel to help us out here in future hardware.
> I have no idea what the result of asking will be.) Skipping the
> cpu_tlbstate write means that we will do unnecessary flushes in the
> future, and that's not doing us any favors.
>
> In principle, we should be able to do something like:
>
> flush_tlb_multi(...);
> for(each CPU that got flushed) {
> spin_lock(something appropriate?);
> per_cpu_write(cpu, cpu_tlbstate.ctxs[loaded_mm_asid].tlb_gen, f->new_tlb_gen);
> spin_unlock(...);
> }
>
> with the caveat that it's more complicated than this if the flush is a
> partial flush, and that we'll want to check that the ctx_id still
> matches, etc.
>
> Does this make sense?
Thanks for the detailed explanation. Let me check that I got it right.
You want to optimize cases in which:
1. A virtual machine
2. Which issues mtultiple (remote) TLB shootdowns
2. To remote vCPU which is preempted by the hypervisor
4. And unlike KVM, the hypervisor does not provide facilities for the VM to
know which vCPU is preempted, and atomically request TLB flush when the vCPU
is scheduled.
Right?
next prev parent reply other threads:[~2019-06-26 6:30 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-13 6:48 [PATCH 0/9] x86: Concurrent TLB flushes and other improvements Nadav Amit
2019-06-13 6:48 ` [PATCH 1/9] smp: Remove smp_call_function() and on_each_cpu() return values Nadav Amit
2019-06-23 12:32 ` [tip:smp/hotplug] " tip-bot for Nadav Amit
2019-06-13 6:48 ` [PATCH 2/9] smp: Run functions concurrently in smp_call_function_many() Nadav Amit
2019-06-13 6:48 ` [PATCH 3/9] x86/mm/tlb: Refactor common code into flush_tlb_on_cpus() Nadav Amit
2019-06-25 21:07 ` Dave Hansen
2019-06-26 1:57 ` Nadav Amit
2019-06-13 6:48 ` [PATCH 4/9] x86/mm/tlb: Flush remote and local TLBs concurrently Nadav Amit
2019-06-25 21:29 ` Dave Hansen
2019-06-26 2:35 ` Nadav Amit
2019-06-26 3:00 ` Dave Hansen
2019-06-26 3:32 ` Nadav Amit
2019-06-26 3:36 ` Andy Lutomirski
2019-06-26 3:48 ` Nadav Amit
2019-06-26 3:51 ` Andy Lutomirski
2019-06-13 6:48 ` [PATCH 5/9] x86/mm/tlb: Optimize local TLB flushes Nadav Amit
2019-06-25 21:36 ` Dave Hansen
2019-06-26 16:33 ` Andy Lutomirski
2019-06-26 16:39 ` Nadav Amit
2019-06-26 16:50 ` Andy Lutomirski
2019-06-13 6:48 ` [PATCH 6/9] KVM: x86: Provide paravirtualized flush_tlb_multi() Nadav Amit
2019-06-25 21:40 ` Dave Hansen
2019-06-26 2:39 ` Nadav Amit
2019-06-26 3:35 ` Andy Lutomirski
2019-06-26 3:41 ` Nadav Amit
2019-06-26 3:56 ` Andy Lutomirski
2019-06-26 6:30 ` Nadav Amit [this message]
2019-06-26 16:37 ` Andy Lutomirski
2019-06-26 17:41 ` Vitaly Kuznetsov
2019-06-26 18:21 ` Andy Lutomirski
2019-06-13 6:48 ` [PATCH 7/9] smp: Do not mark call_function_data as shared Nadav Amit
2019-06-23 12:31 ` [tip:smp/hotplug] " tip-bot for Nadav Amit
2019-06-13 6:48 ` [PATCH 8/9] x86/tlb: Privatize cpu_tlbstate Nadav Amit
2019-06-14 15:58 ` Sean Christopherson
2019-06-17 17:10 ` Nadav Amit
2019-06-25 21:52 ` Dave Hansen
2019-06-26 1:22 ` Nadav Amit
2019-06-26 3:57 ` Andy Lutomirski
2019-06-13 6:48 ` [PATCH 9/9] x86/apic: Use non-atomic operations when possible Nadav Amit
2019-06-23 12:16 ` [tip:x86/apic] " tip-bot for Nadav Amit
2019-06-25 21:58 ` [PATCH 9/9] " Dave Hansen
2019-06-25 22:03 ` Thomas Gleixner
2019-06-23 12:37 ` [PATCH 0/9] x86: Concurrent TLB flushes and other improvements Thomas Gleixner
2019-06-25 22:02 ` Dave Hansen
2019-06-26 1:34 ` Nadav Amit
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=A52332CE-80A2-4705-ABB0-3CDDB7AEC889@vmware.com \
--to=namit@vmware.com \
--cc=bp@alien8.de \
--cc=dave.hansen@intel.com \
--cc=dave.hansen@linux.intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mingo@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
/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
Powered by JetHome