mirror of
https://github.com/qemu/qemu.git
synced 2024-11-28 14:24:02 +08:00
kvm: Decouple 'MSI routing via irqfds' from 'kernel irqchip'
Decouple another x86-specific assumption about what irqchips imply. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
parent
cc7e0ddf5a
commit
614e41bc26
@ -627,7 +627,7 @@ static int virtio_pci_set_guest_notifiers(void *opaque, bool assign)
|
||||
int r, n;
|
||||
|
||||
/* Must unset vector notifier while guest notifier is still assigned */
|
||||
if (kvm_irqchip_in_kernel() && !assign) {
|
||||
if (kvm_msi_via_irqfd_enabled() && !assign) {
|
||||
msix_unset_vector_notifiers(&proxy->pci_dev);
|
||||
g_free(proxy->vector_irqfd);
|
||||
proxy->vector_irqfd = NULL;
|
||||
@ -645,7 +645,7 @@ static int virtio_pci_set_guest_notifiers(void *opaque, bool assign)
|
||||
}
|
||||
|
||||
/* Must set vector notifier after guest notifier has been assigned */
|
||||
if (kvm_irqchip_in_kernel() && assign) {
|
||||
if (kvm_msi_via_irqfd_enabled() && assign) {
|
||||
proxy->vector_irqfd =
|
||||
g_malloc0(sizeof(*proxy->vector_irqfd) *
|
||||
msix_nr_vectors_allocated(&proxy->pci_dev));
|
||||
|
@ -102,6 +102,7 @@ KVMState *kvm_state;
|
||||
bool kvm_kernel_irqchip;
|
||||
bool kvm_async_interrupts_allowed;
|
||||
bool kvm_irqfds_allowed;
|
||||
bool kvm_msi_via_irqfd_allowed;
|
||||
|
||||
static const KVMCapabilityInfo kvm_required_capabilites[] = {
|
||||
KVM_CAP_INFO(USER_MEMORY),
|
||||
|
@ -21,6 +21,7 @@ KVMState *kvm_state;
|
||||
bool kvm_kernel_irqchip;
|
||||
bool kvm_async_interrupts_allowed;
|
||||
bool kvm_irqfds_allowed;
|
||||
bool kvm_msi_via_irqfd_allowed;
|
||||
|
||||
int kvm_init_vcpu(CPUArchState *env)
|
||||
{
|
||||
|
11
kvm.h
11
kvm.h
@ -26,6 +26,7 @@ extern int kvm_allowed;
|
||||
extern bool kvm_kernel_irqchip;
|
||||
extern bool kvm_async_interrupts_allowed;
|
||||
extern bool kvm_irqfds_allowed;
|
||||
extern bool kvm_msi_via_irqfd_allowed;
|
||||
|
||||
#if defined CONFIG_KVM || !defined NEED_CPU_H
|
||||
#define kvm_enabled() (kvm_allowed)
|
||||
@ -50,11 +51,21 @@ extern bool kvm_irqfds_allowed;
|
||||
*/
|
||||
#define kvm_irqfds_enabled() (kvm_irqfds_allowed)
|
||||
|
||||
/**
|
||||
* kvm_msi_via_irqfd_enabled:
|
||||
*
|
||||
* Returns: true if we can route a PCI MSI (Message Signaled Interrupt)
|
||||
* to a KVM CPU via an irqfd. This requires that the kernel supports
|
||||
* this and that we're running in a configuration that permits it.
|
||||
*/
|
||||
#define kvm_msi_via_irqfd_enabled() (kvm_msi_via_irqfd_allowed)
|
||||
|
||||
#else
|
||||
#define kvm_enabled() (0)
|
||||
#define kvm_irqchip_in_kernel() (false)
|
||||
#define kvm_async_interrupts_enabled() (false)
|
||||
#define kvm_irqfds_enabled() (false)
|
||||
#define kvm_msi_via_irqfd_enabled() (false)
|
||||
#endif
|
||||
|
||||
struct kvm_run;
|
||||
|
@ -2048,7 +2048,9 @@ void kvm_arch_init_irq_routing(KVMState *s)
|
||||
no_hpet = 1;
|
||||
}
|
||||
/* We know at this point that we're using the in-kernel
|
||||
* irqchip, so we can use irqfds.
|
||||
* irqchip, so we can use irqfds, and on x86 we know
|
||||
* we can use msi via irqfd.
|
||||
*/
|
||||
kvm_irqfds_allowed = true;
|
||||
kvm_msi_via_irqfd_allowed = true;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user