|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH 3/3] x86/HVM: fold both instances of looking up a hvm_ioreq_vcpu with a request pending
> -----Original Message-----
> From: Jan Beulich <jbeulich@xxxxxxxx>
> Sent: 15 July 2020 13:05
> 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 3/3] x86/HVM: fold both instances of looking up a
> hvm_ioreq_vcpu with a request
> pending
>
> It seems pretty likely that the "break" in the loop getting replaced in
> handle_hvm_io_completion() was meant to exit both nested loops at the
> same time. Re-purpose what has been hvm_io_pending() to hand back the
> struct hvm_ioreq_vcpu instance found, and use it to replace the two
> nested loops.
>
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Yes, much neater...
Reviewed-by: Paul Durrant <paul@xxxxxxx>
>
> --- a/xen/arch/x86/hvm/ioreq.c
> +++ b/xen/arch/x86/hvm/ioreq.c
> @@ -81,7 +81,8 @@ static ioreq_t *get_ioreq(struct hvm_ior
> return &p->vcpu_ioreq[v->vcpu_id];
> }
>
> -bool hvm_io_pending(struct vcpu *v)
> +static struct hvm_ioreq_vcpu *get_pending_vcpu(const struct vcpu *v,
> + struct hvm_ioreq_server
> **srvp)
> {
> struct domain *d = v->domain;
> struct hvm_ioreq_server *s;
> @@ -96,11 +97,20 @@ bool hvm_io_pending(struct vcpu *v)
> list_entry )
> {
> if ( sv->vcpu == v && sv->pending )
> - return true;
> + {
> + if ( srvp )
> + *srvp = s;
> + return sv;
> + }
> }
> }
>
> - return false;
> + return NULL;
> +}
> +
> +bool hvm_io_pending(struct vcpu *v)
> +{
> + return get_pending_vcpu(v, NULL);
> }
>
> static bool hvm_wait_for_io(struct hvm_ioreq_vcpu *sv, ioreq_t *p)
> @@ -165,8 +175,8 @@ bool handle_hvm_io_completion(struct vcp
> struct domain *d = v->domain;
> struct hvm_vcpu_io *vio = &v->arch.hvm.hvm_io;
> struct hvm_ioreq_server *s;
> + struct hvm_ioreq_vcpu *sv;
> enum hvm_io_completion io_completion;
> - unsigned int id;
>
> if ( has_vpci(d) && vpci_process_pending(v) )
> {
> @@ -174,23 +184,9 @@ bool handle_hvm_io_completion(struct vcp
> return false;
> }
>
> - FOR_EACH_IOREQ_SERVER(d, id, s)
> - {
> - struct hvm_ioreq_vcpu *sv;
> -
> - list_for_each_entry ( sv,
> - &s->ioreq_vcpu_list,
> - list_entry )
> - {
> - if ( sv->vcpu == v && sv->pending )
> - {
> - if ( !hvm_wait_for_io(sv, get_ioreq(s, v)) )
> - return false;
> -
> - break;
> - }
> - }
> - }
> + sv = get_pending_vcpu(v, &s);
> + if ( sv && !hvm_wait_for_io(sv, get_ioreq(s, v)) )
> + return false;
>
> vio->io_req.state = hvm_ioreq_needs_completion(&vio->io_req) ?
> STATE_IORESP_READY : STATE_IOREQ_NONE;
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |