diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-07-24 15:01:20 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-07-24 15:01:20 -0400 |
commit | 5fecc9d8f59e765c2a48379dd7c6f5cf88c7d75a (patch) | |
tree | d1fc25d9650d3ac24591bba6f5e2e7a1afc54796 /virt/kvm/ioapic.c | |
parent | 3c4cfadef6a1665d9cd02a543782d03d3e6740c6 (diff) | |
parent | 1a577b72475d161b6677c05abe57301362023bb2 (diff) |
Merge tag 'kvm-3.6-1' of git://git.kernel.org/pub/scm/virt/kvm/kvm
Pull KVM updates from Avi Kivity:
"Highlights include
- full big real mode emulation on pre-Westmere Intel hosts (can be
disabled with emulate_invalid_guest_state=0)
- relatively small ppc and s390 updates
- PCID/INVPCID support in guests
- EOI avoidance; 3.6 guests should perform better on 3.6 hosts on
interrupt intensive workloads)
- Lockless write faults during live migration
- EPT accessed/dirty bits support for new Intel processors"
Fix up conflicts in:
- Documentation/virtual/kvm/api.txt:
Stupid subchapter numbering, added next to each other.
- arch/powerpc/kvm/booke_interrupts.S:
PPC asm changes clashing with the KVM fixes
- arch/s390/include/asm/sigp.h, arch/s390/kvm/sigp.c:
Duplicated commits through the kvm tree and the s390 tree, with
subsequent edits in the KVM tree.
* tag 'kvm-3.6-1' of git://git.kernel.org/pub/scm/virt/kvm/kvm: (93 commits)
KVM: fix race with level interrupts
x86, hyper: fix build with !CONFIG_KVM_GUEST
Revert "apic: fix kvm build on UP without IOAPIC"
KVM guest: switch to apic_set_eoi_write, apic_write
apic: add apic_set_eoi_write for PV use
KVM: VMX: Implement PCID/INVPCID for guests with EPT
KVM: Add x86_hyper_kvm to complete detect_hypervisor_platform check
KVM: PPC: Critical interrupt emulation support
KVM: PPC: e500mc: Fix tlbilx emulation for 64-bit guests
KVM: PPC64: booke: Set interrupt computation mode for 64-bit host
KVM: PPC: bookehv: Add ESR flag to Data Storage Interrupt
KVM: PPC: bookehv64: Add support for std/ld emulation.
booke: Added crit/mc exception handler for e500v2
booke/bookehv: Add host crit-watchdog exception support
KVM: MMU: document mmu-lock and fast page fault
KVM: MMU: fix kvm_mmu_pagetable_walk tracepoint
KVM: MMU: trace fast page fault
KVM: MMU: fast path of handling guest page fault
KVM: MMU: introduce SPTE_MMU_WRITEABLE bit
KVM: MMU: fold tlb flush judgement into mmu_spte_update
...
Diffstat (limited to 'virt/kvm/ioapic.c')
-rw-r--r-- | virt/kvm/ioapic.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c index 26fd54dc459e..ef61d529a6c4 100644 --- a/virt/kvm/ioapic.c +++ b/virt/kvm/ioapic.c | |||
@@ -191,7 +191,8 @@ static int ioapic_deliver(struct kvm_ioapic *ioapic, int irq) | |||
191 | return kvm_irq_delivery_to_apic(ioapic->kvm, NULL, &irqe); | 191 | return kvm_irq_delivery_to_apic(ioapic->kvm, NULL, &irqe); |
192 | } | 192 | } |
193 | 193 | ||
194 | int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int level) | 194 | int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int irq_source_id, |
195 | int level) | ||
195 | { | 196 | { |
196 | u32 old_irr; | 197 | u32 old_irr; |
197 | u32 mask = 1 << irq; | 198 | u32 mask = 1 << irq; |
@@ -201,9 +202,11 @@ int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int level) | |||
201 | spin_lock(&ioapic->lock); | 202 | spin_lock(&ioapic->lock); |
202 | old_irr = ioapic->irr; | 203 | old_irr = ioapic->irr; |
203 | if (irq >= 0 && irq < IOAPIC_NUM_PINS) { | 204 | if (irq >= 0 && irq < IOAPIC_NUM_PINS) { |
205 | int irq_level = __kvm_irq_line_state(&ioapic->irq_states[irq], | ||
206 | irq_source_id, level); | ||
204 | entry = ioapic->redirtbl[irq]; | 207 | entry = ioapic->redirtbl[irq]; |
205 | level ^= entry.fields.polarity; | 208 | irq_level ^= entry.fields.polarity; |
206 | if (!level) | 209 | if (!irq_level) |
207 | ioapic->irr &= ~mask; | 210 | ioapic->irr &= ~mask; |
208 | else { | 211 | else { |
209 | int edge = (entry.fields.trig_mode == IOAPIC_EDGE_TRIG); | 212 | int edge = (entry.fields.trig_mode == IOAPIC_EDGE_TRIG); |
@@ -221,6 +224,16 @@ int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int level) | |||
221 | return ret; | 224 | return ret; |
222 | } | 225 | } |
223 | 226 | ||
227 | void kvm_ioapic_clear_all(struct kvm_ioapic *ioapic, int irq_source_id) | ||
228 | { | ||
229 | int i; | ||
230 | |||
231 | spin_lock(&ioapic->lock); | ||
232 | for (i = 0; i < KVM_IOAPIC_NUM_PINS; i++) | ||
233 | __clear_bit(irq_source_id, &ioapic->irq_states[i]); | ||
234 | spin_unlock(&ioapic->lock); | ||
235 | } | ||
236 | |||
224 | static void __kvm_ioapic_update_eoi(struct kvm_ioapic *ioapic, int vector, | 237 | static void __kvm_ioapic_update_eoi(struct kvm_ioapic *ioapic, int vector, |
225 | int trigger_mode) | 238 | int trigger_mode) |
226 | { | 239 | { |