On 10/11/2011 08:38 PM, Michael S. Tsirkin wrote: > To forward an interrupt to a vcpu that runs on > a host cpu different from the current one, > we need an ipi which likely will cost us as much > as delivering the interrupt directly to that cpu would. > > Set irq affinity hint to point there, irq balancer > can then take this into accound and balance > interrupts accordingly. > > > +static void kvm_vcpu_host_irq_hint(struct kvm_vcpu *vcpu, int host_irq) > +{ > + const struct cpumask *mask; > + /* raw_smp_processor_id() is ok here: if we get preempted we can get a > + * wrong value but we don't mind much. */ > + if (host_irq >= 0 && unlikely(vcpu->cpu != raw_smp_processor_id())) { > + mask = get_cpu_mask(vcpu->cpu); > + irq_set_affinity_hint(host_irq, mask); > + } > +} > + > int kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src, > struct kvm_lapic_irq *irq, int host_irq) > { > @@ -102,6 +114,7 @@ int kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src, > if (r < 0) > r = 0; > r += kvm_apic_set_irq(vcpu, irq); > + kvm_vcpu_host_irq_hint(vcpu, host_irq); Doing this every time seems excessive. How about doing it every N interrupts? We can even collect information about which vcpus were targeted, and then use a mask instead of just one vcpu. -- error compiling committee.c: too many arguments to function -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html