Re: [PATCH 3/8] KVM: x86: leave vcpu->arch.pio.count alone in emulator_pio_in_out

Maxim Levitsky
2021-10-21T23:13:17Z

On Wed, 2021-10-13 at 12:56 -0400, Paolo Bonzini wrote:
> Currently emulator_pio_in clears vcpu->arch.pio.count twice if
> emulator_pio_in_out performs kernel PIO. Move the clear into
> emulator_pio_out where it is actually necessary.
>
> No functional change intended.
>
> Cc: stable@vger.kernel.org
> Fixes: 7ed9abfe8e9f ("KVM: SVM: Support string IO operations for an SEV-ES guest")
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> arch/x86/kvm/x86.c | 13 +++++++++----
> 1 file changed, 9 insertions(+), 4 deletions(-)
>
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index 722f5fcf76e1..218877e297e5 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -6914,10 +6914,8 @@ static int emulator_pio_in_out(struct kvm_vcpu *vcpu, int size,
> vcpu->arch.pio.count = count;
> vcpu->arch.pio.size = size;
>
> - if (!kernel_pio(vcpu, vcpu->arch.pio_data)) {
> - vcpu->arch.pio.count = 0;
> + if (!kernel_pio(vcpu, vcpu->arch.pio_data))
> return 1;
> - }
>
> vcpu->run->exit_reason = KVM_EXIT_IO;
> vcpu->run->io.direction = in ? KVM_EXIT_IO_IN : KVM_EXIT_IO_OUT;
> @@ -6963,9 +6961,16 @@ static int emulator_pio_out(struct kvm_vcpu *vcpu, int size,
> unsigned short port, const void *val,
> unsigned int count)
> {
> + int ret;
> +
> memcpy(vcpu->arch.pio_data, val, size * count);
> trace_kvm_pio(KVM_PIO_OUT, port, size, count, vcpu->arch.pio_data);
> - return emulator_pio_in_out(vcpu, size, port, (void *)val, count, false);
> + ret = emulator_pio_in_out(vcpu, size, port, (void *)val, count, false);
> + if (ret)
> + vcpu->arch.pio.count = 0;
> +
> + return ret;
> +
> }
>
> static int emulator_pio_out_emulated(struct x86_emulate_ctxt *ctxt,

Makes sense, now that both emulator_pio_in and emulator_pio_out clear the arch.pio.count once.

Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>

Best regards,
Maxim Levitsky