On Fri, May 29, 2026 at 03:41:15PM -0700, Dave Jiang wrote:
>
>
> On 5/23/26 2:43 AM, Anisa Su wrote:
> > From: Ira Weiny <[email protected]>
> >
> > CXL rev 3.1 section 8.2.9.2.1 adds the Dynamic Capacity Event Records.
> > User space can use trace events for debugging of DC capacity changes.
> >
> > Add DC trace points to the trace log.
> >
> > Based on an original patch by Navneet Singh.
> >
> > Reviewed-by: Jonathan Cameron <[email protected]>
> > Reviewed-by: Dave Jiang <[email protected]>
> > Reviewed-by: Fan Ni <[email protected]>
> > Signed-off-by: Ira Weiny <[email protected]>
added my signoff
> > ---
> > drivers/cxl/core/mbox.c | 5 ++++
> > drivers/cxl/core/trace.h | 65 ++++++++++++++++++++++++++++++++++++++++
> > 2 files changed, 70 insertions(+)
> >
> > diff --git a/drivers/cxl/core/mbox.c b/drivers/cxl/core/mbox.c
> > index 486110e1c03d..271f4556db85 100644
> > --- a/drivers/cxl/core/mbox.c
> > +++ b/drivers/cxl/core/mbox.c
> > @@ -1030,6 +1030,11 @@ static void __cxl_event_trace_record(struct
> > cxl_memdev *cxlmd,
> > ev_type = CXL_CPER_EVENT_MEM_MODULE;
> > else if (uuid_equal(uuid, &CXL_EVENT_MEM_SPARING_UUID))
> > ev_type = CXL_CPER_EVENT_MEM_SPARING;
> > + else if (uuid_equal(uuid, &CXL_EVENT_DC_EVENT_UUID)) {
> > +/* FIXME still valid? */
>
> ? address or delete?
>
Oopsie, deleted!
> > + trace_cxl_dynamic_capacity(cxlmd, type, &record->event.dcd);
> > + return;
> > + }
> >
> > cxl_event_trace_record(cxlmd, type, ev_type, uuid, &record->event);
> > }
> > diff --git a/drivers/cxl/core/trace.h b/drivers/cxl/core/trace.h
> > index a972e4ef1936..421e492d1b3f 100644
> > --- a/drivers/cxl/core/trace.h
> > +++ b/drivers/cxl/core/trace.h
> > @@ -1099,6 +1099,71 @@ TRACE_EVENT(cxl_poison,
> > )
> > );
> >
> > +/*
> > + * Dynamic Capacity Event Record - DER
> > + *
> > + * CXL rev 3.1 section 8.2.9.2.1.6 Table 8-50
>
> Let's move it to 4.0
>
Bumped up to 4.0
> > + */
> > +
> > +#define CXL_DC_ADD_CAPACITY 0x00
> > +#define CXL_DC_REL_CAPACITY 0x01
> > +#define CXL_DC_FORCED_REL_CAPACITY 0x02
> > +#define CXL_DC_REG_CONF_UPDATED 0x03
> > +#define show_dc_evt_type(type) __print_symbolic(type, \
> > + { CXL_DC_ADD_CAPACITY, "Add capacity"}, \
> > + { CXL_DC_REL_CAPACITY, "Release capacity"}, \
> > + { CXL_DC_FORCED_REL_CAPACITY, "Forced capacity release"}, \
> > + { CXL_DC_REG_CONF_UPDATED, "Region Configuration Updated" } \
> > +)
> > +
> > +TRACE_EVENT(cxl_dynamic_capacity,
> > +
> > + TP_PROTO(const struct cxl_memdev *cxlmd, enum cxl_event_log_type log,
> > + struct cxl_event_dcd *rec),
> > +
> > + TP_ARGS(cxlmd, log, rec),
> > +
> > + TP_STRUCT__entry(
> > + CXL_EVT_TP_entry
> > +
> > + /* Dynamic capacity Event */
> > + __field(u8, event_type)
> > + __field(u16, hostid)
> > + __field(u8, partition_id)
> > + __field(u64, dpa_start)
> > + __field(u64, length)
> > + __array(u8, uuid, UUID_SIZE)
> > + __field(u16, sh_extent_seq)
> > + ),
> > +
> > + TP_fast_assign(
> > + CXL_EVT_TP_fast_assign(cxlmd, log, rec->hdr);
> > +
> > + /* Dynamic_capacity Event */
> > + __entry->event_type = rec->event_type;
> > +
> > + /* DCD event record data */
> > + __entry->hostid = le16_to_cpu(rec->host_id);
> > + __entry->partition_id = rec->partition_index;
>
> CXL r4.0 8.2.10.2.1.6 Table 8-229
>
> Couple issues.
> 1. This is not partition_index, it's updated_region_index.
fixed
> 2. It's only valid for events of type Region Configuration Updated. Otherwise
> we may be displaying garbage or 0.
>
also fixed
/*
* The Updated Region Index is only defined for Region
* Configuration Updated events (Table 8-229); report U8_MAX
* (not a valid index) for other event types where the field
* is reserved.
*/
if (rec->event_type == CXL_DC_REG_CONF_UPDATED)
__entry->updated_region_index = rec->updated_region_index;
else
__entry->updated_region_index = U8_MAX;
> So it needs a rename and also a check for validity. Better to fix it before
> rasdaemon start picking it up.
>
> DJ
>
Thanks,
Anisa
> > + __entry->dpa_start = le64_to_cpu(rec->extent.start_dpa);
> > + __entry->length = le64_to_cpu(rec->extent.length);
> > + memcpy(__entry->uuid, &rec->extent.uuid, UUID_SIZE);
> > + __entry->sh_extent_seq =
> > le16_to_cpu(rec->extent.shared_extn_seq);
> > + ),
> > +
> > + CXL_EVT_TP_printk("event_type='%s' host_id='%d' partition_id='%d' " \
> > + "starting_dpa=%llx length=%llx tag=%pU " \
> > + "shared_extent_sequence=%d",
> > + show_dc_evt_type(__entry->event_type),
> > + __entry->hostid,
> > + __entry->partition_id,
> > + __entry->dpa_start,
> > + __entry->length,
> > + __entry->uuid,
> > + __entry->sh_extent_seq
> > + )
> > +);
> > +
> > #endif /* _CXL_EVENTS_H */
> >
> > #define TRACE_INCLUDE_FILE trace
>