From: Paolo Bonzini <pbonzini@redhat.com>
To: "Radim Krčmář" <rkrcmar@redhat.com>, "Feng Wu" <feng.wu@intel.com>
Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] KVM: x86: Add lowest-priority support for vt-d posted-interrupts
Date: Tue, 17 Nov 2015 10:41:25 +0100 [thread overview]
Message-ID: <564AF645.5010506@redhat.com> (raw)
In-Reply-To: <20151116190314.GA12245@potion.brq.redhat.com>
On 16/11/2015 20:03, Radim Krčmář wrote:
> 2015-11-09 10:46+0800, Feng Wu:
>> Use vector-hashing to handle lowest-priority interrupts for
>> posted-interrupts. As an example, modern Intel CPUs use this
>> method to handle lowest-priority interrupts.
>
> (I don't think it's a good idea that the algorithm differs from non-PI
> lowest priority delivery. I'd make them both vector-hashing, which
> would be "fun" to explain to people expecting round robin ...)
Yup, I would make it a module option. Thanks very much Radim for
helping with the review.
Paolo
>> Signed-off-by: Feng Wu <feng.wu@intel.com>
>> ---
>> diff --git a/arch/x86/kvm/irq_comm.c b/arch/x86/kvm/irq_comm.c
>> +/*
>> + * This routine handles lowest-priority interrupts using vector-hashing
>> + * mechanism. As an example, modern Intel CPUs use this method to handle
>> + * lowest-priority interrupts.
>> + *
>> + * Here is the details about the vector-hashing mechanism:
>> + * 1. For lowest-priority interrupts, store all the possible destination
>> + * vCPUs in an array.
>> + * 2. Use "guest vector % max number of destination vCPUs" to find the right
>> + * destination vCPU in the array for the lowest-priority interrupt.
>> + */
>
> (Is Skylake i7-6700 a modern Intel CPU?
> I didn't manage to get hashing ... all interrupts always went to the
> lowest APIC ID in the set :/
> Is there a simple way to verify the algorithm?)
>
>> +struct kvm_vcpu *kvm_intr_vector_hashing_dest(struct kvm *kvm,
>> + struct kvm_lapic_irq *irq)
>> +
>> +{
>> + unsigned long dest_vcpu_bitmap[BITS_TO_LONGS(KVM_MAX_VCPUS)];
>> + unsigned int dest_vcpus = 0;
>> + struct kvm_vcpu *vcpu;
>> + unsigned int i, mod, idx = 0;
>> +
>> + vcpu = kvm_intr_vector_hashing_dest_fast(kvm, irq);
>> + if (vcpu)
>> + return vcpu;
>
> I think the rest of this function shouldn't be implemented:
> - Shorthands are only for IPIs and hence don't need to be handled,
> - Lowest priority physical broadcast is not supported,
> - Lowest priority cluster logical broadcast is not supported,
> - No point in optimizing mixed xAPIC and x2APIC mode,
> - The rest is handled by kvm_intr_vector_hashing_dest_fast().
> (Even lowest priority flat logical "broadcast".)
> - We do the work twice when vcpu == NULL means that there is no
> matching destination.
>
> Is there a valid case that can be resolved by going through all vcpus?
>
>> +
>> + memset(dest_vcpu_bitmap, 0, sizeof(dest_vcpu_bitmap));
>> +
>> + kvm_for_each_vcpu(i, vcpu, kvm) {
>> + if (!kvm_apic_present(vcpu))
>> + continue;
>> +
>> + if (!kvm_apic_match_dest(vcpu, NULL, irq->shorthand,
>> + irq->dest_id, irq->dest_mode))
>> + continue;
>> +
>> + __set_bit(vcpu->vcpu_id, dest_vcpu_bitmap);
>> + dest_vcpus++;
>> + }
>> +
>> + if (dest_vcpus == 0)
>> + return NULL;
>> +
>> + mod = irq->vector % dest_vcpus;
>> +
>> + for (i = 0; i <= mod; i++) {
>> + idx = find_next_bit(dest_vcpu_bitmap, KVM_MAX_VCPUS, idx) + 1;
>> + BUG_ON(idx >= KVM_MAX_VCPUS);
>> + }
>> +
>> + return kvm_get_vcpu(kvm, idx - 1);
>> +}
>> +EXPORT_SYMBOL_GPL(kvm_intr_vector_hashing_dest);
>> +
>> diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
>> @@ -816,6 +816,63 @@ out:
>> +struct kvm_vcpu *kvm_intr_vector_hashing_dest_fast(struct kvm *kvm,
>> + struct kvm_lapic_irq *irq)
>
> We now have three very similar functions :(
>
> kvm_irq_delivery_to_apic_fast
> kvm_intr_is_single_vcpu_fast
> kvm_intr_vector_hashing_dest_fast
>
> By utilizing the gcc optimizer, they can be merged without introducing
> many instructions to the hot path, kvm_irq_delivery_to_apic_fast.
> (I would eventually do it, so you can save time by ignoring this.)
>
> Thanks.
>
next prev parent reply other threads:[~2015-11-17 9:41 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-09 2:46 [PATCH] KVM: x86: Add lowest-priority support for vt-d posted-interrupts Feng Wu
2015-11-16 6:18 ` Wu, Feng
2015-11-16 19:03 ` Radim Krčmář
2015-11-17 9:41 ` Paolo Bonzini [this message]
2015-11-24 1:26 ` Wu, Feng
2015-11-24 1:26 ` Wu, Feng
2015-11-24 14:35 ` Radim Krcmár
2015-11-24 14:38 ` Paolo Bonzini
2015-11-25 1:58 ` Wu, Feng
2015-11-25 1:58 ` Wu, Feng
2015-11-25 11:32 ` Paolo Bonzini
2015-11-24 1:26 ` Wu, Feng
2015-11-24 14:31 ` Radim Krčmář
2015-11-24 14:44 ` Radim Krčmář
2015-11-25 3:21 ` Wu, Feng
2015-11-25 14:12 ` Radim Krcmár
2015-11-25 14:38 ` Paolo Bonzini
2015-11-25 15:43 ` Radim Krčmář
2015-11-26 6:24 ` Wu, Feng
2015-11-26 6:24 ` Wu, Feng
2015-11-26 14:03 ` Radim Krcmár
2015-12-09 8:19 ` Wu, Feng
2015-12-09 14:53 ` Radim Krčmář
2015-12-10 1:52 ` Wu, Feng
2015-12-10 1:52 ` Wu, Feng
2015-12-11 14:37 ` Radim Krcmár
2015-12-15 1:52 ` Wu, Feng
2015-12-15 1:52 ` Wu, Feng
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=564AF645.5010506@redhat.com \
--to=pbonzini@redhat.com \
--cc=feng.wu@intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--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 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.