diff options
Diffstat (limited to 'virt/kvm/ioapic.c')
| -rw-r--r-- | virt/kvm/ioapic.c | 37 | 
1 files changed, 19 insertions, 18 deletions
diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c index ef61d529a6c..cfb7e4d52dc 100644 --- a/virt/kvm/ioapic.c +++ b/virt/kvm/ioapic.c @@ -197,28 +197,29 @@ int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int irq_source_id,  	u32 old_irr;  	u32 mask = 1 << irq;  	union kvm_ioapic_redirect_entry entry; -	int ret = 1; +	int ret, irq_level; + +	BUG_ON(irq < 0 || irq >= IOAPIC_NUM_PINS);  	spin_lock(&ioapic->lock);  	old_irr = ioapic->irr; -	if (irq >= 0 && irq < IOAPIC_NUM_PINS) { -		int irq_level = __kvm_irq_line_state(&ioapic->irq_states[irq], -						     irq_source_id, level); -		entry = ioapic->redirtbl[irq]; -		irq_level ^= entry.fields.polarity; -		if (!irq_level) -			ioapic->irr &= ~mask; -		else { -			int edge = (entry.fields.trig_mode == IOAPIC_EDGE_TRIG); -			ioapic->irr |= mask; -			if ((edge && old_irr != ioapic->irr) || -			    (!edge && !entry.fields.remote_irr)) -				ret = ioapic_service(ioapic, irq); -			else -				ret = 0; /* report coalesced interrupt */ -		} -		trace_kvm_ioapic_set_irq(entry.bits, irq, ret == 0); +	irq_level = __kvm_irq_line_state(&ioapic->irq_states[irq], +					 irq_source_id, level); +	entry = ioapic->redirtbl[irq]; +	irq_level ^= entry.fields.polarity; +	if (!irq_level) { +		ioapic->irr &= ~mask; +		ret = 1; +	} else { +		int edge = (entry.fields.trig_mode == IOAPIC_EDGE_TRIG); +		ioapic->irr |= mask; +		if ((edge && old_irr != ioapic->irr) || +		    (!edge && !entry.fields.remote_irr)) +			ret = ioapic_service(ioapic, irq); +		else +			ret = 0; /* report coalesced interrupt */  	} +	trace_kvm_ioapic_set_irq(entry.bits, irq, ret == 0);  	spin_unlock(&ioapic->lock);  	return ret;  |