diff options
-rw-r--r-- | arch/arm/kvm/arm.c | 7 | ||||
-rw-r--r-- | virt/kvm/arm/vgic.c | 22 |
2 files changed, 23 insertions, 6 deletions
diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c index 13205bd9b359..c9fe9d71be73 100644 --- a/arch/arm/kvm/arm.c +++ b/arch/arm/kvm/arm.c | |||
@@ -464,6 +464,8 @@ static void update_vttbr(struct kvm *kvm) | |||
464 | 464 | ||
465 | static int kvm_vcpu_first_run_init(struct kvm_vcpu *vcpu) | 465 | static int kvm_vcpu_first_run_init(struct kvm_vcpu *vcpu) |
466 | { | 466 | { |
467 | int ret; | ||
468 | |||
467 | if (likely(vcpu->arch.has_run_once)) | 469 | if (likely(vcpu->arch.has_run_once)) |
468 | return 0; | 470 | return 0; |
469 | 471 | ||
@@ -473,9 +475,8 @@ static int kvm_vcpu_first_run_init(struct kvm_vcpu *vcpu) | |||
473 | * Initialize the VGIC before running a vcpu the first time on | 475 | * Initialize the VGIC before running a vcpu the first time on |
474 | * this VM. | 476 | * this VM. |
475 | */ | 477 | */ |
476 | if (irqchip_in_kernel(vcpu->kvm) && | 478 | if (unlikely(!vgic_initialized(vcpu->kvm))) { |
477 | unlikely(!vgic_initialized(vcpu->kvm))) { | 479 | ret = kvm_vgic_init(vcpu->kvm); |
478 | int ret = kvm_vgic_init(vcpu->kvm); | ||
479 | if (ret) | 480 | if (ret) |
480 | return ret; | 481 | return ret; |
481 | } | 482 | } |
diff --git a/virt/kvm/arm/vgic.c b/virt/kvm/arm/vgic.c index 81e9481184a7..5e9df47778fb 100644 --- a/virt/kvm/arm/vgic.c +++ b/virt/kvm/arm/vgic.c | |||
@@ -1243,15 +1243,19 @@ static irqreturn_t vgic_maintenance_handler(int irq, void *data) | |||
1243 | return IRQ_HANDLED; | 1243 | return IRQ_HANDLED; |
1244 | } | 1244 | } |
1245 | 1245 | ||
1246 | /** | ||
1247 | * kvm_vgic_vcpu_init - Initialize per-vcpu VGIC state | ||
1248 | * @vcpu: pointer to the vcpu struct | ||
1249 | * | ||
1250 | * Initialize the vgic_cpu struct and vgic_dist struct fields pertaining to | ||
1251 | * this vcpu and enable the VGIC for this VCPU | ||
1252 | */ | ||
1246 | int kvm_vgic_vcpu_init(struct kvm_vcpu *vcpu) | 1253 | int kvm_vgic_vcpu_init(struct kvm_vcpu *vcpu) |
1247 | { | 1254 | { |
1248 | struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu; | 1255 | struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu; |
1249 | struct vgic_dist *dist = &vcpu->kvm->arch.vgic; | 1256 | struct vgic_dist *dist = &vcpu->kvm->arch.vgic; |
1250 | int i; | 1257 | int i; |
1251 | 1258 | ||
1252 | if (!irqchip_in_kernel(vcpu->kvm)) | ||
1253 | return 0; | ||
1254 | |||
1255 | if (vcpu->vcpu_id >= VGIC_MAX_CPUS) | 1259 | if (vcpu->vcpu_id >= VGIC_MAX_CPUS) |
1256 | return -EBUSY; | 1260 | return -EBUSY; |
1257 | 1261 | ||
@@ -1383,10 +1387,22 @@ out: | |||
1383 | return ret; | 1387 | return ret; |
1384 | } | 1388 | } |
1385 | 1389 | ||
1390 | /** | ||
1391 | * kvm_vgic_init - Initialize global VGIC state before running any VCPUs | ||
1392 | * @kvm: pointer to the kvm struct | ||
1393 | * | ||
1394 | * Map the virtual CPU interface into the VM before running any VCPUs. We | ||
1395 | * can't do this at creation time, because user space must first set the | ||
1396 | * virtual CPU interface address in the guest physical address space. Also | ||
1397 | * initialize the ITARGETSRn regs to 0 on the emulated distributor. | ||
1398 | */ | ||
1386 | int kvm_vgic_init(struct kvm *kvm) | 1399 | int kvm_vgic_init(struct kvm *kvm) |
1387 | { | 1400 | { |
1388 | int ret = 0, i; | 1401 | int ret = 0, i; |
1389 | 1402 | ||
1403 | if (!irqchip_in_kernel(kvm)) | ||
1404 | return 0; | ||
1405 | |||
1390 | mutex_lock(&kvm->lock); | 1406 | mutex_lock(&kvm->lock); |
1391 | 1407 | ||
1392 | if (vgic_initialized(kvm)) | 1408 | if (vgic_initialized(kvm)) |