Revision 7ae26bd4

b/cpus.c
70 70
    if (env->stopped || !runstate_is_running()) {
71 71
        return true;
72 72
    }
73
    if (!env->halted || qemu_cpu_has_work(env) || kvm_irqchip_in_kernel()) {
73
    if (!env->halted || qemu_cpu_has_work(env) ||
74
        kvm_async_interrupts_enabled()) {
74 75
        return false;
75 76
    }
76 77
    return true;
b/kvm-all.c
100 100

  
101 101
KVMState *kvm_state;
102 102
bool kvm_kernel_irqchip;
103
bool kvm_async_interrupts_allowed;
103 104

  
104 105
static const KVMCapabilityInfo kvm_required_capabilites[] = {
105 106
    KVM_CAP_INFO(USER_MEMORY),
......
857 858
    struct kvm_irq_level event;
858 859
    int ret;
859 860

  
860
    assert(kvm_irqchip_in_kernel());
861
    assert(kvm_async_interrupts_enabled());
861 862

  
862 863
    event.level = level;
863 864
    event.irq = irq;
......
1201 1202
        s->irqchip_inject_ioctl = KVM_IRQ_LINE_STATUS;
1202 1203
    }
1203 1204
    kvm_kernel_irqchip = true;
1205
    /* If we have an in-kernel IRQ chip then we must have asynchronous
1206
     * interrupt delivery (though the reverse is not necessarily true)
1207
     */
1208
    kvm_async_interrupts_allowed = true;
1204 1209

  
1205 1210
    kvm_init_irq_routing(s);
1206 1211

  
b/kvm-stub.c
19 19

  
20 20
KVMState *kvm_state;
21 21
bool kvm_kernel_irqchip;
22
bool kvm_async_interrupts_allowed;
22 23

  
23 24
int kvm_init_vcpu(CPUArchState *env)
24 25
{
b/kvm.h
24 24

  
25 25
extern int kvm_allowed;
26 26
extern bool kvm_kernel_irqchip;
27
extern bool kvm_async_interrupts_allowed;
27 28

  
28 29
#if defined CONFIG_KVM || !defined NEED_CPU_H
29 30
#define kvm_enabled()           (kvm_allowed)
30 31
#define kvm_irqchip_in_kernel() (kvm_kernel_irqchip)
32

  
33
/**
34
 * kvm_async_interrupts_enabled:
35
 *
36
 * Returns: true if we can deliver interrupts to KVM
37
 * asynchronously (ie by ioctl from any thread at any time)
38
 * rather than having to do interrupt delivery synchronously
39
 * (where the vcpu must be stopped at a suitable point first).
40
 */
41
#define kvm_async_interrupts_enabled() (kvm_async_interrupts_allowed)
42

  
31 43
#else
32 44
#define kvm_enabled()           (0)
33 45
#define kvm_irqchip_in_kernel() (false)
46
#define kvm_async_interrupts_enabled() (false)
34 47
#endif
35 48

  
36 49
struct kvm_run;

Also available in: Unified diff