From: Marc Zyngier <maz@kernel.org>
To: Joey Gouly <joey.gouly@arm.com>
Cc: kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org,
kvm@vger.kernel.org, James Morse <james.morse@arm.com>,
Suzuki K Poulose <suzuki.poulose@arm.com>,
Oliver Upton <oliver.upton@linux.dev>,
Zenghui Yu <yuzenghui@huawei.com>,
Xu Zhao <zhaoxu.35@bytedance.com>
Subject: Re: [PATCH 2/5] KVM: arm64: Build MPIDR to vcpu index cache at runtime
Date: Thu, 07 Sep 2023 19:15:38 +0100 [thread overview]
Message-ID: <8734zpq27p.wl-maz@kernel.org> (raw)
In-Reply-To: <20230907152918.GB69899@e124191.cambridge.arm.com>
On Thu, 07 Sep 2023 16:29:18 +0100,
Joey Gouly <joey.gouly@arm.com> wrote:
>
> On Thu, Sep 07, 2023 at 11:09:28AM +0100, Marc Zyngier wrote:
[...]
> > @@ -578,6 +579,57 @@ static int kvm_vcpu_initialized(struct kvm_vcpu *vcpu)
> > return vcpu_get_flag(vcpu, VCPU_INITIALIZED);
> > }
> >
> > +static void kvm_init_mpidr_data(struct kvm *kvm)
> > +{
> > + struct kvm_mpidr_data *data = NULL;
> > + unsigned long c, mask, nr_entries;
> > + u64 aff_set = 0, aff_clr = ~0UL;
> > + struct kvm_vcpu *vcpu;
> > +
> > + mutex_lock(&kvm->arch.config_lock);
> > +
> > + if (kvm->arch.mpidr_data || atomic_read(&kvm->online_vcpus) == 1)
> > + goto out;
> > +
> > + kvm_for_each_vcpu(c, vcpu, kvm) {
> > + u64 aff = kvm_vcpu_get_mpidr_aff(vcpu);
> > + aff_set |= aff;
> > + aff_clr &= aff;
> > + }
> > +
> > + /*
> > + * A significant bit can be either 0 or 1, and will only appear in
> > + * aff_set. Use aff_clr to weed out the useless stuff.
> > + */
> > + mask = aff_set ^ aff_clr;
> > + nr_entries = BIT_ULL(hweight_long(mask));
> > +
> > + /*
> > + * Don't let userspace fool us. If we need more than a single page
> > + * to describe the compressed MPIDR array, just fall back to the
> > + * iterative method. Single vcpu VMs do not need this either.
> > + */
> > + if (struct_size(data, cmpidr_to_idx, nr_entries) <= PAGE_SIZE)
> > + data = kzalloc(struct_size(data, cmpidr_to_idx, nr_entries),
> > + GFP_KERNEL_ACCOUNT);
> > +
> > + if (!data)
> > + goto out;
>
> Probably not a big deal, but if the data doesn't fit, every vCPU will run this
> function up until this point (if the data fits or there's only 1 vCPU we bail
> out earlier)
Yeah, I thought about that when writing this code, and applied the
following reasoning:
- this code is only run once per vcpu
- being able to remember that we cannot allocate the hash table
requires at least an extra flag or a special value for the pointer
- this sequence is pretty quick (one read/or/and * nr_vcpu^2), and
even if you have 512 vcpus, it isn't *that* much stuff given that it
is spread across vcpus
Now, if someone can actually measure a significant boot-time speed-up,
I'll happily add that flag.
[...]
> Reviewed-by: Joey Gouly <joey.gouly@arm.com>
Thanks!
M.
--
Without deviation from the norm, progress is not possible.
WARNING: multiple messages have this Message-ID (diff)
From: Marc Zyngier <maz@kernel.org>
To: Joey Gouly <joey.gouly@arm.com>
Cc: kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org,
kvm@vger.kernel.org, James Morse <james.morse@arm.com>,
Suzuki K Poulose <suzuki.poulose@arm.com>,
Oliver Upton <oliver.upton@linux.dev>,
Zenghui Yu <yuzenghui@huawei.com>,
Xu Zhao <zhaoxu.35@bytedance.com>
Subject: Re: [PATCH 2/5] KVM: arm64: Build MPIDR to vcpu index cache at runtime
Date: Thu, 07 Sep 2023 19:15:38 +0100 [thread overview]
Message-ID: <8734zpq27p.wl-maz@kernel.org> (raw)
In-Reply-To: <20230907152918.GB69899@e124191.cambridge.arm.com>
On Thu, 07 Sep 2023 16:29:18 +0100,
Joey Gouly <joey.gouly@arm.com> wrote:
>
> On Thu, Sep 07, 2023 at 11:09:28AM +0100, Marc Zyngier wrote:
[...]
> > @@ -578,6 +579,57 @@ static int kvm_vcpu_initialized(struct kvm_vcpu *vcpu)
> > return vcpu_get_flag(vcpu, VCPU_INITIALIZED);
> > }
> >
> > +static void kvm_init_mpidr_data(struct kvm *kvm)
> > +{
> > + struct kvm_mpidr_data *data = NULL;
> > + unsigned long c, mask, nr_entries;
> > + u64 aff_set = 0, aff_clr = ~0UL;
> > + struct kvm_vcpu *vcpu;
> > +
> > + mutex_lock(&kvm->arch.config_lock);
> > +
> > + if (kvm->arch.mpidr_data || atomic_read(&kvm->online_vcpus) == 1)
> > + goto out;
> > +
> > + kvm_for_each_vcpu(c, vcpu, kvm) {
> > + u64 aff = kvm_vcpu_get_mpidr_aff(vcpu);
> > + aff_set |= aff;
> > + aff_clr &= aff;
> > + }
> > +
> > + /*
> > + * A significant bit can be either 0 or 1, and will only appear in
> > + * aff_set. Use aff_clr to weed out the useless stuff.
> > + */
> > + mask = aff_set ^ aff_clr;
> > + nr_entries = BIT_ULL(hweight_long(mask));
> > +
> > + /*
> > + * Don't let userspace fool us. If we need more than a single page
> > + * to describe the compressed MPIDR array, just fall back to the
> > + * iterative method. Single vcpu VMs do not need this either.
> > + */
> > + if (struct_size(data, cmpidr_to_idx, nr_entries) <= PAGE_SIZE)
> > + data = kzalloc(struct_size(data, cmpidr_to_idx, nr_entries),
> > + GFP_KERNEL_ACCOUNT);
> > +
> > + if (!data)
> > + goto out;
>
> Probably not a big deal, but if the data doesn't fit, every vCPU will run this
> function up until this point (if the data fits or there's only 1 vCPU we bail
> out earlier)
Yeah, I thought about that when writing this code, and applied the
following reasoning:
- this code is only run once per vcpu
- being able to remember that we cannot allocate the hash table
requires at least an extra flag or a special value for the pointer
- this sequence is pretty quick (one read/or/and * nr_vcpu^2), and
even if you have 512 vcpus, it isn't *that* much stuff given that it
is spread across vcpus
Now, if someone can actually measure a significant boot-time speed-up,
I'll happily add that flag.
[...]
> Reviewed-by: Joey Gouly <joey.gouly@arm.com>
Thanks!
M.
--
Without deviation from the norm, progress is not possible.
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2023-09-07 18:15 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-07 10:09 [PATCH 0/5] KVM: arm64: Accelerate lookup of vcpus by MPIDR values Marc Zyngier
2023-09-07 10:09 ` Marc Zyngier
2023-09-07 10:09 ` [PATCH 1/5] KVM: arm64: Simplify kvm_vcpu_get_mpidr_aff() Marc Zyngier
2023-09-07 10:09 ` Marc Zyngier
2023-09-07 15:28 ` Joey Gouly
2023-09-07 15:28 ` Joey Gouly
2023-09-07 10:09 ` [PATCH 2/5] KVM: arm64: Build MPIDR to vcpu index cache at runtime Marc Zyngier
2023-09-07 10:09 ` Marc Zyngier
2023-09-07 15:29 ` Joey Gouly
2023-09-07 15:29 ` Joey Gouly
2023-09-07 18:15 ` Marc Zyngier [this message]
2023-09-07 18:15 ` Marc Zyngier
2023-09-07 10:09 ` [PATCH 3/5] KVM: arm64: Fast-track kvm_mpidr_to_vcpu() when mpidr_data is available Marc Zyngier
2023-09-07 10:09 ` Marc Zyngier
2023-09-07 15:29 ` Joey Gouly
2023-09-07 15:29 ` Joey Gouly
2023-09-07 10:09 ` [PATCH 4/5] KVM: arm64: vgic-v3: Refactor GICv3 SGI generation Marc Zyngier
2023-09-07 10:09 ` Marc Zyngier
2023-09-10 16:25 ` Zenghui Yu
2023-09-10 16:25 ` Zenghui Yu
2023-09-10 18:18 ` Marc Zyngier
2023-09-10 18:18 ` Marc Zyngier
2023-09-11 15:57 ` Zenghui Yu
2023-09-11 15:57 ` Zenghui Yu
2023-09-12 13:07 ` Marc Zyngier
2023-09-12 13:07 ` Marc Zyngier
2023-09-07 10:09 ` [PATCH 5/5] KVM: arm64: vgic-v3: Optimize affinity-based SGI injection Marc Zyngier
2023-09-07 10:09 ` Marc Zyngier
2023-09-07 15:30 ` [PATCH 0/5] KVM: arm64: Accelerate lookup of vcpus by MPIDR values Joey Gouly
2023-09-07 15:30 ` Joey Gouly
2023-09-07 18:17 ` Marc Zyngier
2023-09-07 18:17 ` Marc Zyngier
2023-09-07 20:27 ` Joey Gouly
2023-09-07 20:27 ` Joey Gouly
2023-09-08 7:21 ` Marc Zyngier
2023-09-08 7:21 ` Marc Zyngier
2023-09-11 15:01 ` Shameerali Kolothum Thodi
2023-09-11 15:01 ` Shameerali Kolothum Thodi
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=8734zpq27p.wl-maz@kernel.org \
--to=maz@kernel.org \
--cc=james.morse@arm.com \
--cc=joey.gouly@arm.com \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.linux.dev \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=oliver.upton@linux.dev \
--cc=suzuki.poulose@arm.com \
--cc=yuzenghui@huawei.com \
--cc=zhaoxu.35@bytedance.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.