diff options
Diffstat (limited to 'arch/arm/kvm/psci.c')
| -rw-r--r-- | arch/arm/kvm/psci.c | 20 | 
1 files changed, 12 insertions, 8 deletions
| diff --git a/arch/arm/kvm/psci.c b/arch/arm/kvm/psci.c index 4b94b513168d..0b556968a6da 100644 --- a/arch/arm/kvm/psci.c +++ b/arch/arm/kvm/psci.c @@ -63,7 +63,7 @@ static unsigned long kvm_psci_vcpu_suspend(struct kvm_vcpu *vcpu)  static void kvm_psci_vcpu_off(struct kvm_vcpu *vcpu)  { -	vcpu->arch.pause = true; +	vcpu->arch.power_off = true;  }  static unsigned long kvm_psci_vcpu_on(struct kvm_vcpu *source_vcpu) @@ -87,7 +87,7 @@ static unsigned long kvm_psci_vcpu_on(struct kvm_vcpu *source_vcpu)  	 */  	if (!vcpu)  		return PSCI_RET_INVALID_PARAMS; -	if (!vcpu->arch.pause) { +	if (!vcpu->arch.power_off) {  		if (kvm_psci_version(source_vcpu) != KVM_ARM_PSCI_0_1)  			return PSCI_RET_ALREADY_ON;  		else @@ -115,7 +115,7 @@ static unsigned long kvm_psci_vcpu_on(struct kvm_vcpu *source_vcpu)  	 * the general puspose registers are undefined upon CPU_ON.  	 */  	*vcpu_reg(vcpu, 0) = context_id; -	vcpu->arch.pause = false; +	vcpu->arch.power_off = false;  	smp_mb();		/* Make sure the above is visible */  	wq = kvm_arch_vcpu_wq(vcpu); @@ -126,7 +126,7 @@ static unsigned long kvm_psci_vcpu_on(struct kvm_vcpu *source_vcpu)  static unsigned long kvm_psci_vcpu_affinity_info(struct kvm_vcpu *vcpu)  { -	int i; +	int i, matching_cpus = 0;  	unsigned long mpidr;  	unsigned long target_affinity;  	unsigned long target_affinity_mask; @@ -151,12 +151,16 @@ static unsigned long kvm_psci_vcpu_affinity_info(struct kvm_vcpu *vcpu)  	 */  	kvm_for_each_vcpu(i, tmp, kvm) {  		mpidr = kvm_vcpu_get_mpidr_aff(tmp); -		if (((mpidr & target_affinity_mask) == target_affinity) && -		    !tmp->arch.pause) { -			return PSCI_0_2_AFFINITY_LEVEL_ON; +		if ((mpidr & target_affinity_mask) == target_affinity) { +			matching_cpus++; +			if (!tmp->arch.power_off) +				return PSCI_0_2_AFFINITY_LEVEL_ON;  		}  	} +	if (!matching_cpus) +		return PSCI_RET_INVALID_PARAMS; +  	return PSCI_0_2_AFFINITY_LEVEL_OFF;  } @@ -175,7 +179,7 @@ static void kvm_prepare_system_event(struct kvm_vcpu *vcpu, u32 type)  	 * re-initialized.  	 */  	kvm_for_each_vcpu(i, tmp, vcpu->kvm) { -		tmp->arch.pause = true; +		tmp->arch.power_off = true;  		kvm_vcpu_kick(tmp);  	} |