Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:olh:xen-unstable
xen
xen.trc-wait_for_io.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File xen.trc-wait_for_io.patch of Package xen
From: Olaf Hering <olaf@aepfle.de> Date: Thu, 15 Jun 2023 08:40:46 +0000 Subject: trc wait_for_io Signed-off-by: Olaf Hering <olaf@aepfle.de> --- xen/common/ioreq.c | 15 +++++++++ 1 file changed, 15 insertions(+) --- a/xen/common/ioreq.c +++ b/xen/common/ioreq.c @@ -197,42 +197,55 @@ bool vcpu_ioreq_pending(struct vcpu *v) .v = v->vcpu_id, .b = b, }; TRACE_trc(TRC_IOREQ_vcpu_ioreq_pending); return b; } static bool wait_for_io(struct ioreq_vcpu *sv, ioreq_t *p) { unsigned int prev_state = STATE_IOREQ_NONE; unsigned int state = p->state; uint64_t data = ~0; + trc_wait_for_io_t trc = { + .sv = TRC_ePTR(sv), + .d = sv->vcpu->domain->domain_id, + .v = sv->vcpu->vcpu_id, + .prev_state = prev_state, + .state = state, + .counter = 1, + }; + TRACE_trc(TRC_IOREQ_wait_for_io); 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 */ } + trc.counter++; + trc.state = state; + trc.prev_state = prev_state; + TRACE_trc(TRC_IOREQ_wait_for_io); 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(); @@ -240,24 +253,26 @@ static bool wait_for_io(struct ioreq_vcpu *sv, ioreq_t *p) continue; default: gdprintk(XENLOG_ERR, "Weird HVM iorequest state %u\n", state); sv->pending = false; domain_crash(sv->vcpu->domain); return false; /* bail */ } break; } + trc.counter = 0; + TRACE_trc(TRC_IOREQ_wait_for_io); p = &sv->vcpu->io.req; if ( ioreq_needs_completion(p) ) p->data = data; sv->pending = false; return true; } bool vcpu_ioreq_handle_completion(struct vcpu *v) { struct vcpu_io *vio = &v->io;
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor