[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH 2/3] x86/HVM: re-work hvm_wait_for_io() a little
> -----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 2/3] x86/HVM: re-work hvm_wait_for_io() a little > > Convert the function's main loop to a more ordinary one, without goto > and without initial steps not needing to be inside a loop at all. > > Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> > > --- a/xen/arch/x86/hvm/ioreq.c > +++ b/xen/arch/x86/hvm/ioreq.c > @@ -106,24 +106,17 @@ bool hvm_io_pending(struct vcpu *v) > static bool hvm_wait_for_io(struct hvm_ioreq_vcpu *sv, ioreq_t *p) > { > unsigned int prev_state = STATE_IOREQ_NONE; > + unsigned int state = p->state; > uint64_t data = ~0; > > - do { > - unsigned int state = p->state; Oh, you lose the loop here anyway so the conversion in patch #1 was only transient. > - > - smp_rmb(); > - > - recheck: > - if ( unlikely(state == STATE_IOREQ_NONE) ) > - { > - /* > - * The only reason we should see this case is when an > - * emulator is dying and it races with an I/O being > - * requested. > - */ > - break; > - } > + smp_rmb(); > > + /* > + * The only reason we should see this condition be false is when an > + * emulator dying races with I/O being requested. > + */ > + while ( likely(state != STATE_IOREQ_NONE) ) > + { > if ( unlikely(state < prev_state) ) > { > gdprintk(XENLOG_ERR, "Weird HVM ioreq state transition %u -> > %u\n", > @@ -139,20 +132,24 @@ static bool hvm_wait_for_io(struct hvm_i > p->state = STATE_IOREQ_NONE; > data = p->data; > break; > + Possibly mention the style fix-up in the comment comment. > case STATE_IOREQ_READY: /* IOREQ_{READY,INPROCESS} -> IORESP_READY > */ > case STATE_IOREQ_INPROCESS: > wait_on_xen_event_channel(sv->ioreq_evtchn, > ({ state = p->state; > smp_rmb(); > state != prev_state; })); > - goto recheck; > + continue; > + You could just break out of the switch now, I guess. Anyway... Reviewed-by: Paul Durrant <paul@xxxxxxx> > default: > gdprintk(XENLOG_ERR, "Weird HVM iorequest state %u\n", state); > sv->pending = false; > domain_crash(sv->vcpu->domain); > return false; /* bail */ > } > - } while ( false ); > + > + break; > + } > > p = &sv->vcpu->arch.hvm.hvm_io.io_req; > if ( hvm_ioreq_needs_completion(p) )
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |