KVM: Separate irq ack notification out of arch/x86/kvm/irq.c
Moving irq ack notification logic as common, and make it shared with ia64 side. Signed-off-by: Xiantao Zhang <xiantao.zhang@intel.com> Signed-off-by: Avi Kivity <avi@qumranet.com>
This commit is contained in:
parent
c77fb9dc7a
commit
3de42dc094
|
@ -413,6 +413,10 @@ struct kvm_arch {
|
||||||
struct kvm_ioapic *vioapic;
|
struct kvm_ioapic *vioapic;
|
||||||
struct kvm_vm_stat stat;
|
struct kvm_vm_stat stat;
|
||||||
struct kvm_sal_data rdv_sal_data;
|
struct kvm_sal_data rdv_sal_data;
|
||||||
|
|
||||||
|
struct list_head assigned_dev_head;
|
||||||
|
struct dmar_domain *intel_iommu_domain;
|
||||||
|
struct hlist_head irq_ack_notifier_list;
|
||||||
};
|
};
|
||||||
|
|
||||||
union cpuid3_t {
|
union cpuid3_t {
|
||||||
|
|
|
@ -44,7 +44,7 @@ EXTRA_CFLAGS += -Ivirt/kvm -Iarch/ia64/kvm/
|
||||||
EXTRA_AFLAGS += -Ivirt/kvm -Iarch/ia64/kvm/
|
EXTRA_AFLAGS += -Ivirt/kvm -Iarch/ia64/kvm/
|
||||||
|
|
||||||
common-objs = $(addprefix ../../../virt/kvm/, kvm_main.o ioapic.o \
|
common-objs = $(addprefix ../../../virt/kvm/, kvm_main.o ioapic.o \
|
||||||
coalesced_mmio.o)
|
coalesced_mmio.o irq_comm.o)
|
||||||
|
|
||||||
kvm-objs := $(common-objs) kvm-ia64.o kvm_fw.o
|
kvm-objs := $(common-objs) kvm-ia64.o kvm_fw.o
|
||||||
obj-$(CONFIG_KVM) += kvm.o
|
obj-$(CONFIG_KVM) += kvm.o
|
||||||
|
|
|
@ -23,10 +23,5 @@
|
||||||
#ifndef __IRQ_H
|
#ifndef __IRQ_H
|
||||||
#define __IRQ_H
|
#define __IRQ_H
|
||||||
|
|
||||||
struct kvm;
|
|
||||||
|
|
||||||
static inline void kvm_notify_acked_irq(struct kvm *kvm, unsigned gsi)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
common-objs = $(addprefix ../../../virt/kvm/, kvm_main.o ioapic.o \
|
common-objs = $(addprefix ../../../virt/kvm/, kvm_main.o ioapic.o \
|
||||||
coalesced_mmio.o)
|
coalesced_mmio.o irq_comm.o)
|
||||||
ifeq ($(CONFIG_KVM_TRACE),y)
|
ifeq ($(CONFIG_KVM_TRACE),y)
|
||||||
common-objs += $(addprefix ../../../virt/kvm/, kvm_trace.o)
|
common-objs += $(addprefix ../../../virt/kvm/, kvm_trace.o)
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -99,36 +99,3 @@ void __kvm_migrate_timers(struct kvm_vcpu *vcpu)
|
||||||
__kvm_migrate_apic_timer(vcpu);
|
__kvm_migrate_apic_timer(vcpu);
|
||||||
__kvm_migrate_pit_timer(vcpu);
|
__kvm_migrate_pit_timer(vcpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This should be called with the kvm->lock mutex held */
|
|
||||||
void kvm_set_irq(struct kvm *kvm, int irq, int level)
|
|
||||||
{
|
|
||||||
/* Not possible to detect if the guest uses the PIC or the
|
|
||||||
* IOAPIC. So set the bit in both. The guest will ignore
|
|
||||||
* writes to the unused one.
|
|
||||||
*/
|
|
||||||
kvm_ioapic_set_irq(kvm->arch.vioapic, irq, level);
|
|
||||||
kvm_pic_set_irq(pic_irqchip(kvm), irq, level);
|
|
||||||
}
|
|
||||||
|
|
||||||
void kvm_notify_acked_irq(struct kvm *kvm, unsigned gsi)
|
|
||||||
{
|
|
||||||
struct kvm_irq_ack_notifier *kian;
|
|
||||||
struct hlist_node *n;
|
|
||||||
|
|
||||||
hlist_for_each_entry(kian, n, &kvm->arch.irq_ack_notifier_list, link)
|
|
||||||
if (kian->gsi == gsi)
|
|
||||||
kian->irq_acked(kian);
|
|
||||||
}
|
|
||||||
|
|
||||||
void kvm_register_irq_ack_notifier(struct kvm *kvm,
|
|
||||||
struct kvm_irq_ack_notifier *kian)
|
|
||||||
{
|
|
||||||
hlist_add_head(&kian->link, &kvm->arch.irq_ack_notifier_list);
|
|
||||||
}
|
|
||||||
|
|
||||||
void kvm_unregister_irq_ack_notifier(struct kvm *kvm,
|
|
||||||
struct kvm_irq_ack_notifier *kian)
|
|
||||||
{
|
|
||||||
hlist_del(&kian->link);
|
|
||||||
}
|
|
||||||
|
|
|
@ -68,7 +68,6 @@ struct kvm_pic {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct kvm_pic *kvm_create_pic(struct kvm *kvm);
|
struct kvm_pic *kvm_create_pic(struct kvm *kvm);
|
||||||
void kvm_pic_set_irq(void *opaque, int irq, int level);
|
|
||||||
int kvm_pic_read_irq(struct kvm *kvm);
|
int kvm_pic_read_irq(struct kvm *kvm);
|
||||||
void kvm_pic_update_irq(struct kvm_pic *s);
|
void kvm_pic_update_irq(struct kvm_pic *s);
|
||||||
void kvm_pic_clear_isr_ack(struct kvm *kvm);
|
void kvm_pic_clear_isr_ack(struct kvm *kvm);
|
||||||
|
@ -85,13 +84,6 @@ static inline int irqchip_in_kernel(struct kvm *kvm)
|
||||||
|
|
||||||
void kvm_pic_reset(struct kvm_kpic_state *s);
|
void kvm_pic_reset(struct kvm_kpic_state *s);
|
||||||
|
|
||||||
void kvm_set_irq(struct kvm *kvm, int irq, int level);
|
|
||||||
void kvm_notify_acked_irq(struct kvm *kvm, unsigned gsi);
|
|
||||||
void kvm_register_irq_ack_notifier(struct kvm *kvm,
|
|
||||||
struct kvm_irq_ack_notifier *kian);
|
|
||||||
void kvm_unregister_irq_ack_notifier(struct kvm *kvm,
|
|
||||||
struct kvm_irq_ack_notifier *kian);
|
|
||||||
|
|
||||||
void kvm_timer_intr_post(struct kvm_vcpu *vcpu, int vec);
|
void kvm_timer_intr_post(struct kvm_vcpu *vcpu, int vec);
|
||||||
void kvm_inject_pending_timer_irqs(struct kvm_vcpu *vcpu);
|
void kvm_inject_pending_timer_irqs(struct kvm_vcpu *vcpu);
|
||||||
void kvm_inject_apic_timer_irqs(struct kvm_vcpu *vcpu);
|
void kvm_inject_apic_timer_irqs(struct kvm_vcpu *vcpu);
|
||||||
|
|
|
@ -565,6 +565,8 @@ void kvm_queue_exception_e(struct kvm_vcpu *vcpu, unsigned nr, u32 error_code);
|
||||||
void kvm_inject_page_fault(struct kvm_vcpu *vcpu, unsigned long cr2,
|
void kvm_inject_page_fault(struct kvm_vcpu *vcpu, unsigned long cr2,
|
||||||
u32 error_code);
|
u32 error_code);
|
||||||
|
|
||||||
|
void kvm_pic_set_irq(void *opaque, int irq, int level);
|
||||||
|
|
||||||
void kvm_inject_nmi(struct kvm_vcpu *vcpu);
|
void kvm_inject_nmi(struct kvm_vcpu *vcpu);
|
||||||
|
|
||||||
void fx_init(struct kvm_vcpu *vcpu);
|
void fx_init(struct kvm_vcpu *vcpu);
|
||||||
|
|
|
@ -309,6 +309,12 @@ struct kvm_assigned_dev_kernel {
|
||||||
struct pci_dev *dev;
|
struct pci_dev *dev;
|
||||||
struct kvm *kvm;
|
struct kvm *kvm;
|
||||||
};
|
};
|
||||||
|
void kvm_set_irq(struct kvm *kvm, int irq, int level);
|
||||||
|
void kvm_notify_acked_irq(struct kvm *kvm, unsigned gsi);
|
||||||
|
void kvm_register_irq_ack_notifier(struct kvm *kvm,
|
||||||
|
struct kvm_irq_ack_notifier *kian);
|
||||||
|
void kvm_unregister_irq_ack_notifier(struct kvm *kvm,
|
||||||
|
struct kvm_irq_ack_notifier *kian);
|
||||||
|
|
||||||
#ifdef CONFIG_DMAR
|
#ifdef CONFIG_DMAR
|
||||||
int kvm_iommu_map_pages(struct kvm *kvm, gfn_t base_gfn,
|
int kvm_iommu_map_pages(struct kvm *kvm, gfn_t base_gfn,
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
/*
|
||||||
|
* irq_comm.c: Common API for in kernel interrupt controller
|
||||||
|
* Copyright (c) 2007, Intel Corporation.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with
|
||||||
|
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
||||||
|
* Place - Suite 330, Boston, MA 02111-1307 USA.
|
||||||
|
* Authors:
|
||||||
|
* Yaozu (Eddie) Dong <Eddie.dong@intel.com>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/kvm_host.h>
|
||||||
|
#include "irq.h"
|
||||||
|
|
||||||
|
#include "ioapic.h"
|
||||||
|
|
||||||
|
/* This should be called with the kvm->lock mutex held */
|
||||||
|
void kvm_set_irq(struct kvm *kvm, int irq, int level)
|
||||||
|
{
|
||||||
|
/* Not possible to detect if the guest uses the PIC or the
|
||||||
|
* IOAPIC. So set the bit in both. The guest will ignore
|
||||||
|
* writes to the unused one.
|
||||||
|
*/
|
||||||
|
kvm_ioapic_set_irq(kvm->arch.vioapic, irq, level);
|
||||||
|
#ifdef CONFIG_X86
|
||||||
|
kvm_pic_set_irq(pic_irqchip(kvm), irq, level);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void kvm_notify_acked_irq(struct kvm *kvm, unsigned gsi)
|
||||||
|
{
|
||||||
|
struct kvm_irq_ack_notifier *kian;
|
||||||
|
struct hlist_node *n;
|
||||||
|
|
||||||
|
hlist_for_each_entry(kian, n, &kvm->arch.irq_ack_notifier_list, link)
|
||||||
|
if (kian->gsi == gsi)
|
||||||
|
kian->irq_acked(kian);
|
||||||
|
}
|
||||||
|
|
||||||
|
void kvm_register_irq_ack_notifier(struct kvm *kvm,
|
||||||
|
struct kvm_irq_ack_notifier *kian)
|
||||||
|
{
|
||||||
|
hlist_add_head(&kian->link, &kvm->arch.irq_ack_notifier_list);
|
||||||
|
}
|
||||||
|
|
||||||
|
void kvm_unregister_irq_ack_notifier(struct kvm *kvm,
|
||||||
|
struct kvm_irq_ack_notifier *kian)
|
||||||
|
{
|
||||||
|
hlist_del(&kian->link);
|
||||||
|
}
|
Loading…
Reference in New Issue