From: Sean Christopherson <seanjc@google.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org
Subject: Re: [PATCH 3/6] KVM: x86: wean in-kernel PIO from vcpu->arch.pio*
Date: Thu, 9 Jun 2022 22:19:03 +0000 [thread overview]
Message-ID: <YqJx1/26XGLBX3AH@google.com> (raw)
In-Reply-To: <20220608121253.867333-4-pbonzini@redhat.com>
On Wed, Jun 08, 2022, Paolo Bonzini wrote:
> static void complete_emulator_pio_in(struct kvm_vcpu *vcpu, void *val)
> @@ -7482,16 +7486,11 @@ static int emulator_pio_in(struct kvm_vcpu *vcpu, int size,
> * shenanigans as KVM doesn't support modifying the rep count,
> * and the emulator ensures @count doesn't overflow the buffer.
> */
> + complete_emulator_pio_in(vcpu, val);
> + return 1;
> } else {
> - int r = __emulator_pio_in(vcpu, size, port, count);
> - if (!r)
> - return r;
> -
> - /* Results already available, fall through. */
> + return __emulator_pio_in(vcpu, size, port, val, count);
Any objections to not using an "else"? I.e.
if (vcpu->arch.pio.count) {
/*
* Complete a previous iteration that required userspace I/O.
* Note, @count isn't guaranteed to match pio.count as userspace
* can modify ECX before rerunning the vCPU. Ignore any such
* shenanigans as KVM doesn't support modifying the rep count,
* and the emulator ensures @count doesn't overflow the buffer.
*/
complete_emulator_pio_in(vcpu, val);
return 1;
}
return __emulator_pio_in(vcpu, size, port, val, count);
> }
> -
> - complete_emulator_pio_in(vcpu, val);
> - return 1;
> }
>
> static int emulator_pio_in_emulated(struct x86_emulate_ctxt *ctxt,
> @@ -7506,14 +7505,8 @@ static int emulator_pio_out(struct kvm_vcpu *vcpu, int size,
> unsigned short port, const void *val,
> unsigned int count)
> {
> - int ret;
> -
> trace_kvm_pio(KVM_PIO_OUT, port, size, count, val);
> - ret = emulator_pio_in_out(vcpu, size, port, (void *)val, count, false);
> - if (ret)
> - vcpu->arch.pio.count = 0;
> -
> - return ret;
> + return emulator_pio_in_out(vcpu, size, port, (void *)val, count, false);
> }
>
> static int emulator_pio_out_emulated(struct x86_emulate_ctxt *ctxt,
> @@ -13064,20 +13057,20 @@ static int kvm_sev_es_outs(struct kvm_vcpu *vcpu, unsigned int size,
> static int kvm_sev_es_ins(struct kvm_vcpu *vcpu, unsigned int size,
> unsigned int port);
>
> -static void advance_sev_es_emulated_ins(struct kvm_vcpu *vcpu)
> +static void advance_sev_es_emulated_ins(struct kvm_vcpu *vcpu, unsigned count, int size)
> {
> - unsigned count = vcpu->arch.pio.count;
> - complete_emulator_pio_in(vcpu, vcpu->arch.sev_pio_data);
> vcpu->arch.sev_pio_count -= count;
> - vcpu->arch.sev_pio_data += count * vcpu->arch.pio.size;
> + vcpu->arch.sev_pio_data += count * size;
> }
>
> static int complete_sev_es_emulated_ins(struct kvm_vcpu *vcpu)
> {
> + unsigned count = vcpu->arch.pio.count;
Opportunistically use an "unsigned int" if you spin another version?
> int size = vcpu->arch.pio.size;
> int port = vcpu->arch.pio.port;
>
> - advance_sev_es_emulated_ins(vcpu);
> + complete_emulator_pio_in(vcpu, vcpu->arch.sev_pio_data);
> + advance_sev_es_emulated_ins(vcpu, count, size);
Eww. The dependency between vcpu->arch.pio.count and complete_emulator_pio_in()
is nasty. Can you add a comment above count to reduce the likelihood of someone
using vcpu->arch.pio.count directly here instead of making a snapshot?
/*
* Snapshot the count before completing userspace I/O, which will
* consume the userspace data and thus clear vcpu->arch.pio.count.
*/
unsigned int count = vcpu->arch.pio.count;
> if (vcpu->arch.sev_pio_count)
> return kvm_sev_es_ins(vcpu, size, port);
> return 1;
> @@ -13089,11 +13082,11 @@ static int kvm_sev_es_ins(struct kvm_vcpu *vcpu, unsigned int size,
> for (;;) {
> unsigned int count =
> min_t(unsigned int, PAGE_SIZE / size, vcpu->arch.sev_pio_count);
> - if (!__emulator_pio_in(vcpu, size, port, count))
> + if (!__emulator_pio_in(vcpu, size, port, vcpu->arch.sev_pio_data, count))
> break;
>
> /* Emulation done by the kernel. */
> - advance_sev_es_emulated_ins(vcpu);
> + advance_sev_es_emulated_ins(vcpu, count, size);
> if (!vcpu->arch.sev_pio_count)
> return 1;
> }
> --
> 2.31.1
>
>
next prev parent reply other threads:[~2022-06-09 22:19 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-08 12:12 [PATCH 0/6] KVM: x86: vcpu->arch.pio* cleanups Paolo Bonzini
2022-06-08 12:12 ` [PATCH 1/6] KVM: x86: inline kernel_pio into its sole caller Paolo Bonzini
2022-06-09 21:33 ` Sean Christopherson
2022-06-08 12:12 ` [PATCH 2/6] KVM: x86: move all vcpu->arch.pio* setup in emulator_pio_in_out Paolo Bonzini
2022-06-09 22:03 ` Sean Christopherson
2022-06-08 12:12 ` [PATCH 3/6] KVM: x86: wean in-kernel PIO from vcpu->arch.pio* Paolo Bonzini
2022-06-09 22:19 ` Sean Christopherson [this message]
2022-06-08 12:12 ` [PATCH 4/6] KVM: x86: wean fast IN from emulator_pio_in Paolo Bonzini
2022-06-09 22:37 ` Sean Christopherson
2022-06-08 12:12 ` [PATCH 5/6] KVM: x86: de-underscorify __emulator_pio_in Paolo Bonzini
2022-06-09 22:42 ` Sean Christopherson
2022-06-08 12:12 ` [PATCH 6/6] KVM: SEV-ES: reuse advance_sev_es_emulated_ins for OUT too Paolo Bonzini
2022-06-09 22:50 ` Sean Christopherson
2022-06-15 14:41 ` Paolo Bonzini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YqJx1/26XGLBX3AH@google.com \
--to=seanjc@google.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.