forked from luck/tmp_suning_uos_patched
KVM: s390: fix wrong lookup of VCPUs by array index
For now, VCPUs were always created sequentially with incrementing
VCPU ids. Therefore, the index in the VCPUs array matched the id.
As sequential creation might change with cpu hotplug, let's use
the correct lookup function to find a VCPU by id, not array index.
Let's also use kvm_lookup_vcpu() for validation of the sending VCPU
on external call injection.
Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Cc: stable@vger.kernel.org # db27a7a
KVM: Provide function for VCPU lookup by id
This commit is contained in:
parent
b85de33a1a
commit
152e9f65d6
|
@ -1030,8 +1030,7 @@ static int __inject_extcall(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq)
|
||||||
src_id, 0);
|
src_id, 0);
|
||||||
|
|
||||||
/* sending vcpu invalid */
|
/* sending vcpu invalid */
|
||||||
if (src_id >= KVM_MAX_VCPUS ||
|
if (kvm_get_vcpu_by_id(vcpu->kvm, src_id) == NULL)
|
||||||
kvm_get_vcpu(vcpu->kvm, src_id) == NULL)
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (sclp.has_sigpif)
|
if (sclp.has_sigpif)
|
||||||
|
|
|
@ -291,12 +291,8 @@ static int handle_sigp_dst(struct kvm_vcpu *vcpu, u8 order_code,
|
||||||
u16 cpu_addr, u32 parameter, u64 *status_reg)
|
u16 cpu_addr, u32 parameter, u64 *status_reg)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
struct kvm_vcpu *dst_vcpu;
|
struct kvm_vcpu *dst_vcpu = kvm_get_vcpu_by_id(vcpu->kvm, cpu_addr);
|
||||||
|
|
||||||
if (cpu_addr >= KVM_MAX_VCPUS)
|
|
||||||
return SIGP_CC_NOT_OPERATIONAL;
|
|
||||||
|
|
||||||
dst_vcpu = kvm_get_vcpu(vcpu->kvm, cpu_addr);
|
|
||||||
if (!dst_vcpu)
|
if (!dst_vcpu)
|
||||||
return SIGP_CC_NOT_OPERATIONAL;
|
return SIGP_CC_NOT_OPERATIONAL;
|
||||||
|
|
||||||
|
@ -478,7 +474,7 @@ int kvm_s390_handle_sigp_pei(struct kvm_vcpu *vcpu)
|
||||||
trace_kvm_s390_handle_sigp_pei(vcpu, order_code, cpu_addr);
|
trace_kvm_s390_handle_sigp_pei(vcpu, order_code, cpu_addr);
|
||||||
|
|
||||||
if (order_code == SIGP_EXTERNAL_CALL) {
|
if (order_code == SIGP_EXTERNAL_CALL) {
|
||||||
dest_vcpu = kvm_get_vcpu(vcpu->kvm, cpu_addr);
|
dest_vcpu = kvm_get_vcpu_by_id(vcpu->kvm, cpu_addr);
|
||||||
BUG_ON(dest_vcpu == NULL);
|
BUG_ON(dest_vcpu == NULL);
|
||||||
|
|
||||||
kvm_s390_vcpu_wakeup(dest_vcpu);
|
kvm_s390_vcpu_wakeup(dest_vcpu);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user