From: rkrcmar@redhat.com (Radim Krčmář)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH RFC 2/2] KVM: RCU protected dynamic vcpus array
Date: Thu, 17 Aug 2017 18:50:44 +0200 [thread overview]
Message-ID: <20170817165044.GF2566@flask> (raw)
In-Reply-To: <7cb42373-355c-7cb3-2979-9529aef0641c@redhat.com>
2017-08-17 13:14+0200, David Hildenbrand:
> > atomic_set(&kvm->online_vcpus, 0);
> > mutex_unlock(&kvm->lock);
> > diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
> > index c8df733eed41..eb9fb5b493ac 100644
> > --- a/include/linux/kvm_host.h
> > +++ b/include/linux/kvm_host.h
> > @@ -386,12 +386,17 @@ struct kvm_memslots {
> > int used_slots;
> > };
> >
> > +struct kvm_vcpus {
> > + u32 online;
> > + struct kvm_vcpu *array[];
>
> On option could be to simply chunk it:
>
> +struct kvm_vcpus {
> + struct kvm_vcpu vcpus[32];
I'm thinking of 128/256.
> +};
> +
> /*
> * Note:
> * memslots are not sorted by id anymore, please use id_to_memslot()
> @@ -391,7 +395,7 @@ struct kvm {
> struct mutex slots_lock;
> struct mm_struct *mm; /* userspace tied to this vm */
> struct kvm_memslots __rcu *memslots[KVM_ADDRESS_SPACE_NUM];
> - struct kvm_vcpu *vcpus[KVM_MAX_VCPUS];
> + struct kvm_vcpus vcpus[(KVM_MAX_VCPUS + 31) / 32];
> /*
> * created_vcpus is protected by kvm->lock, and is incremented
> @@ -483,12 +487,14 @@ static inline struct kvm_io_bus
> *kvm_get_bus(struct kvm *kvm, enum kvm_bus idx)
>
>
> 1. make nobody access kvm->vcpus directly (factor out)
> 2. allocate next chunk if necessary when creating a VCPU and store
> pointer using WRITE_ONCE
> 3. use READ_ONCE to test for availability of the current chunk
We can also use kvm->online_vcpus exactly like we did now.
> kvm_for_each_vcpu just has to use READ_ONCE to access/test for the right
> chunk. Pointers never get invalid. No RCU needed. Sleeping in the loop
> is possible.
I like this better than SRCU because it keeps the internal code mostly
intact, even though it is compromise solution with a tunable.
(SRCU gives us more protection than we need.)
It is very similar to (3). Chunks will usually take memory and have
slower access to the first chunk than an extendable list would, but is
faster from the third chunk, which is a reasonable deal.
We are just postponing the problem until a higher number of VCPUs, but
then we can extend it into more levels using the same principle and I
think it will still get a better trade-offs than SRCU.
I'd do this for v2,
thanks.
next prev parent reply other threads:[~2017-08-17 16:50 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ář [this message]
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
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=20170817165044.GF2566@flask \
--to=rkrcmar@redhat.com \
--cc=linux-arm-kernel@lists.infradead.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;
as well as URLs for NNTP newsgroup(s).