Message ID | 061d1eac5d4e270337911199f0b0633c0ff230b4.1711598777.git.alison.schofield@intel.com |
---|---|
State | Superseded |
Headers | show |
Series | Add DPA->HPA translation to dram & general_media | expand |
On Wed, 27 Mar 2024 21:36:32 -0700 alison.schofield@intel.com wrote: > From: Alison Schofield <alison.schofield@intel.com> > > User space may need to know which region, if any, maps the DPAs > (device physical addresses) reported in a cxl_general_media or > cxl_dram event. Since the mapping can change, the kernel provides > this information at the time the event occurs. This informs user > space that at event <timestamp> this <region> mapped this <DPA> > to this <HPA>. > > Add the same region info that is included in the cxl_poison trace > event: the DPA->HPA translation, region name, and region uuid. > Introduce and use new helpers that lookup that region info using > the struct cxl_memdev and a DPA. > > The new fields are inserted in the trace event and no existing > fields are modified. If the DPA is not mapped, user will see: > hpa=ULLONG_MAX, region="", and uuid=0 > > This work must be protected by dpa_rwsem & region_rwsem since > it is looking up region mappings. > > Signed-off-by: Alison Schofield <alison.schofield@intel.com> One query one the stub.. Otherwise all lgtm Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> > --- > drivers/cxl/core/core.h | 6 +++++ > drivers/cxl/core/mbox.c | 17 ++++++++++---- > drivers/cxl/core/region.c | 8 +++++++ > drivers/cxl/core/trace.h | 47 ++++++++++++++++++++++++++++++++++----- > 4 files changed, 69 insertions(+), 9 deletions(-) > > diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h > index 24454a1cb250..848ef6904beb 100644 > --- a/drivers/cxl/core/core.h > +++ b/drivers/cxl/core/core.h > @@ -30,8 +30,14 @@ int cxl_get_poison_by_endpoint(struct cxl_port *port); > struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 dpa); > u64 cxl_trace_hpa(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd, > u64 dpa); > +const char *cxl_trace_to_region_name(const struct cxl_memdev *cxlmd, u64 dpa); > > #else > +static inline > +const char *cxl_trace_to_region_name(const struct cxl_memdev *cxlmd, u64 dpa) > +{ > + return NULL; Is this ever going to be a problem for the reason you have commented below? Maybe return "" ? ... > diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c > index 45eb9c560fd6..a5b1eaee1e58 100644 > --- a/drivers/cxl/core/region.c > +++ b/drivers/cxl/core/region.c > @@ -2723,6 +2723,14 @@ struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 dpa) > return ctx.cxlr; > } > > +const char *cxl_trace_to_region_name(const struct cxl_memdev *cxlmd, u64 dpa) > +{ > + struct cxl_region *cxlr = cxl_dpa_to_region(cxlmd, dpa); > + > + /* trace __string() assignment requires "", not NULL */ > + return cxlr ? dev_name(&cxlr->dev) : ""; > +} > +
On Wed, Apr 03, 2024 at 09:16:13PM +0100, Jonathan Cameron wrote: > On Wed, 27 Mar 2024 21:36:32 -0700 > alison.schofield@intel.com wrote: > > > From: Alison Schofield <alison.schofield@intel.com> > > > > User space may need to know which region, if any, maps the DPAs > > (device physical addresses) reported in a cxl_general_media or > > cxl_dram event. Since the mapping can change, the kernel provides > > this information at the time the event occurs. This informs user > > space that at event <timestamp> this <region> mapped this <DPA> > > to this <HPA>. > > > > Add the same region info that is included in the cxl_poison trace > > event: the DPA->HPA translation, region name, and region uuid. > > Introduce and use new helpers that lookup that region info using > > the struct cxl_memdev and a DPA. > > > > The new fields are inserted in the trace event and no existing > > fields are modified. If the DPA is not mapped, user will see: > > hpa=ULLONG_MAX, region="", and uuid=0 > > > > This work must be protected by dpa_rwsem & region_rwsem since > > it is looking up region mappings. > > > > Signed-off-by: Alison Schofield <alison.schofield@intel.com> > One query one the stub.. Otherwise all lgtm > Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> > > > --- > > drivers/cxl/core/core.h | 6 +++++ > > drivers/cxl/core/mbox.c | 17 ++++++++++---- > > drivers/cxl/core/region.c | 8 +++++++ > > drivers/cxl/core/trace.h | 47 ++++++++++++++++++++++++++++++++++----- > > 4 files changed, 69 insertions(+), 9 deletions(-) > > > > diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h > > index 24454a1cb250..848ef6904beb 100644 > > --- a/drivers/cxl/core/core.h > > +++ b/drivers/cxl/core/core.h > > @@ -30,8 +30,14 @@ int cxl_get_poison_by_endpoint(struct cxl_port *port); > > struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 dpa); > > u64 cxl_trace_hpa(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd, > > u64 dpa); > > +const char *cxl_trace_to_region_name(const struct cxl_memdev *cxlmd, u64 dpa); > > > > #else > > +static inline > > +const char *cxl_trace_to_region_name(const struct cxl_memdev *cxlmd, u64 dpa) > > +{ > > + return NULL; > > Is this ever going to be a problem for the reason you have commented below? > > Maybe > return "" > ? > > ... Yep. I'll make it "". Also, I'll includ Steve Rostedt on v2. He's making changes around assign_str() so maybe this patch can align w a simpler assign_str(). Thanks Jonathan! > > > diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c > > index 45eb9c560fd6..a5b1eaee1e58 100644 > > --- a/drivers/cxl/core/region.c > > +++ b/drivers/cxl/core/region.c > > @@ -2723,6 +2723,14 @@ struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 dpa) > > return ctx.cxlr; > > } > > > > +const char *cxl_trace_to_region_name(const struct cxl_memdev *cxlmd, u64 dpa) > > +{ > > + struct cxl_region *cxlr = cxl_dpa_to_region(cxlmd, dpa); > > + > > + /* trace __string() assignment requires "", not NULL */ > > + return cxlr ? dev_name(&cxlr->dev) : ""; > > +} > > + > > >
alison.schofield@ wrote: > From: Alison Schofield <alison.schofield@intel.com> > [snip] > diff --git a/drivers/cxl/core/trace.h b/drivers/cxl/core/trace.h > index 161bdb5734b0..6ad4998aeb9a 100644 > --- a/drivers/cxl/core/trace.h > +++ b/drivers/cxl/core/trace.h > @@ -14,6 +14,22 @@ > #include <cxlmem.h> > #include "core.h" > > +#define to_region_name(cxlmd, dpa) \ > + (cxl_trace_to_region_name(cxlmd, dpa)) NIT: Is this macro really needed? > + > +#define store_region_info(cxlmd, dpa, entry_uuid, entry_hpa) \ > + do { \ > + struct cxl_region *cxlr; \ > + \ > + cxlr = cxl_dpa_to_region(cxlmd, dpa); \ > + if (cxlr) { \ > + uuid_copy(&(entry_uuid), &cxlr->params.uuid); \ > + entry_hpa = cxl_trace_hpa(cxlr, cxlmd, dpa); \ > + } else { \ Does the record get zeroed such that uuid is 0 here? > + entry_hpa = ULLONG_MAX; \ > + } \ > + } while (0) > + > #define CXL_RAS_UC_CACHE_DATA_PARITY BIT(0) > #define CXL_RAS_UC_CACHE_ADDR_PARITY BIT(1) > #define CXL_RAS_UC_CACHE_BE_PARITY BIT(2) > @@ -313,6 +329,9 @@ TRACE_EVENT(cxl_generic_event, > { CXL_GMER_VALID_COMPONENT, "COMPONENT" } \ > ) > > +#define to_gm_dpa(record) \ Curious: what does 'gm' stand for? > + (le64_to_cpu(rec->phys_addr) & CXL_DPA_MASK) > + > TRACE_EVENT(cxl_general_media, > > TP_PROTO(const struct cxl_memdev *cxlmd, enum cxl_event_log_type log, > @@ -330,10 +349,13 @@ TRACE_EVENT(cxl_general_media, > __field(u8, channel) > __field(u32, device) > __array(u8, comp_id, CXL_EVENT_GEN_MED_COMP_ID_SIZE) > - __field(u16, validity_flags) > /* Following are out of order to pack trace record */ > + __field(u64, hpa) > + __field_struct(uuid_t, region_uuid) > + __field(u16, validity_flags) > __field(u8, rank) > __field(u8, dpa_flags) > + __string(region_name, to_region_name(cxlmd, to_gm_dpa(record))) > ), > > TP_fast_assign( > @@ -354,18 +376,23 @@ TRACE_EVENT(cxl_general_media, > memcpy(__entry->comp_id, &rec->component_id, > CXL_EVENT_GEN_MED_COMP_ID_SIZE); > __entry->validity_flags = get_unaligned_le16(&rec->validity_flags); > + __assign_str(region_name, to_region_name(cxlmd, to_gm_dpa(record))); > + store_region_info(cxlmd, to_gm_dpa(record), > + __entry->region_uuid, __entry->hpa); > ), > > CXL_EVT_TP_printk("dpa=%llx dpa_flags='%s' " \ > "descriptor='%s' type='%s' transaction_type='%s' channel=%u rank=%u " \ > - "device=%x comp_id=%s validity_flags='%s'", > + "device=%x comp_id=%s validity_flags='%s' " \ > + "hpa=%llx region=%s region_uuid=%pUb", > __entry->dpa, show_dpa_flags(__entry->dpa_flags), > show_event_desc_flags(__entry->descriptor), > show_mem_event_type(__entry->type), > show_trans_type(__entry->transaction_type), > __entry->channel, __entry->rank, __entry->device, > __print_hex(__entry->comp_id, CXL_EVENT_GEN_MED_COMP_ID_SIZE), > - show_valid_flags(__entry->validity_flags) > + show_valid_flags(__entry->validity_flags), > + __entry->hpa, __get_str(region_name), &__entry->region_uuid > ) > ); > > @@ -396,6 +423,8 @@ TRACE_EVENT(cxl_general_media, > { CXL_DER_VALID_COLUMN, "COLUMN" }, \ > { CXL_DER_VALID_CORRECTION_MASK, "CORRECTION MASK" } \ > ) > +#define to_dram_dpa(record) \ > + (le64_to_cpu(rec->phys_addr) & CXL_DPA_MASK) Oh. 'gm' was general media. This should be a common macro... Perhaps. #define rec_pa_to_dpa(record) \ (le64_to_cpu(rec->phys_addr) & CXL_DPA_MASK) ? Ira > > TRACE_EVENT(cxl_dram, > > @@ -417,10 +446,13 @@ TRACE_EVENT(cxl_dram, > __field(u32, nibble_mask) > __field(u32, row) > __array(u8, cor_mask, CXL_EVENT_DER_CORRECTION_MASK_SIZE) > + __field(u64, hpa) > + __field_struct(uuid_t, region_uuid) > __field(u8, rank) /* Out of order to pack trace record */ > __field(u8, bank_group) /* Out of order to pack trace record */ > __field(u8, bank) /* Out of order to pack trace record */ > __field(u8, dpa_flags) /* Out of order to pack trace record */ > + __string(region_name, to_region_name(cxlmd, to_dram_dpa(record))) > ), > > TP_fast_assign( > @@ -444,12 +476,16 @@ TRACE_EVENT(cxl_dram, > __entry->column = get_unaligned_le16(rec->column); > memcpy(__entry->cor_mask, &rec->correction_mask, > CXL_EVENT_DER_CORRECTION_MASK_SIZE); > + __assign_str(region_name, to_region_name(cxlmd, to_dram_dpa(record))); > + store_region_info(cxlmd, __entry->dpa, __entry->region_uuid, > + __entry->hpa); > ), > > CXL_EVT_TP_printk("dpa=%llx dpa_flags='%s' descriptor='%s' type='%s' " \ > "transaction_type='%s' channel=%u rank=%u nibble_mask=%x " \ > "bank_group=%u bank=%u row=%u column=%u cor_mask=%s " \ > - "validity_flags='%s'", > + "validity_flags='%s'" \ > + "hpa=%llx region=%s region_uuid=%pUb", > __entry->dpa, show_dpa_flags(__entry->dpa_flags), > show_event_desc_flags(__entry->descriptor), > show_mem_event_type(__entry->type), > @@ -458,7 +494,8 @@ TRACE_EVENT(cxl_dram, > __entry->bank_group, __entry->bank, > __entry->row, __entry->column, > __print_hex(__entry->cor_mask, CXL_EVENT_DER_CORRECTION_MASK_SIZE), > - show_dram_valid_flags(__entry->validity_flags) > + show_dram_valid_flags(__entry->validity_flags), > + __entry->hpa, __get_str(region_name), &__entry->region_uuid > ) > ); > > -- > 2.37.3 >
+ Steve On Tue, Apr 16, 2024 at 10:01:21AM -0700, Ira Weiny wrote: > alison.schofield@ wrote: > > From: Alison Schofield <alison.schofield@intel.com> > > > > [snip] > > > diff --git a/drivers/cxl/core/trace.h b/drivers/cxl/core/trace.h > > index 161bdb5734b0..6ad4998aeb9a 100644 > > --- a/drivers/cxl/core/trace.h > > +++ b/drivers/cxl/core/trace.h > > @@ -14,6 +14,22 @@ > > #include <cxlmem.h> > > #include "core.h" > > snip > > +#define store_region_info(cxlmd, dpa, entry_uuid, entry_hpa) \ > > + do { \ > > + struct cxl_region *cxlr; \ > > + \ > > + cxlr = cxl_dpa_to_region(cxlmd, dpa); \ > > + if (cxlr) { \ > > + uuid_copy(&(entry_uuid), &cxlr->params.uuid); \ > > + entry_hpa = cxl_trace_hpa(cxlr, cxlmd, dpa); \ > > + } else { \ > > Does the record get zeroed such that uuid is 0 here? It appears in my usage, but I don't know for sure. CC'ing Steve to tell me if the TP_PROTO macro initializes the __field_struct to zero. Left in the snippets below that shows its definition... > > > + entry_hpa = ULLONG_MAX; \ > > + } \ > > + } while (0) snip > > TRACE_EVENT(cxl_general_media, > > > > TP_PROTO(const struct cxl_memdev *cxlmd, enum cxl_event_log_type log, > > @@ -330,10 +349,13 @@ TRACE_EVENT(cxl_general_media, > > __field(u8, channel) > > __field(u32, device) > > __array(u8, comp_id, CXL_EVENT_GEN_MED_COMP_ID_SIZE) > > - __field(u16, validity_flags) > > /* Following are out of order to pack trace record */ > > + __field(u64, hpa) > > + __field_struct(uuid_t, region_uuid) > > + __field(u16, validity_flags) > > __field(u8, rank) > > __field(u8, dpa_flags) > > + __string(region_name, to_region_name(cxlmd, to_gm_dpa(record))) > > ), > > > > TP_fast_assign( > > @@ -354,18 +376,23 @@ TRACE_EVENT(cxl_general_media, > > memcpy(__entry->comp_id, &rec->component_id, > > CXL_EVENT_GEN_MED_COMP_ID_SIZE); > > __entry->validity_flags = get_unaligned_le16(&rec->validity_flags); > > + __assign_str(region_name, to_region_name(cxlmd, to_gm_dpa(record))); > > + store_region_info(cxlmd, to_gm_dpa(record), > > + __entry->region_uuid, __entry->hpa); > > ), > > > > CXL_EVT_TP_printk("dpa=%llx dpa_flags='%s' " \ > > "descriptor='%s' type='%s' transaction_type='%s' channel=%u rank=%u " \ > > - "device=%x comp_id=%s validity_flags='%s'", > > + "device=%x comp_id=%s validity_flags='%s' " \ > > + "hpa=%llx region=%s region_uuid=%pUb", > > __entry->dpa, show_dpa_flags(__entry->dpa_flags), > > show_event_desc_flags(__entry->descriptor), > > show_mem_event_type(__entry->type), > > show_trans_type(__entry->transaction_type), > > __entry->channel, __entry->rank, __entry->device, > > __print_hex(__entry->comp_id, CXL_EVENT_GEN_MED_COMP_ID_SIZE), > > - show_valid_flags(__entry->validity_flags) > > + show_valid_flags(__entry->validity_flags), > > + __entry->hpa, __get_str(region_name), &__entry->region_uuid > > ) > > ); > >
diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h index 24454a1cb250..848ef6904beb 100644 --- a/drivers/cxl/core/core.h +++ b/drivers/cxl/core/core.h @@ -30,8 +30,14 @@ int cxl_get_poison_by_endpoint(struct cxl_port *port); struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 dpa); u64 cxl_trace_hpa(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd, u64 dpa); +const char *cxl_trace_to_region_name(const struct cxl_memdev *cxlmd, u64 dpa); #else +static inline +const char *cxl_trace_to_region_name(const struct cxl_memdev *cxlmd, u64 dpa) +{ + return NULL; +} static inline u64 cxl_trace_hpa(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd, u64 dpa) { diff --git a/drivers/cxl/core/mbox.c b/drivers/cxl/core/mbox.c index 9adda4795eb7..3c1c37d5fcb0 100644 --- a/drivers/cxl/core/mbox.c +++ b/drivers/cxl/core/mbox.c @@ -842,14 +842,23 @@ void cxl_event_trace_record(const struct cxl_memdev *cxlmd, enum cxl_event_type event_type, const uuid_t *uuid, union cxl_event *evt) { + if (event_type == CXL_CPER_EVENT_MEM_MODULE) { + trace_cxl_memory_module(cxlmd, type, &evt->mem_module); + return; + } + if (event_type == CXL_CPER_EVENT_GENERIC) { + trace_cxl_generic_event(cxlmd, type, uuid, &evt->generic); + return; + } + + /* Protect trace events that do DPA->HPA translations */ + guard(rwsem_read)(&cxl_region_rwsem); + guard(rwsem_read)(&cxl_dpa_rwsem); + if (event_type == CXL_CPER_EVENT_GEN_MEDIA) trace_cxl_general_media(cxlmd, type, &evt->gen_media); else if (event_type == CXL_CPER_EVENT_DRAM) trace_cxl_dram(cxlmd, type, &evt->dram); - else if (event_type == CXL_CPER_EVENT_MEM_MODULE) - trace_cxl_memory_module(cxlmd, type, &evt->mem_module); - else - trace_cxl_generic_event(cxlmd, type, uuid, &evt->generic); } EXPORT_SYMBOL_NS_GPL(cxl_event_trace_record, CXL); diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index 45eb9c560fd6..a5b1eaee1e58 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -2723,6 +2723,14 @@ struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 dpa) return ctx.cxlr; } +const char *cxl_trace_to_region_name(const struct cxl_memdev *cxlmd, u64 dpa) +{ + struct cxl_region *cxlr = cxl_dpa_to_region(cxlmd, dpa); + + /* trace __string() assignment requires "", not NULL */ + return cxlr ? dev_name(&cxlr->dev) : ""; +} + static bool cxl_is_hpa_in_range(u64 hpa, struct cxl_region *cxlr, int pos) { struct cxl_region_params *p = &cxlr->params; diff --git a/drivers/cxl/core/trace.h b/drivers/cxl/core/trace.h index 161bdb5734b0..6ad4998aeb9a 100644 --- a/drivers/cxl/core/trace.h +++ b/drivers/cxl/core/trace.h @@ -14,6 +14,22 @@ #include <cxlmem.h> #include "core.h" +#define to_region_name(cxlmd, dpa) \ + (cxl_trace_to_region_name(cxlmd, dpa)) + +#define store_region_info(cxlmd, dpa, entry_uuid, entry_hpa) \ + do { \ + struct cxl_region *cxlr; \ + \ + cxlr = cxl_dpa_to_region(cxlmd, dpa); \ + if (cxlr) { \ + uuid_copy(&(entry_uuid), &cxlr->params.uuid); \ + entry_hpa = cxl_trace_hpa(cxlr, cxlmd, dpa); \ + } else { \ + entry_hpa = ULLONG_MAX; \ + } \ + } while (0) + #define CXL_RAS_UC_CACHE_DATA_PARITY BIT(0) #define CXL_RAS_UC_CACHE_ADDR_PARITY BIT(1) #define CXL_RAS_UC_CACHE_BE_PARITY BIT(2) @@ -313,6 +329,9 @@ TRACE_EVENT(cxl_generic_event, { CXL_GMER_VALID_COMPONENT, "COMPONENT" } \ ) +#define to_gm_dpa(record) \ + (le64_to_cpu(rec->phys_addr) & CXL_DPA_MASK) + TRACE_EVENT(cxl_general_media, TP_PROTO(const struct cxl_memdev *cxlmd, enum cxl_event_log_type log, @@ -330,10 +349,13 @@ TRACE_EVENT(cxl_general_media, __field(u8, channel) __field(u32, device) __array(u8, comp_id, CXL_EVENT_GEN_MED_COMP_ID_SIZE) - __field(u16, validity_flags) /* Following are out of order to pack trace record */ + __field(u64, hpa) + __field_struct(uuid_t, region_uuid) + __field(u16, validity_flags) __field(u8, rank) __field(u8, dpa_flags) + __string(region_name, to_region_name(cxlmd, to_gm_dpa(record))) ), TP_fast_assign( @@ -354,18 +376,23 @@ TRACE_EVENT(cxl_general_media, memcpy(__entry->comp_id, &rec->component_id, CXL_EVENT_GEN_MED_COMP_ID_SIZE); __entry->validity_flags = get_unaligned_le16(&rec->validity_flags); + __assign_str(region_name, to_region_name(cxlmd, to_gm_dpa(record))); + store_region_info(cxlmd, to_gm_dpa(record), + __entry->region_uuid, __entry->hpa); ), CXL_EVT_TP_printk("dpa=%llx dpa_flags='%s' " \ "descriptor='%s' type='%s' transaction_type='%s' channel=%u rank=%u " \ - "device=%x comp_id=%s validity_flags='%s'", + "device=%x comp_id=%s validity_flags='%s' " \ + "hpa=%llx region=%s region_uuid=%pUb", __entry->dpa, show_dpa_flags(__entry->dpa_flags), show_event_desc_flags(__entry->descriptor), show_mem_event_type(__entry->type), show_trans_type(__entry->transaction_type), __entry->channel, __entry->rank, __entry->device, __print_hex(__entry->comp_id, CXL_EVENT_GEN_MED_COMP_ID_SIZE), - show_valid_flags(__entry->validity_flags) + show_valid_flags(__entry->validity_flags), + __entry->hpa, __get_str(region_name), &__entry->region_uuid ) ); @@ -396,6 +423,8 @@ TRACE_EVENT(cxl_general_media, { CXL_DER_VALID_COLUMN, "COLUMN" }, \ { CXL_DER_VALID_CORRECTION_MASK, "CORRECTION MASK" } \ ) +#define to_dram_dpa(record) \ + (le64_to_cpu(rec->phys_addr) & CXL_DPA_MASK) TRACE_EVENT(cxl_dram, @@ -417,10 +446,13 @@ TRACE_EVENT(cxl_dram, __field(u32, nibble_mask) __field(u32, row) __array(u8, cor_mask, CXL_EVENT_DER_CORRECTION_MASK_SIZE) + __field(u64, hpa) + __field_struct(uuid_t, region_uuid) __field(u8, rank) /* Out of order to pack trace record */ __field(u8, bank_group) /* Out of order to pack trace record */ __field(u8, bank) /* Out of order to pack trace record */ __field(u8, dpa_flags) /* Out of order to pack trace record */ + __string(region_name, to_region_name(cxlmd, to_dram_dpa(record))) ), TP_fast_assign( @@ -444,12 +476,16 @@ TRACE_EVENT(cxl_dram, __entry->column = get_unaligned_le16(rec->column); memcpy(__entry->cor_mask, &rec->correction_mask, CXL_EVENT_DER_CORRECTION_MASK_SIZE); + __assign_str(region_name, to_region_name(cxlmd, to_dram_dpa(record))); + store_region_info(cxlmd, __entry->dpa, __entry->region_uuid, + __entry->hpa); ), CXL_EVT_TP_printk("dpa=%llx dpa_flags='%s' descriptor='%s' type='%s' " \ "transaction_type='%s' channel=%u rank=%u nibble_mask=%x " \ "bank_group=%u bank=%u row=%u column=%u cor_mask=%s " \ - "validity_flags='%s'", + "validity_flags='%s'" \ + "hpa=%llx region=%s region_uuid=%pUb", __entry->dpa, show_dpa_flags(__entry->dpa_flags), show_event_desc_flags(__entry->descriptor), show_mem_event_type(__entry->type), @@ -458,7 +494,8 @@ TRACE_EVENT(cxl_dram, __entry->bank_group, __entry->bank, __entry->row, __entry->column, __print_hex(__entry->cor_mask, CXL_EVENT_DER_CORRECTION_MASK_SIZE), - show_dram_valid_flags(__entry->validity_flags) + show_dram_valid_flags(__entry->validity_flags), + __entry->hpa, __get_str(region_name), &__entry->region_uuid ) );