kvm: introduce kvm_kernel_irqchip_* functions
The KVMState struct is opaque, so provide accessors for the fields that will be moved from current_machine to the accelerator. For now they just forward to the machine object, but this will change. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
23b0898e44
commit
4376c40ded
|
@ -1774,7 +1774,7 @@ void kvm_irqchip_set_qemuirq_gsi(KVMState *s, qemu_irq irq, int gsi)
|
||||||
g_hash_table_insert(s->gsimap, irq, GINT_TO_POINTER(gsi));
|
g_hash_table_insert(s->gsimap, irq, GINT_TO_POINTER(gsi));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void kvm_irqchip_create(MachineState *machine, KVMState *s)
|
static void kvm_irqchip_create(KVMState *s)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -1792,9 +1792,9 @@ static void kvm_irqchip_create(MachineState *machine, KVMState *s)
|
||||||
|
|
||||||
/* First probe and see if there's a arch-specific hook to create the
|
/* First probe and see if there's a arch-specific hook to create the
|
||||||
* in-kernel irqchip for us */
|
* in-kernel irqchip for us */
|
||||||
ret = kvm_arch_irqchip_create(machine, s);
|
ret = kvm_arch_irqchip_create(s);
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
if (machine_kernel_irqchip_split(machine)) {
|
if (kvm_kernel_irqchip_split()) {
|
||||||
perror("Split IRQ chip mode not supported.");
|
perror("Split IRQ chip mode not supported.");
|
||||||
exit(1);
|
exit(1);
|
||||||
} else {
|
} else {
|
||||||
|
@ -2066,7 +2066,7 @@ static int kvm_init(MachineState *ms)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (machine_kernel_irqchip_allowed(ms)) {
|
if (machine_kernel_irqchip_allowed(ms)) {
|
||||||
kvm_irqchip_create(ms, s);
|
kvm_irqchip_create(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (kvm_eventfds_allowed) {
|
if (kvm_eventfds_allowed) {
|
||||||
|
@ -2983,6 +2983,21 @@ static void kvm_set_kvm_shadow_mem(Object *obj, Visitor *v,
|
||||||
s->kvm_shadow_mem = value;
|
s->kvm_shadow_mem = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool kvm_kernel_irqchip_allowed(void)
|
||||||
|
{
|
||||||
|
return machine_kernel_irqchip_allowed(current_machine);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool kvm_kernel_irqchip_required(void)
|
||||||
|
{
|
||||||
|
return machine_kernel_irqchip_required(current_machine);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool kvm_kernel_irqchip_split(void)
|
||||||
|
{
|
||||||
|
return machine_kernel_irqchip_split(current_machine);
|
||||||
|
}
|
||||||
|
|
||||||
static void kvm_accel_instance_init(Object *obj)
|
static void kvm_accel_instance_init(Object *obj)
|
||||||
{
|
{
|
||||||
KVMState *s = KVM_STATE(obj);
|
KVMState *s = KVM_STATE(obj);
|
||||||
|
|
|
@ -793,7 +793,6 @@ static DeviceState *ppce500_init_mpic(PPCE500MachineState *pms,
|
||||||
MemoryRegion *ccsr,
|
MemoryRegion *ccsr,
|
||||||
IrqLines *irqs)
|
IrqLines *irqs)
|
||||||
{
|
{
|
||||||
MachineState *machine = MACHINE(pms);
|
|
||||||
const PPCE500MachineClass *pmc = PPCE500_MACHINE_GET_CLASS(pms);
|
const PPCE500MachineClass *pmc = PPCE500_MACHINE_GET_CLASS(pms);
|
||||||
DeviceState *dev = NULL;
|
DeviceState *dev = NULL;
|
||||||
SysBusDevice *s;
|
SysBusDevice *s;
|
||||||
|
@ -801,10 +800,10 @@ static DeviceState *ppce500_init_mpic(PPCE500MachineState *pms,
|
||||||
if (kvm_enabled()) {
|
if (kvm_enabled()) {
|
||||||
Error *err = NULL;
|
Error *err = NULL;
|
||||||
|
|
||||||
if (machine_kernel_irqchip_allowed(machine)) {
|
if (kvm_kernel_irqchip_allowed()) {
|
||||||
dev = ppce500_init_mpic_kvm(pmc, irqs, &err);
|
dev = ppce500_init_mpic_kvm(pmc, irqs, &err);
|
||||||
}
|
}
|
||||||
if (machine_kernel_irqchip_required(machine) && !dev) {
|
if (kvm_kernel_irqchip_required() && !dev) {
|
||||||
error_reportf_err(err,
|
error_reportf_err(err,
|
||||||
"kernel_irqchip requested but unavailable: ");
|
"kernel_irqchip requested but unavailable: ");
|
||||||
exit(1);
|
exit(1);
|
||||||
|
|
|
@ -75,12 +75,11 @@ int spapr_irq_init_kvm(SpaprInterruptControllerInitKvm fn,
|
||||||
uint32_t nr_servers,
|
uint32_t nr_servers,
|
||||||
Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
MachineState *machine = MACHINE(qdev_get_machine());
|
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
|
|
||||||
if (kvm_enabled() && machine_kernel_irqchip_allowed(machine)) {
|
if (kvm_enabled() && kvm_kernel_irqchip_allowed()) {
|
||||||
if (fn(intc, nr_servers, &local_err) < 0) {
|
if (fn(intc, nr_servers, &local_err) < 0) {
|
||||||
if (machine_kernel_irqchip_required(machine)) {
|
if (kvm_kernel_irqchip_required()) {
|
||||||
error_prepend(&local_err,
|
error_prepend(&local_err,
|
||||||
"kernel_irqchip requested but unavailable: ");
|
"kernel_irqchip requested but unavailable: ");
|
||||||
error_propagate(errp, local_err);
|
error_propagate(errp, local_err);
|
||||||
|
@ -185,7 +184,7 @@ static int spapr_irq_check(SpaprMachineState *spapr, Error **errp)
|
||||||
*/
|
*/
|
||||||
if (kvm_enabled() &&
|
if (kvm_enabled() &&
|
||||||
spapr->irq == &spapr_irq_dual &&
|
spapr->irq == &spapr_irq_dual &&
|
||||||
machine_kernel_irqchip_required(machine) &&
|
kvm_kernel_irqchip_required() &&
|
||||||
xics_kvm_has_broken_disconnect(spapr)) {
|
xics_kvm_has_broken_disconnect(spapr)) {
|
||||||
error_setg(errp, "KVM is too old to support ic-mode=dual,kernel-irqchip=on");
|
error_setg(errp, "KVM is too old to support ic-mode=dual,kernel-irqchip=on");
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -288,20 +287,13 @@ uint32_t spapr_irq_nr_msis(SpaprMachineState *spapr)
|
||||||
|
|
||||||
void spapr_irq_init(SpaprMachineState *spapr, Error **errp)
|
void spapr_irq_init(SpaprMachineState *spapr, Error **errp)
|
||||||
{
|
{
|
||||||
MachineState *machine = MACHINE(spapr);
|
|
||||||
SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr);
|
SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr);
|
||||||
|
|
||||||
if (machine_kernel_irqchip_split(machine)) {
|
if (kvm_enabled() && kvm_kernel_irqchip_split()) {
|
||||||
error_setg(errp, "kernel_irqchip split mode not supported on pseries");
|
error_setg(errp, "kernel_irqchip split mode not supported on pseries");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!kvm_enabled() && machine_kernel_irqchip_required(machine)) {
|
|
||||||
error_setg(errp,
|
|
||||||
"kernel_irqchip requested but only available with KVM");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (spapr_irq_check(spapr, errp) < 0) {
|
if (spapr_irq_check(spapr, errp) < 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -519,10 +519,13 @@ void kvm_pc_gsi_handler(void *opaque, int n, int level);
|
||||||
void kvm_pc_setup_irq_routing(bool pci_enabled);
|
void kvm_pc_setup_irq_routing(bool pci_enabled);
|
||||||
void kvm_init_irq_routing(KVMState *s);
|
void kvm_init_irq_routing(KVMState *s);
|
||||||
|
|
||||||
|
bool kvm_kernel_irqchip_allowed(void);
|
||||||
|
bool kvm_kernel_irqchip_required(void);
|
||||||
|
bool kvm_kernel_irqchip_split(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* kvm_arch_irqchip_create:
|
* kvm_arch_irqchip_create:
|
||||||
* @KVMState: The KVMState pointer
|
* @KVMState: The KVMState pointer
|
||||||
* @MachineState: The MachineState pointer
|
|
||||||
*
|
*
|
||||||
* Allow architectures to create an in-kernel irq chip themselves.
|
* Allow architectures to create an in-kernel irq chip themselves.
|
||||||
*
|
*
|
||||||
|
@ -530,7 +533,7 @@ void kvm_init_irq_routing(KVMState *s);
|
||||||
* 0: irq chip was not created
|
* 0: irq chip was not created
|
||||||
* > 0: irq chip was created
|
* > 0: irq chip was created
|
||||||
*/
|
*/
|
||||||
int kvm_arch_irqchip_create(MachineState *ms, KVMState *s);
|
int kvm_arch_irqchip_create(KVMState *s);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* kvm_set_one_reg - set a register value in KVM via KVM_SET_ONE_REG ioctl
|
* kvm_set_one_reg - set a register value in KVM via KVM_SET_ONE_REG ioctl
|
||||||
|
|
|
@ -741,11 +741,11 @@ void kvm_arch_init_irq_routing(KVMState *s)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
int kvm_arch_irqchip_create(MachineState *ms, KVMState *s)
|
int kvm_arch_irqchip_create(KVMState *s)
|
||||||
{
|
{
|
||||||
if (machine_kernel_irqchip_split(ms)) {
|
if (kvm_kernel_irqchip_split()) {
|
||||||
perror("-machine kernel_irqchip=split is not supported on ARM.");
|
perror("-machine kernel_irqchip=split is not supported on ARM.");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we can create the VGIC using the newer device control API, we
|
/* If we can create the VGIC using the newer device control API, we
|
||||||
|
|
|
@ -4494,10 +4494,10 @@ void kvm_arch_init_irq_routing(KVMState *s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int kvm_arch_irqchip_create(MachineState *ms, KVMState *s)
|
int kvm_arch_irqchip_create(KVMState *s)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
if (machine_kernel_irqchip_split(ms)) {
|
if (kvm_kernel_irqchip_split()) {
|
||||||
ret = kvm_vm_enable_cap(s, KVM_CAP_SPLIT_IRQCHIP, 0, 24);
|
ret = kvm_vm_enable_cap(s, KVM_CAP_SPLIT_IRQCHIP, 0, 24);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
error_report("Could not enable split irqchip mode: %s",
|
error_report("Could not enable split irqchip mode: %s",
|
||||||
|
|
|
@ -57,7 +57,7 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int kvm_arch_irqchip_create(MachineState *ms, KVMState *s)
|
int kvm_arch_irqchip_create(KVMState *s)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -152,7 +152,7 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int kvm_arch_irqchip_create(MachineState *ms, KVMState *s)
|
int kvm_arch_irqchip_create(KVMState *s)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -374,7 +374,7 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int kvm_arch_irqchip_create(MachineState *ms, KVMState *s)
|
int kvm_arch_irqchip_create(KVMState *s)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue