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
> 

Reply via email to