[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH V1 02/16] xen/ioreq: Make x86's IOREQ feature common
> -----Original Message----- > From: Julien Grall <julien@xxxxxxx> > Sent: 24 September 2020 19:01 > To: Oleksandr Tyshchenko <olekstysh@xxxxxxxxx>; xen-devel@xxxxxxxxxxxxxxxxxxxx > Cc: Oleksandr Tyshchenko <oleksandr_tyshchenko@xxxxxxxx>; Andrew Cooper > <andrew.cooper3@xxxxxxxxxx>; > George Dunlap <george.dunlap@xxxxxxxxxx>; Ian Jackson > <ian.jackson@xxxxxxxxxxxxx>; Jan Beulich > <jbeulich@xxxxxxxx>; Stefano Stabellini <sstabellini@xxxxxxxxxx>; Wei Liu > <wl@xxxxxxx>; Roger Pau > Monné <roger.pau@xxxxxxxxxx>; Paul Durrant <paul@xxxxxxx>; Jun Nakajima > <jun.nakajima@xxxxxxxxx>; > Kevin Tian <kevin.tian@xxxxxxxxx>; Tim Deegan <tim@xxxxxxx>; Julien Grall > <julien.grall@xxxxxxx> > Subject: Re: [PATCH V1 02/16] xen/ioreq: Make x86's IOREQ feature common > > > > On 10/09/2020 21:21, Oleksandr Tyshchenko wrote: > > +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; > > + > > + 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", > > + prev_state, state); > > + sv->pending = false; > > + domain_crash(sv->vcpu->domain); > > + return false; /* bail */ > > + } > > + > > + switch ( prev_state = state ) > > + { > > + case STATE_IORESP_READY: /* IORESP_READY -> NONE */ > > + p->state = STATE_IOREQ_NONE; > > + data = p->data; > > + break; > > + > > + 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; })); > > + continue; > > As I pointed out previously [1], this helper was implemented with the > expectation that wait_on_xen_event_channel() will not return if the vCPU > got rescheduled. > > However, this assumption doesn't hold on Arm. > > I can see two solution: > 1) Re-execute the caller > 2) Prevent an IOREQ to disappear until the loop finish. > > @Paul any opinions? The ioreq control plane is largely predicated on there being no pending I/O when the state of a server is modified, and it is assumed that domain_pause() is sufficient to achieve this. If that assumption doesn't hold then we need additional synchronization. Paul > > Cheers, > > [1] > https://lore.kernel.org/xen-devel/6bfc3920-8f29-188c-cff4-2b99dabe166f@xxxxxxx/ > > > -- > Julien Grall
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |