On Wed, Jan 24, 2024 at 01:54:41PM -0700, Dave Jiang wrote: > Add libcxl API to retrieve the QoS class for the root decoder. Also add > support to display the QoS class for the root decoder through the 'cxl > list' command. The qos_class is displayed behind -vvv verbose level. > > Signed-off-by: Dave Jiang <[email protected]>
Reviewed-by: Alison Schofield <[email protected]> > > --- > v3: > - Rebase to latest pending branch > --- > cxl/filter.h | 4 ++++ > cxl/json.c | 10 ++++++++++ > cxl/lib/libcxl.c | 14 ++++++++++++++ > cxl/lib/libcxl.sym | 1 + > cxl/lib/private.h | 1 + > cxl/libcxl.h | 3 +++ > cxl/list.c | 1 + > util/json.h | 1 + > 8 files changed, 35 insertions(+) > > diff --git a/cxl/filter.h b/cxl/filter.h > index 1241f72ccf62..3c5f9e8a0452 100644 > --- a/cxl/filter.h > +++ b/cxl/filter.h > @@ -31,6 +31,7 @@ struct cxl_filter_params { > bool alert_config; > bool dax; > bool poison; > + bool qos; > int verbose; > struct log_ctx ctx; > }; > @@ -91,6 +92,9 @@ static inline unsigned long cxl_filter_to_flags(struct > cxl_filter_params *param) > flags |= UTIL_JSON_DAX | UTIL_JSON_DAX_DEVS; > if (param->poison) > flags |= UTIL_JSON_MEDIA_ERRORS; > + if (param->qos) > + flags |= UTIL_JSON_QOS_CLASS; > + > return flags; > } > > diff --git a/cxl/json.c b/cxl/json.c > index 6fb17582a1cb..48a43ddf14b0 100644 > --- a/cxl/json.c > +++ b/cxl/json.c > @@ -1062,6 +1062,16 @@ struct json_object *util_cxl_decoder_to_json(struct > cxl_decoder *decoder, > jobj); > } > > + if ((flags & UTIL_JSON_QOS_CLASS) && cxl_port_is_root(port)) { > + int qos_class = cxl_root_decoder_get_qos_class(decoder); > + > + if (qos_class != CXL_QOS_CLASS_NONE) { > + jobj = json_object_new_int(qos_class); > + if (jobj) > + json_object_object_add(jdecoder, "qos_class", > jobj); > + } > + } > + > json_object_set_userdata(jdecoder, decoder, NULL); > return jdecoder; > } > diff --git a/cxl/lib/libcxl.c b/cxl/lib/libcxl.c > index 1537a33d370e..9a1ac7001803 100644 > --- a/cxl/lib/libcxl.c > +++ b/cxl/lib/libcxl.c > @@ -2229,6 +2229,12 @@ static void *add_cxl_decoder(void *parent, int id, > const char *cxldecoder_base) > else > decoder->interleave_ways = strtoul(buf, NULL, 0); > > + sprintf(path, "%s/qos_class", cxldecoder_base); > + if (sysfs_read_attr(ctx, path, buf) < 0) > + decoder->qos_class = CXL_QOS_CLASS_NONE; > + else > + decoder->qos_class = atoi(buf); > + > switch (port->type) { > case CXL_PORT_ENDPOINT: > sprintf(path, "%s/dpa_resource", cxldecoder_base); > @@ -2423,6 +2429,14 @@ CXL_EXPORT unsigned long long > cxl_decoder_get_size(struct cxl_decoder *decoder) > return decoder->size; > } > > +CXL_EXPORT int cxl_root_decoder_get_qos_class(struct cxl_decoder *decoder) > +{ > + if (!cxl_port_is_root(decoder->port)) > + return -EINVAL; > + > + return decoder->qos_class; > +} > + > CXL_EXPORT unsigned long long > cxl_decoder_get_dpa_resource(struct cxl_decoder *decoder) > { > diff --git a/cxl/lib/libcxl.sym b/cxl/lib/libcxl.sym > index 2149f84d764e..384fea2c25e3 100644 > --- a/cxl/lib/libcxl.sym > +++ b/cxl/lib/libcxl.sym > @@ -282,4 +282,5 @@ global: > LIBCXL_8 { > global: > cxl_memdev_wait_sanitize; > + cxl_root_decoder_get_qos_class; > } LIBCXL_7; > diff --git a/cxl/lib/private.h b/cxl/lib/private.h > index b26a8629e047..4847ff448f71 100644 > --- a/cxl/lib/private.h > +++ b/cxl/lib/private.h > @@ -144,6 +144,7 @@ struct cxl_decoder { > struct list_head targets; > struct list_head regions; > struct list_head stale_regions; > + int qos_class; > }; > > enum cxl_decode_state { > diff --git a/cxl/libcxl.h b/cxl/libcxl.h > index 352b3a866f63..e5c08da77f77 100644 > --- a/cxl/libcxl.h > +++ b/cxl/libcxl.h > @@ -173,6 +173,8 @@ struct cxl_dport *cxl_port_get_dport_by_memdev(struct > cxl_port *port, > for (dport = cxl_dport_get_first(port); dport != NULL; \ > dport = cxl_dport_get_next(dport)) > > +#define CXL_QOS_CLASS_NONE -1 > + > struct cxl_decoder; > struct cxl_decoder *cxl_decoder_get_first(struct cxl_port *port); > struct cxl_decoder *cxl_decoder_get_next(struct cxl_decoder *decoder); > @@ -184,6 +186,7 @@ unsigned long long cxl_decoder_get_dpa_resource(struct > cxl_decoder *decoder); > unsigned long long cxl_decoder_get_dpa_size(struct cxl_decoder *decoder); > unsigned long long > cxl_decoder_get_max_available_extent(struct cxl_decoder *decoder); > +int cxl_root_decoder_get_qos_class(struct cxl_decoder *decoder); > > enum cxl_decoder_mode { > CXL_DECODER_MODE_NONE, > diff --git a/cxl/list.c b/cxl/list.c > index 13fef8569340..f6446f98c2bd 100644 > --- a/cxl/list.c > +++ b/cxl/list.c > @@ -123,6 +123,7 @@ int cmd_list(int argc, const char **argv, struct cxl_ctx > *ctx) > param.fw = true; > param.alert_config = true; > param.dax = true; > + param.qos = true; > /* fallthrough */ > case 2: > param.idle = true; > diff --git a/util/json.h b/util/json.h > index ea370df4d1b7..b07055005084 100644 > --- a/util/json.h > +++ b/util/json.h > @@ -21,6 +21,7 @@ enum util_json_flags { > UTIL_JSON_TARGETS = (1 << 11), > UTIL_JSON_PARTITION = (1 << 12), > UTIL_JSON_ALERT_CONFIG = (1 << 13), > + UTIL_JSON_QOS_CLASS = (1 << 14), > }; > > void util_display_json_array(FILE *f_out, struct json_object *jarray, > > >
