Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7ee78855 authored by Alexander Graf's avatar Alexander Graf
Browse files

KVM: PPC: Add return value in prepare_to_enter



Our prepare_to_enter helper wants to be able to return in more circumstances
to the host than only when an interrupt is pending. Broaden the interface a
bit and move even more generic code to the generic helper.

Signed-off-by: default avatarAlexander Graf <agraf@suse.de>
parent 206c2ed7
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -589,6 +589,7 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
                       unsigned int exit_nr)
{
	int r = RESUME_HOST;
	int s;

	vcpu->stat.sum_exits++;

@@ -862,10 +863,10 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
		 * again due to a host external interrupt.
		 */
		local_irq_disable();
		if (kvmppc_prepare_to_enter(vcpu)) {
		s = kvmppc_prepare_to_enter(vcpu);
		if (s <= 0) {
			local_irq_enable();
			run->exit_reason = KVM_EXIT_INTR;
			r = -EINTR;
			r = s;
		} else {
			kvmppc_lazy_ee_enable();
		}
@@ -1074,10 +1075,9 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
	 * a host external interrupt.
	 */
	local_irq_disable();
	if (kvmppc_prepare_to_enter(vcpu)) {
	ret = kvmppc_prepare_to_enter(vcpu);
	if (ret <= 0) {
		local_irq_enable();
		kvm_run->exit_reason = KVM_EXIT_INTR;
		ret = -EINTR;
		goto out;
	}

+8 −8
Original line number Diff line number Diff line
@@ -467,7 +467,7 @@ void kvmppc_core_check_requests(struct kvm_vcpu *vcpu)

int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
{
	int ret;
	int ret, s;
#ifdef CONFIG_PPC_FPU
	unsigned int fpscr;
	int fpexc_mode;
@@ -480,10 +480,10 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
	}

	local_irq_disable();
	if (kvmppc_prepare_to_enter(vcpu)) {
	s = kvmppc_prepare_to_enter(vcpu);
	if (s <= 0) {
		local_irq_enable();
		kvm_run->exit_reason = KVM_EXIT_INTR;
		ret = -EINTR;
		ret = s;
		goto out;
	}
	kvmppc_lazy_ee_enable();
@@ -642,6 +642,7 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
                       unsigned int exit_nr)
{
	int r = RESUME_HOST;
	int s;

	/* update before a new last_exit_type is rewritten */
	kvmppc_update_timing_stats(vcpu);
@@ -948,11 +949,10 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
	 */
	if (!(r & RESUME_HOST)) {
		local_irq_disable();
		if (kvmppc_prepare_to_enter(vcpu)) {
		s = kvmppc_prepare_to_enter(vcpu);
		if (s <= 0) {
			local_irq_enable();
			run->exit_reason = KVM_EXIT_INTR;
			r = (-EINTR << 2) | RESUME_HOST | (r & RESUME_FLAG_NV);
			kvmppc_account_exit(vcpu, SIGNAL_EXITS);
			r = (s << 2) | RESUME_HOST | (r & RESUME_FLAG_NV);
		} else {
			kvmppc_lazy_ee_enable();
		}
+8 −3
Original line number Diff line number Diff line
@@ -53,11 +53,14 @@ int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu)
 * Common checks before entering the guest world.  Call with interrupts
 * disabled.
 *
 * returns !0 if a signal is pending and check_signal is true
 * returns:
 *
 * == 1 if we're ready to go into guest state
 * <= 0 if we need to go back to the host with return value
 */
int kvmppc_prepare_to_enter(struct kvm_vcpu *vcpu)
{
	int r = 0;
	int r = 1;

	WARN_ON_ONCE(!irqs_disabled());
	while (true) {
@@ -69,7 +72,9 @@ int kvmppc_prepare_to_enter(struct kvm_vcpu *vcpu)
		}

		if (signal_pending(current)) {
			r = 1;
			kvmppc_account_exit(vcpu, SIGNAL_EXITS);
			vcpu->run->exit_reason = KVM_EXIT_INTR;
			r = -EINTR;
			break;
		}