File xen.trc-ioreq_server_select.patch of Package xen

From: Olaf Hering <olaf@aepfle.de>
Date: Thu, 15 Jun 2023 08:43:34 +0000
Subject: trc ioreq_server_select

Signed-off-by: Olaf Hering <olaf@aepfle.de>
---
 xen/common/ioreq.c | 20 ++++++---
 1 file changed, 15 insertions(+), 5 deletions(-)

--- a/xen/common/ioreq.c
+++ b/xen/common/ioreq.c
@@ -1322,71 +1322,81 @@ void ioreq_server_destroy_all(struct domain *d)
     }
 
     rspin_unlock(&d->ioreq_server.lock);
 }
 
 struct ioreq_server *ioreq_server_select(struct domain *d,
                                          ioreq_t *p)
 {
     struct ioreq_server *s;
     uint8_t type;
     uint64_t addr;
     unsigned int id;
+    trc_ioreq_server_select_t trc = {
+        .d = d->domain_id,
+        .type = p->type,
+    };
 
     if ( !arch_ioreq_server_get_type_addr(d, p, &type, &addr) )
-        return NULL;
+    {
+        s = NULL;
+        goto out;
+    }
 
     FOR_EACH_IOREQ_SERVER(d, id, s)
     {
         struct rangeset *r;
 
         if ( !s->enabled )
             continue;
 
         r = s->range[type];
 
         switch ( type )
         {
             unsigned long start, end;
 
         case XEN_DMOP_IO_RANGE_PORT:
             start = addr;
             end = start + p->size - 1;
             if ( rangeset_contains_range(r, start, end) )
-                return s;
+                goto out;
 
             break;
 
         case XEN_DMOP_IO_RANGE_MEMORY:
             start = ioreq_mmio_first_byte(p);
             end = ioreq_mmio_last_byte(p);
 
             if ( rangeset_contains_range(r, start, end) )
-                return s;
+                goto out;
 
             break;
 
         case XEN_DMOP_IO_RANGE_PCI:
             if ( rangeset_contains_singleton(r, addr >> 32) )
             {
                 p->type = IOREQ_TYPE_PCI_CONFIG;
                 p->addr = addr;
-                return s;
+                goto out;
             }
 
             break;
         }
     }
 
-    return NULL;
+out:
+    trc.s = TRC_ePTR(s);
+    TRACE_trc(TRC_IOREQ_ioreq_server_select);
+    return s;
 }
 
 static int ioreq_send_buffered(struct ioreq_server *s, ioreq_t *p)
 {
     struct domain *d = current->domain;
     struct ioreq_page *iorp;
     buffered_iopage_t *pg;
     buf_ioreq_t bp = { .data = p->data,
                        .addr = p->addr,
                        .type = p->type,
                        .dir = p->dir };
     /* Timeoffset sends 64b data, but no address. Use two consecutive slots. */
openSUSE Build Service is sponsored by