cxl/trace: Properly initialize cxl_poison region name

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: ddf49d57b8 ("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>
This commit is contained in:
Alison Schofield 2024-03-14 13:12:17 -07:00 committed by Steven Rostedt (Google)
parent 3f9952e8d8
commit 6c87126096

View File

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