Message ID | 20240207172055.1882900-2-dave.jiang@intel.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | ndctl: Add support of qos_class for CXL CLI | expand |
On Wed, Feb 07, 2024 at 10:19:36AM -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 the QTG ID of the CFMWS window that > represents the root decoder. > > Reviewed-by: Alison Schofield <alison.schofield@intel.com> > Signed-off-by: Dave Jiang <dave.jiang@intel.com> > --- -snip- > @@ -136,6 +136,7 @@ int cmd_list(int argc, const char **argv, struct cxl_ctx *ctx) > param.regions = true; > /*fallthrough*/ > case 0: > + param.qos = true; > break; > } Add qos to the -vvv explainer in Documentation/cxl/cxl-list.txt
On Wed, Feb 07, 2024 at 12:05:17PM -0800, Alison Schofield wrote: > On Wed, Feb 07, 2024 at 10:19:36AM -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 the QTG ID of the CFMWS window that > > represents the root decoder. > > > > Reviewed-by: Alison Schofield <alison.schofield@intel.com> > > Signed-off-by: Dave Jiang <dave.jiang@intel.com> > > --- > > -snip- > > > @@ -136,6 +136,7 @@ int cmd_list(int argc, const char **argv, struct cxl_ctx *ctx) > > param.regions = true; > > /*fallthrough*/ > > case 0: > > + param.qos = true; > > break; > > } > > Add qos to the -vvv explainer in Documentation/cxl/cxl-list.txt My comment is wrong, since it is now an 'always displayed', not a -vvv. Why put it here at all then? I'm confused! > >
On 2/7/24 1:13 PM, Alison Schofield wrote: > On Wed, Feb 07, 2024 at 12:05:17PM -0800, Alison Schofield wrote: >> On Wed, Feb 07, 2024 at 10:19:36AM -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 the QTG ID of the CFMWS window that >>> represents the root decoder. >>> >>> Reviewed-by: Alison Schofield <alison.schofield@intel.com> >>> Signed-off-by: Dave Jiang <dave.jiang@intel.com> >>> --- >> >> -snip- >> >>> @@ -136,6 +136,7 @@ int cmd_list(int argc, const char **argv, struct cxl_ctx *ctx) >>> param.regions = true; >>> /*fallthrough*/ >>> case 0: >>> + param.qos = true; >>> break; >>> } >> >> Add qos to the -vvv explainer in Documentation/cxl/cxl-list.txt > > My comment is wrong, since it is now an 'always displayed', not a -vvv. > Why put it here at all then? I'm confused! Just remove param.qos entirely? > > >> >>
On Wed, 2024-02-07 at 13:16 -0700, Dave Jiang wrote: > > > On 2/7/24 1:13 PM, Alison Schofield wrote: > > On Wed, Feb 07, 2024 at 12:05:17PM -0800, Alison Schofield wrote: > > > On Wed, Feb 07, 2024 at 10:19:36AM -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 the QTG ID of the CFMWS window that > > > > represents the root decoder. > > > > > > > > Reviewed-by: Alison Schofield <alison.schofield@intel.com> > > > > Signed-off-by: Dave Jiang <dave.jiang@intel.com> > > > > --- > > > > > > -snip- > > > > > > > @@ -136,6 +136,7 @@ int cmd_list(int argc, const char **argv, struct cxl_ctx *ctx) > > > > param.regions = true; > > > > /*fallthrough*/ > > > > case 0: > > > > + param.qos = true; > > > > break; > > > > } > > > > > > Add qos to the -vvv explainer in Documentation/cxl/cxl-list.txt > > > > My comment is wrong, since it is now an 'always displayed', not a -vvv. > > Why put it here at all then? I'm confused! > > Just remove param.qos entirely? Yep agree, if it is always there by default, no need for a param. >
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..5402575b9937 100644 --- a/cxl/list.c +++ b/cxl/list.c @@ -136,6 +136,7 @@ int cmd_list(int argc, const char **argv, struct cxl_ctx *ctx) param.regions = true; /*fallthrough*/ case 0: + param.qos = true; break; } 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,