Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
Pull KVM updates from Paolo Bonzini: "Small release overall. x86: - miscellaneous fixes - AVIC support (local APIC virtualization, AMD version) s390: - polling for interrupts after a VCPU goes to halted state is now enabled for s390 - use hardware provided information about facility bits that do not need any hypervisor activity, and other fixes for cpu models and facilities - improve perf output - floating interrupt controller improvements. MIPS: - miscellaneous fixes PPC: - bugfixes only ARM: - 16K page size support - generic firmware probing layer for timer and GIC Christoffer Dall (KVM-ARM maintainer) says: "There are a few changes in this pull request touching things outside KVM, but they should all carry the necessary acks and it made the merge process much easier to do it this way." though actually the irqchip maintainers' acks didn't make it into the patches. Marc Zyngier, who is both irqchip and KVM-ARM maintainer, later acked at http://mid.gmane.org/573351D1.4060303@arm.com ('more formally and for documentation purposes')" * tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm: (82 commits) KVM: MTRR: remove MSR 0x2f8 KVM: x86: make hwapic_isr_update and hwapic_irr_update look the same svm: Manage vcpu load/unload when enable AVIC svm: Do not intercept CR8 when enable AVIC svm: Do not expose x2APIC when enable AVIC KVM: x86: Introducing kvm_x86_ops.apicv_post_state_restore svm: Add VMEXIT handlers for AVIC svm: Add interrupt injection via AVIC KVM: x86: Detect and Initialize AVIC support svm: Introduce new AVIC VMCB registers KVM: split kvm_vcpu_wake_up from kvm_vcpu_kick KVM: x86: Introducing kvm_x86_ops VCPU blocking/unblocking hooks KVM: x86: Introducing kvm_x86_ops VM init/destroy hooks KVM: x86: Rename kvm_apic_get_reg to kvm_lapic_get_reg KVM: x86: Misc LAPIC changes to expose helper functions KVM: shrink halt polling even more for invalid wakeups KVM: s390: set halt polling to 80 microseconds KVM: halt_polling: provide a way to qualify wakeups during poll KVM: PPC: Book3S HV: Re-enable XICS fast path for irqfd-generated interrupts kvm: Conditionally register IRQ bypass consumer ...
This commit is contained in:
@@ -34,7 +34,7 @@ struct irq_bypass_consumer;
|
||||
/**
|
||||
* struct irq_bypass_producer - IRQ bypass producer definition
|
||||
* @node: IRQ bypass manager private list management
|
||||
* @token: opaque token to match between producer and consumer
|
||||
* @token: opaque token to match between producer and consumer (non-NULL)
|
||||
* @irq: Linux IRQ number for the producer device
|
||||
* @add_consumer: Connect the IRQ producer to an IRQ consumer (optional)
|
||||
* @del_consumer: Disconnect the IRQ producer from an IRQ consumer (optional)
|
||||
@@ -60,7 +60,7 @@ struct irq_bypass_producer {
|
||||
/**
|
||||
* struct irq_bypass_consumer - IRQ bypass consumer definition
|
||||
* @node: IRQ bypass manager private list management
|
||||
* @token: opaque token to match between producer and consumer
|
||||
* @token: opaque token to match between producer and consumer (non-NULL)
|
||||
* @add_producer: Connect the IRQ consumer to an IRQ producer
|
||||
* @del_producer: Disconnect the IRQ consumer from an IRQ producer
|
||||
* @stop: Perform any quiesce operations necessary prior to add/del (optional)
|
||||
|
34
include/linux/irqchip/arm-gic-common.h
Normal file
34
include/linux/irqchip/arm-gic-common.h
Normal file
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* include/linux/irqchip/arm-gic-common.h
|
||||
*
|
||||
* Copyright (C) 2016 ARM Limited, All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#ifndef __LINUX_IRQCHIP_ARM_GIC_COMMON_H
|
||||
#define __LINUX_IRQCHIP_ARM_GIC_COMMON_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/ioport.h>
|
||||
|
||||
enum gic_type {
|
||||
GIC_V2,
|
||||
GIC_V3,
|
||||
};
|
||||
|
||||
struct gic_kvm_info {
|
||||
/* GIC type */
|
||||
enum gic_type type;
|
||||
/* Virtual CPU interface */
|
||||
struct resource vcpu;
|
||||
/* Interrupt number */
|
||||
unsigned int maint_irq;
|
||||
/* Virtual control interface */
|
||||
struct resource vctrl;
|
||||
};
|
||||
|
||||
const struct gic_kvm_info *gic_get_kvm_info(void);
|
||||
|
||||
#endif /* __LINUX_IRQCHIP_ARM_GIC_COMMON_H */
|
@@ -35,6 +35,10 @@
|
||||
|
||||
#include <asm/kvm_host.h>
|
||||
|
||||
#ifndef KVM_MAX_VCPU_ID
|
||||
#define KVM_MAX_VCPU_ID KVM_MAX_VCPUS
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The bit 16 ~ bit 31 of kvm_memory_region::flags are internally used
|
||||
* in kvm, other bits are visible for userspace which are defined in
|
||||
@@ -225,6 +229,7 @@ struct kvm_vcpu {
|
||||
sigset_t sigset;
|
||||
struct kvm_vcpu_stat stat;
|
||||
unsigned int halt_poll_ns;
|
||||
bool valid_wakeup;
|
||||
|
||||
#ifdef CONFIG_HAS_IOMEM
|
||||
int mmio_needed;
|
||||
@@ -447,12 +452,13 @@ static inline struct kvm_vcpu *kvm_get_vcpu(struct kvm *kvm, int i)
|
||||
|
||||
static inline struct kvm_vcpu *kvm_get_vcpu_by_id(struct kvm *kvm, int id)
|
||||
{
|
||||
struct kvm_vcpu *vcpu;
|
||||
struct kvm_vcpu *vcpu = NULL;
|
||||
int i;
|
||||
|
||||
if (id < 0 || id >= KVM_MAX_VCPUS)
|
||||
if (id < 0)
|
||||
return NULL;
|
||||
vcpu = kvm_get_vcpu(kvm, id);
|
||||
if (id < KVM_MAX_VCPUS)
|
||||
vcpu = kvm_get_vcpu(kvm, id);
|
||||
if (vcpu && vcpu->vcpu_id == id)
|
||||
return vcpu;
|
||||
kvm_for_each_vcpu(i, vcpu, kvm)
|
||||
@@ -651,6 +657,7 @@ void kvm_vcpu_mark_page_dirty(struct kvm_vcpu *vcpu, gfn_t gfn);
|
||||
void kvm_vcpu_block(struct kvm_vcpu *vcpu);
|
||||
void kvm_arch_vcpu_blocking(struct kvm_vcpu *vcpu);
|
||||
void kvm_arch_vcpu_unblocking(struct kvm_vcpu *vcpu);
|
||||
void kvm_vcpu_wake_up(struct kvm_vcpu *vcpu);
|
||||
void kvm_vcpu_kick(struct kvm_vcpu *vcpu);
|
||||
int kvm_vcpu_yield_to(struct kvm_vcpu *target);
|
||||
void kvm_vcpu_on_spin(struct kvm_vcpu *vcpu);
|
||||
@@ -1091,6 +1098,11 @@ static inline bool kvm_vcpu_compatible(struct kvm_vcpu *vcpu) { return true; }
|
||||
|
||||
static inline void kvm_make_request(int req, struct kvm_vcpu *vcpu)
|
||||
{
|
||||
/*
|
||||
* Ensure the rest of the request is published to kvm_check_request's
|
||||
* caller. Paired with the smp_mb__after_atomic in kvm_check_request.
|
||||
*/
|
||||
smp_wmb();
|
||||
set_bit(req, &vcpu->requests);
|
||||
}
|
||||
|
||||
@@ -1098,6 +1110,12 @@ static inline bool kvm_check_request(int req, struct kvm_vcpu *vcpu)
|
||||
{
|
||||
if (test_bit(req, &vcpu->requests)) {
|
||||
clear_bit(req, &vcpu->requests);
|
||||
|
||||
/*
|
||||
* Ensure the rest of the request is visible to kvm_check_request's
|
||||
* caller. Paired with the smp_wmb in kvm_make_request.
|
||||
*/
|
||||
smp_mb__after_atomic();
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
@@ -1169,6 +1187,7 @@ static inline void kvm_vcpu_set_dy_eligible(struct kvm_vcpu *vcpu, bool val)
|
||||
#endif /* CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT */
|
||||
|
||||
#ifdef CONFIG_HAVE_KVM_IRQ_BYPASS
|
||||
bool kvm_arch_has_irq_bypass(void);
|
||||
int kvm_arch_irq_bypass_add_producer(struct irq_bypass_consumer *,
|
||||
struct irq_bypass_producer *);
|
||||
void kvm_arch_irq_bypass_del_producer(struct irq_bypass_consumer *,
|
||||
@@ -1179,4 +1198,18 @@ int kvm_arch_update_irqfd_routing(struct kvm *kvm, unsigned int host_irq,
|
||||
uint32_t guest_irq, bool set);
|
||||
#endif /* CONFIG_HAVE_KVM_IRQ_BYPASS */
|
||||
|
||||
#ifdef CONFIG_HAVE_KVM_INVALID_WAKEUPS
|
||||
/* If we wakeup during the poll time, was it a sucessful poll? */
|
||||
static inline bool vcpu_valid_wakeup(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
return vcpu->valid_wakeup;
|
||||
}
|
||||
|
||||
#else
|
||||
static inline bool vcpu_valid_wakeup(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
#endif /* CONFIG_HAVE_KVM_INVALID_WAKEUPS */
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user