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;