|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH 1/3] x86/HVM: fold hvm_io_assist() into its only caller
> -----Original Message-----
> From: Jan Beulich <jbeulich@xxxxxxxx>
> Sent: 15 July 2020 13:04
> To: xen-devel@xxxxxxxxxxxxxxxxxxxx
> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>; Roger Pau Monné
> <roger.pau@xxxxxxxxxx>; Wei Liu
> <wl@xxxxxxx>; Paul Durrant <paul@xxxxxxx>
> Subject: [PATCH 1/3] x86/HVM: fold hvm_io_assist() into its only caller
>
> While there are two call sites, the function they're in can be slightly
> re-arranged such that the code sequence can be added at its bottom. Note
> that the function's only caller has already checked sv->pending, and
> that the prior while() loop was just a slightly more fancy if()
> (allowing an early break out of the construct).
>
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
>
> --- a/xen/arch/x86/hvm/ioreq.c
> +++ b/xen/arch/x86/hvm/ioreq.c
> @@ -103,23 +103,12 @@ bool hvm_io_pending(struct vcpu *v)
> return false;
> }
>
> -static void hvm_io_assist(struct hvm_ioreq_vcpu *sv, uint64_t data)
> -{
> - struct vcpu *v = sv->vcpu;
> - ioreq_t *ioreq = &v->arch.hvm.hvm_io.io_req;
> -
> - if ( hvm_ioreq_needs_completion(ioreq) )
> - ioreq->data = data;
> -
> - sv->pending = false;
> -}
> -
> static bool hvm_wait_for_io(struct hvm_ioreq_vcpu *sv, ioreq_t *p)
> {
> unsigned int prev_state = STATE_IOREQ_NONE;
> + uint64_t data = ~0;
>
> - while ( sv->pending )
> - {
> + do {
> unsigned int state = p->state;
I guess this is beneficial from the point of view of restricting cope and...
>
> smp_rmb();
> @@ -132,7 +121,6 @@ static bool hvm_wait_for_io(struct hvm_i
> * emulator is dying and it races with an I/O being
> * requested.
> */
> - hvm_io_assist(sv, ~0ul);
> break;
...(as you say) allowing this early break, but a forward jump to an 'out' label
would be more consistent with other code. It works though so...
Reviewed-by: Paul Durrant <paul@xxxxxxx>
> }
>
> @@ -149,7 +137,7 @@ static bool hvm_wait_for_io(struct hvm_i
> {
> case STATE_IORESP_READY: /* IORESP_READY -> NONE */
> p->state = STATE_IOREQ_NONE;
> - hvm_io_assist(sv, p->data);
> + data = p->data;
> break;
> case STATE_IOREQ_READY: /* IOREQ_{READY,INPROCESS} -> IORESP_READY
> */
> case STATE_IOREQ_INPROCESS:
> @@ -164,7 +152,13 @@ static bool hvm_wait_for_io(struct hvm_i
> domain_crash(sv->vcpu->domain);
> return false; /* bail */
> }
> - }
> + } while ( false );
> +
> + p = &sv->vcpu->arch.hvm.hvm_io.io_req;
> + if ( hvm_ioreq_needs_completion(p) )
> + p->data = data;
> +
> + sv->pending = false;
>
> return true;
> }
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |