cxl/trace: Properly initialize cxl_poison region name
authorAlison Schofield <alison.schofield@intel.com>
Thu, 14 Mar 2024 20:12:17 +0000 (13:12 -0700)
committerSteven Rostedt (Google) <rostedt@goodmis.org>
Mon, 18 Mar 2024 14:26:03 +0000 (10:26 -0400)
The TP_STRUCT__entry that gets assigned the region name, or an
empty string if no region is present, is erroneously initialized
to the cxl_region pointer. It needs to be properly initialized
otherwise it's length is wrong and garbage chars can appear in
the kernel trace output: /sys/kernel/tracing/trace

The bad initialization was due in part to a naming conflict with
the parameter: struct cxl_region *region. The field 'region' is
already exposed externally as the region name, so changing that
to something logical, like 'region_name' is not an option. Instead
rename the internal only struct cxl_region to the commonly used
'cxlr'.

Impact is that tooling depending on that trace data can miss
picking up a valid event when searching by region name. The
TP_printk() output, if enabled, does emit the correct region
names in the dmesg log.

This was found during testing of the cxl-list option to report
media-errors for a region.

Cc: Davidlohr Bueso <dave@stgolabs.net>
Cc: Jonathan Cameron <jonathan.cameron@huawei.com>
Cc: Dave Jiang <dave.jiang@intel.com>
Cc: Vishal Verma <vishal.l.verma@intel.com>
Cc: stable@vger.kernel.org
Fixes: ddf49d57b841 ("cxl/trace: Add TRACE support for CXL media-error records")
Signed-off-by: Alison Schofield <alison.schofield@intel.com>
Reviewed-by: Ira Weiny <ira.weiny@intel.com>
Acked-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
drivers/cxl/core/trace.h

index bdf117a..e5f1326 100644 (file)
@@ -646,18 +646,18 @@ u64 cxl_trace_hpa(struct cxl_region *cxlr, struct cxl_memdev *memdev, u64 dpa);
 
 TRACE_EVENT(cxl_poison,
 
-       TP_PROTO(struct cxl_memdev *cxlmd, struct cxl_region *region,
+       TP_PROTO(struct cxl_memdev *cxlmd, struct cxl_region *cxlr,
                 const struct cxl_poison_record *record, u8 flags,
                 __le64 overflow_ts, enum cxl_poison_trace_type trace_type),
 
-       TP_ARGS(cxlmd, region, record, flags, overflow_ts, trace_type),
+       TP_ARGS(cxlmd, cxlr, record, flags, overflow_ts, trace_type),
 
        TP_STRUCT__entry(
                __string(memdev, dev_name(&cxlmd->dev))
                __string(host, dev_name(cxlmd->dev.parent))
                __field(u64, serial)
                __field(u8, trace_type)
-               __string(region, region)
+               __string(region, cxlr ? dev_name(&cxlr->dev) : "")
                __field(u64, overflow_ts)
                __field(u64, hpa)
                __field(u64, dpa)
@@ -677,10 +677,10 @@ TRACE_EVENT(cxl_poison,
                __entry->source = cxl_poison_record_source(record);
                __entry->trace_type = trace_type;
                __entry->flags = flags;
-               if (region) {
-                       __assign_str(region, dev_name(&region->dev));
-                       memcpy(__entry->uuid, &region->params.uuid, 16);
-                       __entry->hpa = cxl_trace_hpa(region, cxlmd,
+               if (cxlr) {
+                       __assign_str(region, dev_name(&cxlr->dev));
+                       memcpy(__entry->uuid, &cxlr->params.uuid, 16);
+                       __entry->hpa = cxl_trace_hpa(cxlr, cxlmd,
                                                     __entry->dpa);
                } else {
                        __assign_str(region, "");