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;
openSUSE Build Service is sponsored by