Two more debug-prone paths benefit from trace coverage. Event log
insertion and clearing are exercised on every error injection or
dynamic capacity event, but their interaction with the per-log
overflow counter is currently opaque. CFMWS address decoding
translates a host physical address through up to two HDM decoder
lookups (host bridge and optional switch USP).

Add five trace points:

  * cxl_event_insert            - successful enqueue, log type and
                                  resulting depth
  * cxl_event_overflow          - the artificial overflow threshold
                                  was hit; an event was dropped
  * cxl_event_clear             - bulk clear, log type and request size

  * cxl_cfmws_lookup            - entry to address decoding, with
                                  the resolved fixed-window index
  * cxl_cfmws_target_resolved   - HDM decoder produced a target index
                                  (fires for both the host-bridge and
                                  switch USP lookups)

In non-passthrough topologies, a cxl_cfmws_lookup without a following
cxl_cfmws_target_resolved indicates the host-bridge HDM decode
failed. In passthrough mode the lookup resolves via
pcie_find_port_first() without an HDM target step, so no
target_resolved event is expected.

In cxl_event_insert(), cxl_event_count() is hoisted into a local
variable so its O(n) queue walk is performed once per insert rather
than twice (once for the trace point, once for the existing return-
value comparison).

Signed-off-by: Junjie Cao <[email protected]>
---
 hw/cxl/cxl-events.c | 8 +++++++-
 hw/cxl/cxl-host.c   | 4 ++++
 hw/cxl/trace-events | 9 +++++++++
 3 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/hw/cxl/cxl-events.c b/hw/cxl/cxl-events.c
index 5356dfb5b3..f4aa419953 100644
--- a/hw/cxl/cxl-events.c
+++ b/hw/cxl/cxl-events.c
@@ -13,6 +13,7 @@
 #include "hw/pci/msix.h"
 #include "hw/cxl/cxl.h"
 #include "hw/cxl/cxl_events.h"
+#include "trace.h"
 
 /* Artificial limit on the number of events a log can hold */
 #define CXL_TEST_EVENT_OVERFLOW 8
@@ -98,6 +99,7 @@ bool cxl_event_insert(CXLDeviceState *cxlds, CXLEventLogType 
log_type,
     uint64_t time;
     CXLEventLog *log;
     CXLEvent *entry;
+    int depth;
 
     if (log_type >= CXL_EVENT_TYPE_MAX) {
         return false;
@@ -115,6 +117,7 @@ bool cxl_event_insert(CXLDeviceState *cxlds, 
CXLEventLogType log_type,
         }
         log->overflow_err_count++;
         log->last_overflow_timestamp = time;
+        trace_cxl_event_overflow(log_type, log->overflow_err_count);
         return false;
     }
 
@@ -133,8 +136,10 @@ bool cxl_event_insert(CXLDeviceState *cxlds, 
CXLEventLogType log_type,
     QSIMPLEQ_INSERT_TAIL(&log->events, entry, node);
     cxl_event_set_status(cxlds, log_type, true);
 
+    depth = cxl_event_count(log);
+    trace_cxl_event_insert(log_type, depth);
     /* Count went from 0 to 1 */
-    return cxl_event_count(log) == 1;
+    return depth == 1;
 }
 
 void cxl_discard_all_event_records(CXLDeviceState *cxlds)
@@ -234,6 +239,7 @@ CXLRetCode cxl_event_clear_records(CXLDeviceState *cxlds,
         entry = cxl_event_get_head(log);
     }
 
+    trace_cxl_event_clear(log_type, pl->nr_recs);
     return CXL_MBOX_SUCCESS;
 }
 
diff --git a/hw/cxl/cxl-host.c b/hw/cxl/cxl-host.c
index a94b893e99..4157377a95 100644
--- a/hw/cxl/cxl-host.c
+++ b/hw/cxl/cxl-host.c
@@ -21,6 +21,7 @@
 #include "hw/pci/pci_host.h"
 #include "hw/pci/pcie_port.h"
 #include "hw/pci-bridge/pci_expander_bridge.h"
+#include "trace.h"
 
 static void cxl_fixed_memory_window_config(CXLFixedMemoryWindowOptions *object,
                                            int index, Error **errp)
@@ -168,6 +169,7 @@ static PCIDevice *cxl_cfmws_find_device(CXLFixedWindow *fw, 
hwaddr addr)
     bool target_found;
     PCIDevice *rp, *d;
 
+    trace_cxl_cfmws_lookup(addr, fw->index);
     rb_index = (addr / cxl_decode_ig(fw->enc_int_gran)) % fw->num_targets;
     hb = PCI_HOST_BRIDGE(fw->target_hbs[rb_index]->cxl_host_bridge);
     if (!hb || !hb->bus || !pci_bus_is_cxl(hb->bus)) {
@@ -191,6 +193,7 @@ static PCIDevice *cxl_cfmws_find_device(CXLFixedWindow *fw, 
hwaddr addr)
         if (!target_found) {
             return NULL;
         }
+        trace_cxl_cfmws_target_resolved(addr, target);
 
         rp = pcie_find_port_by_pn(hb->bus, target);
         if (!rp) {
@@ -227,6 +230,7 @@ static PCIDevice *cxl_cfmws_find_device(CXLFixedWindow *fw, 
hwaddr addr)
     if (!target_found) {
         return NULL;
     }
+    trace_cxl_cfmws_target_resolved(addr, target);
 
     d = pcie_find_port_by_pn(&PCI_BRIDGE(d)->sec_bus, target);
     if (!d) {
diff --git a/hw/cxl/trace-events b/hw/cxl/trace-events
index 15977dce6e..e5f196787d 100644
--- a/hw/cxl/trace-events
+++ b/hw/cxl/trace-events
@@ -10,3 +10,12 @@ cxl_mailbox_handler_return(uint16_t opcode, int ret, size_t 
len_out) "opcode=0x%
 # cxl-cdat.c
 cxl_cdat_init(const char *source) "source=%s"
 cxl_cdat_loaded(const char *filename, size_t length, int num_entries) 
"filename=%s length=%zu entries=%d"
+
+# cxl-events.c
+cxl_event_insert(int log_type, int depth) "log_type=%d depth=%d"
+cxl_event_overflow(int log_type, uint16_t overflow_err_count) "log_type=%d 
overflow_err_count=%u"
+cxl_event_clear(int log_type, int nr_recs) "log_type=%d nr_recs=%d"
+
+# cxl-host.c
+cxl_cfmws_lookup(uint64_t addr, int fw_index) "addr=0x%"PRIx64" fw=%d"
+cxl_cfmws_target_resolved(uint64_t addr, uint8_t target) "addr=0x%"PRIx64" 
target=0x%02x"
-- 
2.43.0


Reply via email to