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. Signed-off-by: Ira Weiny <[email protected]> Signed-off-by: Anisa Su <[email protected]> Reviewed-by: Jonathan Cameron <[email protected]> Reviewed-by: Dave Jiang <[email protected]> Reviewed-by: Fan Ni <[email protected]> --- Changes: [anisa: bump comments to reference the CXL r4.0 spec (section 8.2.10.2.1.6, Table 8-229).] [anisa: fix partition_index to updated_region_index, reporting it only for Region Configuration Updated events (U8_MAX otherwise).] --- drivers/cxl/core/mbox.c | 4 +++ drivers/cxl/core/trace.h | 75 ++++++++++++++++++++++++++++++++++++++++ include/cxl/event.h | 4 +-- 3 files changed, 81 insertions(+), 2 deletions(-) diff --git a/drivers/cxl/core/mbox.c b/drivers/cxl/core/mbox.c index 6f0d776e7e78..2e56ab639100 100644 --- a/drivers/cxl/core/mbox.c +++ b/drivers/cxl/core/mbox.c @@ -1027,6 +1027,10 @@ 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)) { + 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..e5b88887d11b 100644 --- a/drivers/cxl/core/trace.h +++ b/drivers/cxl/core/trace.h @@ -1099,6 +1099,81 @@ TRACE_EVENT(cxl_poison, ) ); +/* + * Dynamic Capacity Event Record - DER + * + * CXL r4.0 section 8.2.10.2.1.6 Table 8-229 + */ + +#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, updated_region_index) + __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); + __entry->hdr_uuid = CXL_EVENT_DC_EVENT_UUID; + + /* Dynamic_capacity Event */ + __entry->event_type = rec->event_type; + + /* DCD event record data */ + __entry->hostid = le16_to_cpu(rec->host_id); + /* + * 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; + __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' updated_region_index='%d' " \ + "starting_dpa=%llx length=%llx tag=%pU " \ + "shared_extent_sequence=%d", + show_dc_evt_type(__entry->event_type), + __entry->hostid, + __entry->updated_region_index, + __entry->dpa_start, + __entry->length, + __entry->uuid, + __entry->sh_extent_seq + ) +); + #endif /* _CXL_EVENTS_H */ #define TRACE_INCLUDE_FILE trace diff --git a/include/cxl/event.h b/include/cxl/event.h index fa3cd895f656..601eae40def9 100644 --- a/include/cxl/event.h +++ b/include/cxl/event.h @@ -161,7 +161,7 @@ struct cxl_extent_list_node { /* * Dynamic Capacity Event Record - * CXL rev 3.1 section 8.2.9.2.1.6; Table 8-50 + * CXL r4.0 section 8.2.10.2.1.6; Table 8-229 */ #define CXL_DCD_EVENT_MORE BIT(0) struct cxl_event_dcd { @@ -169,7 +169,7 @@ struct cxl_event_dcd { u8 event_type; u8 validity_flags; __le16 host_id; - u8 partition_index; + u8 updated_region_index; u8 flags; u8 reserved1[0x2]; struct cxl_extent extent; -- 2.43.0

