mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-10 12:57:06 +09:00
UPSTREAM: KVM: arm64: vgic: Be tolerant to the lack of maintenance interrupt masking
As it turns out, not all the interrupt controllers are able to
expose a vGIC maintenance interrupt that can be independently
enabled/disabled.
And to be fair, it doesn't really matter as all we require is
for the interrupt to kick us out of guest mode out way or another.
To that effect, add gic_kvm_info.no_maint_irq_mask for an interrupt
controller to advertise the lack of masking.
Signed-off-by: Marc Zyngier <maz@kernel.org>
(cherry picked from commit 669062d2a1)
Signed-off-by: Will Deacon <willdeacon@google.com>
Bug: 192636784
Change-Id: I06c247347faf9899aedc131e95b6f764aa474f64
This commit is contained in:
committed by
Will Deacon
parent
fe77b6dd3a
commit
6873a8ecc4
@@ -519,12 +519,15 @@ void kvm_vgic_init_cpu_hardware(void)
|
||||
*/
|
||||
int kvm_vgic_hyp_init(void)
|
||||
{
|
||||
bool has_mask;
|
||||
int ret;
|
||||
|
||||
if (!gic_kvm_info)
|
||||
return -ENODEV;
|
||||
|
||||
if (!gic_kvm_info->maint_irq) {
|
||||
has_mask = !gic_kvm_info->no_maint_irq_mask;
|
||||
|
||||
if (has_mask && !gic_kvm_info->maint_irq) {
|
||||
kvm_err("No vgic maintenance irq\n");
|
||||
return -ENXIO;
|
||||
}
|
||||
@@ -552,6 +555,9 @@ int kvm_vgic_hyp_init(void)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (!has_mask)
|
||||
return 0;
|
||||
|
||||
ret = request_percpu_irq(kvm_vgic_global_state.maint_irq,
|
||||
vgic_maintenance_handler,
|
||||
"vgic", kvm_get_running_vcpus());
|
||||
|
||||
@@ -24,6 +24,8 @@ struct gic_kvm_info {
|
||||
struct resource vcpu;
|
||||
/* Interrupt number */
|
||||
unsigned int maint_irq;
|
||||
/* No interrupt mask, no need to use the above field */
|
||||
bool no_maint_irq_mask;
|
||||
/* Virtual control interface */
|
||||
struct resource vctrl;
|
||||
/* vlpi support */
|
||||
|
||||
Reference in New Issue
Block a user