On Fri, Mar 22, 2013 at 07:50:11AM +0000, Zhang, Yang Z wrote: > Gleb Natapov wrote on 2013-03-22: > > On Fri, Mar 22, 2013 at 01:24:02PM +0800, Yang Zhang wrote: > >> From: Yang Zhang <yang.z.zhang@xxxxxxxxx> > >> > >> Add a new parameter to know vcpus who received the interrupt. > >> > >> Signed-off-by: Yang Zhang <yang.z.zhang@xxxxxxxxx> > >> --- > >> arch/x86/kvm/lapic.c | 25 ++++++++++++++++--------- > >> arch/x86/kvm/lapic.h | 5 +++-- > >> virt/kvm/ioapic.c | 2 +- > >> virt/kvm/ioapic.h | 2 +- > >> virt/kvm/irq_comm.c | 12 ++++++------ > >> 5 files changed, 27 insertions(+), 19 deletions(-) > >> diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c > >> index d3e322a..d7915a1 100644 > >> --- a/arch/x86/kvm/lapic.c > >> +++ b/arch/x86/kvm/lapic.c > >> @@ -431,14 +431,16 @@ int kvm_lapic_find_highest_irr(struct kvm_vcpu > > *vcpu) > >> } > >> > >> static int __apic_accept_irq(struct kvm_lapic *apic, int delivery_mode, > >> - int vector, int level, int trig_mode); > >> + int vector, int level, int trig_mode, > >> + unsigned long *dest_map); > >> > >> -int kvm_apic_set_irq(struct kvm_vcpu *vcpu, struct kvm_lapic_irq *irq) > >> +int kvm_apic_set_irq(struct kvm_vcpu *vcpu, struct kvm_lapic_irq *irq, > >> + unsigned long *dest_map) > >> { > >> struct kvm_lapic *apic = vcpu->arch.apic; > >> > >> return __apic_accept_irq(apic, irq->delivery_mode, irq->vector, > >> - irq->level, irq->trig_mode); > >> + irq->level, irq->trig_mode, dest_map); > >> } > >> > >> static int pv_eoi_put_user(struct kvm_vcpu *vcpu, u8 val) > >> @@ -611,7 +613,7 @@ int kvm_apic_match_dest(struct kvm_vcpu *vcpu, > > struct kvm_lapic *source, > >> } > >> > >> bool kvm_irq_delivery_to_apic_fast(struct kvm *kvm, struct kvm_lapic *src, > >> - struct kvm_lapic_irq *irq, int *r) > >> + struct kvm_lapic_irq *irq, int *r, unsigned long *dest_map) > >> { > >> struct kvm_apic_map *map; > >> unsigned long bitmap = 1; > >> @@ -622,7 +624,7 @@ bool kvm_irq_delivery_to_apic_fast(struct kvm *kvm, > > struct kvm_lapic *src, > >> *r = -1; > >> > >> if (irq->shorthand == APIC_DEST_SELF) { > >> - *r = kvm_apic_set_irq(src->vcpu, irq); > >> + *r = kvm_apic_set_irq(src->vcpu, irq, dest_map); > >> return true; > >> } > >> @@ -667,7 +669,7 @@ bool kvm_irq_delivery_to_apic_fast(struct kvm *kvm, > > struct kvm_lapic *src, > >> continue; > >> if (*r < 0) > >> *r = 0; > >> - *r += kvm_apic_set_irq(dst[i]->vcpu, irq); > >> + *r += kvm_apic_set_irq(dst[i]->vcpu, irq, dest_map); > >> } > >> > >> ret = true; > >> @@ -681,7 +683,8 @@ out: > >> * Return 1 if successfully added and 0 if discarded. > >> */ > >> static int __apic_accept_irq(struct kvm_lapic *apic, int delivery_mode, > >> - int vector, int level, int trig_mode) > >> + int vector, int level, int trig_mode, > >> + unsigned long *dest_map) > >> { > >> int result = 0; > >> struct kvm_vcpu *vcpu = apic->vcpu; > >> @@ -694,6 +697,9 @@ static int __apic_accept_irq(struct kvm_lapic *apic, int > > delivery_mode, > >> if (unlikely(!apic_enabled(apic))) > >> break; > >> + if (dest_map) > >> + set_bit(vcpu->vcpu_id, dest_map); > >> + > > __set_bit() > no, __apic_accept_irq() may be called to deliver interrupt from IOAPIC and LAPIC interrupt. > Though the dest_map is only used by RTC interrupt now, it may be use by LAPIC interrupt in future. So it's better to use set_bit not __set_bit. It is a caller responsibility to not provide pointer to the same memory to concurrent function invocations. -- Gleb. -- 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