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. */