• Halil Pasic's avatar
    KVM: s390: index kvm->arch.idle_mask by vcpu_idx · a3e03bc1
    Halil Pasic authored
    While in practice vcpu->vcpu_idx ==  vcpu->vcp_id is often true, it may
    not always be, and we must not rely on this. Reason is that KVM decides
    the vcpu_idx, userspace decides the vcpu_id, thus the two might not
    match.
    
    Currently kvm->arch.idle_mask is indexed by vcpu_id, which implies
    that code like
    for_each_set_bit(vcpu_id, kvm->arch.idle_mask, online_vcpus) {
                    vcpu = kvm_get_vcpu(kvm, vcpu_id);
    		do_stuff(vcpu);
    }
    is not legit. Reason is that kvm_get_vcpu expects an vcpu_idx, not an
    vcpu_id.  The trouble is, we do actually use kvm->arch.idle_mask like
    this. To fix this problem we have two options. Either use
    kvm_get_vcpu_by_id(vcpu_id), which would loop to find the right vcpu_id,
    or switch to indexing via vcpu_idx. The latter is preferable for obvious
    reasons.
    
    Let us make switch from indexing kvm->arch.idle_mask by vcpu_id to
    indexing it by vcpu_idx.  To keep gisa_int.kicked_mask indexed by the
    same index as idle_mask lets make the same change for it as well.
    
    Fixes: 1ee0bc55 ("KVM: s390: get rid of local_int array")
    Signed-off-by: default avatarHalil Pasic <pasic@linux.ibm.com>
    Reviewed-by: default avatarChristian Bornträger <borntraeger@de.ibm.com>
    Reviewed-by: default avatarClaudio Imbrenda <imbrenda@linux.ibm.com>
    Cc: <stable@vger.kernel.org> # 3.15+
    Link: https://lore.kernel.org/r/20210827125429.1912577-1-pasic@linux.ibm.comSigned-off-by: default avatarChristian Borntraeger <borntraeger@de.ibm.com>
    a3e03bc1
interrupt.c 88.8 KB