From: Marc Zyngier <marc.zyngier@arm.com>
To: "Radim Krčmář" <rkrcmar@redhat.com>, "Alexander Graf" <agraf@suse.de>
Cc: linux-mips@linux-mips.org, linux-arm-kernel@lists.infradead.org,
kvm@vger.kernel.org, kvm-ppc@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org,
Christian Borntraeger <borntraeger@de.ibm.com>,
James Hogan <james.hogan@imgtec.com>,
Christoffer Dall <cdall@linaro.org>,
Paul Mackerras <paulus@ozlabs.org>,
Cornelia Huck <cohuck@redhat.com>,
David Hildenbrand <david@redhat.com>,
Paolo Bonzini <pbonzini@redhat.com>
Subject: Re: [PATCH RFC 0/2] KVM: use RCU to allow dynamic kvm->vcpus array
Date: Fri, 18 Aug 2017 15:22:18 +0100 [thread overview]
Message-ID: <5186b185-9db8-304d-25b9-20957fb9c545@arm.com> (raw)
In-Reply-To: <20170818141028.GG2566@flask>
On 18/08/17 15:10, Radim Krčmář wrote:
> 2017-08-17 21:17+0200, Alexander Graf:
>> On 17.08.17 16:54, Radim Krčmář wrote:
>>> 2017-08-17 09:04+0200, Alexander Graf:
>>>> What if we just sent a "vcpu move" request to all vcpus with the new pointer
>>>> after it moved? That way the vcpu thread itself would be responsible for the
>>>> migration to the new memory region. Only if all vcpus successfully moved,
>>>> keep rolling (and allow foreign get_vcpu again).
>>>
>>> I'm not sure if I understood this. You propose to cache kvm->vcpus in
>>> vcpu->vcpus and do an extensions of this,
>>>
>>> int vcpu_create(...) {
>>> if (resize_needed(kvm->vcpus)) {
>>> old_vcpus = kvm->vcpus
>>> kvm->vcpus = make_bigger(kvm->vcpus)
>>
>> if (kvm->vcpus != old_vcpus) :)
>>
>>> kvm_make_all_cpus_request(kvm, KVM_REQ_UPDATE_VCPUS)
>>
>> IIRC you'd need some manual bookkeeping to ensure that all users have
>> switched to the new array. Or set the KVM_REQUEST_WAIT flag :).
>
> Absolutely. I was thinking about synchronous execution, which might
> need extra work to expedite halted VCPUs. Letting the last user free it
> is plausible and would need more protection against races.
>
>>> free(old_vcpus)
>>> }
>>> vcpu->vcpus = kvm->vcpus
>>> }
>>>
>>> with added extra locking, (S)RCU, on accesses that do not come from
>>> VCPUs (irqfd and VM ioctl)?
>>
>> Well, in an ideal world we wouldn't have any users to vcpu structs outside
>> of the vcpus obviously. Every time we do, we should either reconsider
>> whether the design is smart and if we think it is, protect them accordingly.
>
> And there would be no linear access to all VCPUs. :)
>
> The main user of kvm->vcpus is kvm_for_each_vcpu(), which is well suited
> for a list, so we can change the design of kvm_for_each_vcpu() to use a
> list head in struct kvm_vcpu with head/tail in struct kvm.
> (The list is trivial to make lockless as we only append.)
>
> This would allow more flexibility with the remaining uses.
>
>> Maybe even hard code separate request mechanisms for the few cases where
>> it's reasonable?
>
> All non-kvm_for_each_vcpu() seem to need accesss outside of VCPU scope.
>
> We have few awkward accesses that can be handled keeping track of kvm
> state and all remaining uses need some kind of "int -> struct kvm_vcpu"
> mapping, where the integer is arbitrary.
>
> All users of kvm_get_vcpu_by_id() need a vcpu_id mapping, but hijack
> kvm->vcpus for O(1) access if lucky, with fallback to
> kvm_for_each_vcpu(). Adding a vcpu_id mapping seems reasonable.
>
> s390 __floating_irq_kick() and x86 kvm_irq_delivery_to_apic() are
> keeping a bitmap for kvm->vcpus indices. They want compact indices,
> which cannot be provided by vcpu_id mapping.
>
> I think that MIPS and ARM use the index in kvm->vcpus for userspace
> communication, which looks dangerous as userspace shouldn't know the
> position. Not much we can do because of that.
I think (at least for the ARM side) that we could switch whatever use we
have of the index to a vcpu_id. The worse offender (as far as I can
remember) is when injecting an interrupt, and that could be creatively
re-purposed to describe an affinity value in a backward compatible way.
Probably.
N,
--
Jazz is not dead. It just smells funny...
next prev parent reply other threads:[~2017-08-18 14:22 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-16 19:40 [PATCH RFC 0/2] KVM: use RCU to allow dynamic kvm->vcpus array Radim Krčmář
2017-08-16 19:40 ` [PATCH RFC 1/2] KVM: remove unused __KVM_HAVE_ARCH_VM_ALLOC Radim Krčmář
2017-08-21 13:48 ` Christian Borntraeger
2017-08-16 19:40 ` [PATCH RFC 2/2] KVM: RCU protected dynamic vcpus array Radim Krčmář
2017-08-17 8:07 ` Cornelia Huck
2017-08-17 11:14 ` David Hildenbrand
2017-08-17 16:50 ` Radim Krčmář
2017-08-17 16:54 ` Paolo Bonzini
2017-08-17 7:04 ` [PATCH RFC 0/2] KVM: use RCU to allow dynamic kvm->vcpus array Alexander Graf
2017-08-17 7:36 ` Cornelia Huck
2017-08-17 9:16 ` Paolo Bonzini
2017-08-17 9:28 ` Cornelia Huck
2017-08-17 9:44 ` Paolo Bonzini
2017-08-17 9:55 ` David Hildenbrand
2017-08-17 10:18 ` Paolo Bonzini
2017-08-17 10:20 ` David Hildenbrand
2017-08-17 10:23 ` Paolo Bonzini
2017-08-17 10:31 ` David Hildenbrand
2017-08-17 14:54 ` Radim Krčmář
2017-08-17 19:17 ` Alexander Graf
2017-08-18 14:10 ` Radim Krčmář
2017-08-18 14:22 ` Marc Zyngier [this message]
2017-08-17 7:29 ` David Hildenbrand
2017-08-17 7:37 ` Cornelia Huck
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=5186b185-9db8-304d-25b9-20957fb9c545@arm.com \
--to=marc.zyngier@arm.com \
--cc=agraf@suse.de \
--cc=borntraeger@de.ibm.com \
--cc=cdall@linaro.org \
--cc=cohuck@redhat.com \
--cc=david@redhat.com \
--cc=james.hogan@imgtec.com \
--cc=kvm-ppc@vger.kernel.org \
--cc=kvm@vger.kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mips@linux-mips.org \
--cc=linux-s390@vger.kernel.org \
--cc=paulus@ozlabs.org \
--cc=pbonzini@redhat.com \
--cc=rkrcmar@redhat.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