From: Igor Mammedov <imammedo@redhat.com>
To: Vitaly Kuznetsov <vkuznets@redhat.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
kvm@vger.kernel.org, Wanpeng Li <wanpengli@tencent.com>,
Jim Mattson <jmattson@google.com>,
linux-kernel@vger.kernel.org,
Sean Christopherson <seanjc@google.com>
Subject: Re: [PATCH 2/2] KVM: x86: Forbid KVM_SET_CPUID{,2} after KVM_RUN
Date: Fri, 14 Jan 2022 12:22:37 +0100 [thread overview]
Message-ID: <20220114122237.54fa8c91@redhat.com> (raw)
In-Reply-To: <87ilummznd.fsf@redhat.com>
On Fri, 14 Jan 2022 10:31:50 +0100
Vitaly Kuznetsov <vkuznets@redhat.com> wrote:
> Igor Mammedov <imammedo@redhat.com> writes:
>
> > On Thu, 13 Jan 2022 22:33:38 +0000
> > Sean Christopherson <seanjc@google.com> wrote:
> >
> >> On Mon, Jan 03, 2022, Igor Mammedov wrote:
> >> > On Mon, 03 Jan 2022 09:04:29 +0100
> >> > Vitaly Kuznetsov <vkuznets@redhat.com> wrote:
> >> >
> >> > > Paolo Bonzini <pbonzini@redhat.com> writes:
> >> > >
> >> > > > On 12/27/21 18:32, Igor Mammedov wrote:
> >> > > >>> Tweaked and queued nevertheless, thanks.
> >> > > >> it seems this patch breaks VCPU hotplug, in scenario:
> >> > > >>
> >> > > >> 1. hotunplug existing VCPU (QEMU stores VCPU file descriptor in parked cpus list)
> >> > > >> 2. hotplug it again (unsuspecting QEMU reuses stored file descriptor when recreating VCPU)
> >> > > >>
> >> > > >> RHBZ:https://bugzilla.redhat.com/show_bug.cgi?id=2028337#c11
> >> > > >>
> >> > > >
> >> > > > The fix here would be (in QEMU) to not call KVM_SET_CPUID2 again.
> >> > > > However, we need to work around it in KVM, and allow KVM_SET_CPUID2 if
> >> > > > the data passed to the ioctl is the same that was set before.
> >> > >
> >> > > Are we sure the data is going to be *exactly* the same? In particular,
> >> > > when using vCPU fds from the parked list, do we keep the same
> >> > > APIC/x2APIC id when hotplugging? Or can we actually hotplug with a
> >> > > different id?
> >> >
> >> > If I recall it right, it can be a different ID easily.
> >>
> >> No, it cannot. KVM doesn't provide a way for userspace to change the APIC ID of
> >> a vCPU after the vCPU is created. x2APIC flat out disallows changing the APIC ID,
> >> and unless there's magic I'm missing, apic_mmio_write() => kvm_lapic_reg_write()
> >> is not reachable from userspace.
> >>
> >> The only way for userspace to set the APIC ID is to change vcpu->vcpu_id, and that
> >> can only be done at KVM_VCPU_CREATE.
> >>
> >> So, reusing a parked vCPU for hotplug must reuse the same APIC ID. QEMU handles
> >> this by stashing the vcpu_id, a.k.a. APIC ID, when parking a vCPU, and reuses a
> >> parked vCPU if and only if it has the same APIC ID. And because QEMU derives the
> >> APIC ID from topology, that means all the topology CPUID leafs must remain the
> >> same, otherwise the guest is hosed because it will send IPIs to the wrong vCPUs.
> >
> > Indeed, I was wrong.
> > I just checked all cpu unplug history in qemu. It was introduced in qemu-2.7
> > and from the very beginning it did stash vcpu_id,
> > so there is no old QEMU that would re-plug VCPU with different apic_id.
> > Though tells us nothing about what other userspace implementations might do.
> >
>
> The genie is out of the bottle already, 5.16 is released with the change
> (which was promissed for some time, KVM was complaining with
> pr_warn_ratelimited()). I'd be brave and say that if QEMU doesn't need
> it then nobody else does (out of curiosity, are there KVM VMMs besides
> QEMU which support CPU hotplug out there?).
>
> > However, a problem of failing KVM_SET_CPUID2 during VCPU re-plug
> > is still there and re-plug will fail if KVM rejects repeated KVM_SET_CPUID2
> > even if ioctl called with exactly the same CPUID leafs as the 1st call.
> >
>
> Assuming APIC id change doesn not need to be supported, I can send v2
> here with an empty allowlist.
As you mentioned in another thread black list would be better
to address Sean's concerns or just revert problematic commit.
next prev parent reply other threads:[~2022-01-14 11:22 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-22 17:58 [PATCH 0/2] KVM: x86: Forbid KVM_SET_CPUID{,2} after KVM_RUN Vitaly Kuznetsov
2021-11-22 17:58 ` [PATCH 1/2] KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test Vitaly Kuznetsov
2021-11-22 17:58 ` [PATCH 2/2] KVM: x86: Forbid KVM_SET_CPUID{,2} after KVM_RUN Vitaly Kuznetsov
2021-11-26 12:20 ` Paolo Bonzini
2021-12-27 17:32 ` Igor Mammedov
2022-01-02 17:31 ` Paolo Bonzini
2022-01-03 8:04 ` Vitaly Kuznetsov
2022-01-03 9:40 ` Igor Mammedov
2022-01-03 12:56 ` Vitaly Kuznetsov
2022-01-05 8:17 ` Igor Mammedov
2022-01-05 9:12 ` Vitaly Kuznetsov
2022-01-05 9:10 ` Paolo Bonzini
2022-01-05 10:09 ` Vitaly Kuznetsov
2022-01-07 9:02 ` Vitaly Kuznetsov
2022-01-07 18:15 ` Paolo Bonzini
2022-01-11 8:00 ` Igor Mammedov
2022-01-12 13:58 ` Vitaly Kuznetsov
2022-01-12 18:39 ` Paolo Bonzini
2022-01-13 9:27 ` Vitaly Kuznetsov
2022-01-13 14:28 ` Maxim Levitsky
2022-01-13 14:36 ` Vitaly Kuznetsov
2022-01-13 14:41 ` Maxim Levitsky
2022-01-13 14:59 ` Vitaly Kuznetsov
2022-01-13 16:26 ` Sean Christopherson
2022-01-13 16:30 ` Maxim Levitsky
2022-01-13 22:33 ` Sean Christopherson
2022-01-14 8:28 ` Maxim Levitsky
2022-01-14 16:08 ` Sean Christopherson
2022-01-14 8:55 ` Igor Mammedov
2022-01-14 9:31 ` Vitaly Kuznetsov
2022-01-14 11:22 ` Igor Mammedov [this message]
2022-01-14 12:25 ` Vitaly Kuznetsov
2022-01-14 17:00 ` Sean Christopherson
2022-01-17 9:55 ` Vitaly Kuznetsov
2022-01-17 11:20 ` Paolo Bonzini
2022-01-17 13:02 ` Vitaly Kuznetsov
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=20220114122237.54fa8c91@redhat.com \
--to=imammedo@redhat.com \
--cc=jmattson@google.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=seanjc@google.com \
--cc=vkuznets@redhat.com \
--cc=wanpengli@tencent.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;
as well as URLs for NNTP newsgroup(s).