Skip to content

Commit

Permalink
KVM: arm64: Consolidate dist->ready setting into kvm_vgic_map_resourc…
Browse files Browse the repository at this point in the history
…es()

dist->ready setting is pointlessly spread across the two vgic
backends, while it could be consolidated in kvm_vgic_map_resources().

Move it there, and slightly simplify the flows in both backends.

Suggested-by: Eric Auger <eric.auger@redhat.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
  • Loading branch information
Marc Zyngier committed Dec 27, 2020
1 parent 282ff80 commit 101068b
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 23 deletions.
2 changes: 2 additions & 0 deletions arch/arm64/kvm/vgic/vgic-init.c
Original file line number Diff line number Diff line change
Expand Up @@ -446,6 +446,8 @@ int kvm_vgic_map_resources(struct kvm *kvm)

if (ret)
__kvm_vgic_destroy(kvm);
else
dist->ready = true;

out:
mutex_unlock(&kvm->lock);
Expand Down
17 changes: 6 additions & 11 deletions arch/arm64/kvm/vgic/vgic-v2.c
Original file line number Diff line number Diff line change
Expand Up @@ -309,14 +309,12 @@ int vgic_v2_map_resources(struct kvm *kvm)
if (IS_VGIC_ADDR_UNDEF(dist->vgic_dist_base) ||
IS_VGIC_ADDR_UNDEF(dist->vgic_cpu_base)) {
kvm_err("Need to set vgic cpu and dist addresses first\n");
ret = -ENXIO;
goto out;
return -ENXIO;
}

if (!vgic_v2_check_base(dist->vgic_dist_base, dist->vgic_cpu_base)) {
kvm_err("VGIC CPU and dist frames overlap\n");
ret = -EINVAL;
goto out;
return -EINVAL;
}

/*
Expand All @@ -326,13 +324,13 @@ int vgic_v2_map_resources(struct kvm *kvm)
ret = vgic_init(kvm);
if (ret) {
kvm_err("Unable to initialize VGIC dynamic data structures\n");
goto out;
return ret;
}

ret = vgic_register_dist_iodev(kvm, dist->vgic_dist_base, VGIC_V2);
if (ret) {
kvm_err("Unable to register VGIC MMIO regions\n");
goto out;
return ret;
}

if (!static_branch_unlikely(&vgic_v2_cpuif_trap)) {
Expand All @@ -341,14 +339,11 @@ int vgic_v2_map_resources(struct kvm *kvm)
KVM_VGIC_V2_CPU_SIZE, true);
if (ret) {
kvm_err("Unable to remap VGIC CPU to VCPU\n");
goto out;
return ret;
}
}

dist->ready = true;

out:
return ret;
return 0;
}

DEFINE_STATIC_KEY_FALSE(vgic_v2_cpuif_trap);
Expand Down
18 changes: 6 additions & 12 deletions arch/arm64/kvm/vgic/vgic-v3.c
Original file line number Diff line number Diff line change
Expand Up @@ -505,44 +505,38 @@ int vgic_v3_map_resources(struct kvm *kvm)

if (IS_VGIC_ADDR_UNDEF(vgic_cpu->rd_iodev.base_addr)) {
kvm_debug("vcpu %d redistributor base not set\n", c);
ret = -ENXIO;
goto out;
return -ENXIO;
}
}

if (IS_VGIC_ADDR_UNDEF(dist->vgic_dist_base)) {
kvm_err("Need to set vgic distributor addresses first\n");
ret = -ENXIO;
goto out;
return -ENXIO;
}

if (!vgic_v3_check_base(kvm)) {
kvm_err("VGIC redist and dist frames overlap\n");
ret = -EINVAL;
goto out;
return -EINVAL;
}

/*
* For a VGICv3 we require the userland to explicitly initialize
* the VGIC before we need to use it.
*/
if (!vgic_initialized(kvm)) {
ret = -EBUSY;
goto out;
return -EBUSY;
}

ret = vgic_register_dist_iodev(kvm, dist->vgic_dist_base, VGIC_V3);
if (ret) {
kvm_err("Unable to register VGICv3 dist MMIO regions\n");
goto out;
return ret;
}

if (kvm_vgic_global_state.has_gicv4_1)
vgic_v4_configure_vsgis(kvm);
dist->ready = true;

out:
return ret;
return 0;
}

DEFINE_STATIC_KEY_FALSE(vgic_v3_cpuif_trap);
Expand Down

0 comments on commit 101068b

Please sign in to comment.