diff mbox series

[NDCTL,2/3] ndctl: Add QTG ID support for the memory device

Message ID 168149418730.4013891.3864941985901182081.stgit@djiang5-mobl3
State Superseded
Headers show
Series ndctl: Add support of QoS Throttling Group (QTG) id for CXL CLI | expand

Commit Message

Dave Jiang April 14, 2023, 5:43 p.m. UTC
Add libcxl API to retrieve the QoS Throttling Group (QTG) ID for the
memory devices. Two API calls are added. One for 'ram' or 'volatile'
mode and another for 'pmem' or 'persistent' mode. Support also added
for displaying the QTG ID through the 'cxl list' command.

Signed-off-by: Dave Jiang <dave.jiang@intel.com>
---
 cxl/json.c         |   12 +++++++++++-
 cxl/lib/libcxl.c   |   20 ++++++++++++++++++++
 cxl/lib/libcxl.sym |    2 ++
 cxl/lib/private.h  |    2 ++
 cxl/libcxl.h       |    2 ++
 5 files changed, 37 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/cxl/json.c b/cxl/json.c
index 8dd65f942c6a..9a508cf7950e 100644
--- a/cxl/json.c
+++ b/cxl/json.c
@@ -486,7 +486,7 @@  struct json_object *util_cxl_memdev_to_json(struct cxl_memdev *memdev,
 	const char *devname = cxl_memdev_get_devname(memdev);
 	struct json_object *jdev, *jobj;
 	unsigned long long serial, size;
-	int numa_node;
+	int numa_node, qtg_id;
 
 	jdev = json_object_new_object();
 	if (!jdev)
@@ -501,6 +501,11 @@  struct json_object *util_cxl_memdev_to_json(struct cxl_memdev *memdev,
 		jobj = util_json_object_size(size, flags);
 		if (jobj)
 			json_object_object_add(jdev, "pmem_size", jobj);
+
+		qtg_id = cxl_memdev_get_pmem_qtg_id(memdev);
+		jobj = json_object_new_int(qtg_id);
+		if (jobj)
+			json_object_object_add(jdev, "qtg_id", jobj);
 	}
 
 	size = cxl_memdev_get_ram_size(memdev);
@@ -508,6 +513,11 @@  struct json_object *util_cxl_memdev_to_json(struct cxl_memdev *memdev,
 		jobj = util_json_object_size(size, flags);
 		if (jobj)
 			json_object_object_add(jdev, "ram_size", jobj);
+
+		qtg_id = cxl_memdev_get_ram_qtg_id(memdev);
+		jobj = json_object_new_int(qtg_id);
+		if (jobj)
+			json_object_object_add(jdev, "qtg_id", jobj);
 	}
 
 	if (flags & UTIL_JSON_HEALTH) {
diff --git a/cxl/lib/libcxl.c b/cxl/lib/libcxl.c
index 26985c9344b4..dca1683523a1 100644
--- a/cxl/lib/libcxl.c
+++ b/cxl/lib/libcxl.c
@@ -1210,6 +1210,16 @@  static void *add_cxl_memdev(void *parent, int id, const char *cxlmem_base)
 		goto err_read;
 	memdev->ram_size = strtoull(buf, NULL, 0);
 
+	sprintf(path, "%s/pmem/qtg_id", cxlmem_base);
+	if (sysfs_read_attr(ctx, path, buf) < 0)
+		goto err_read;
+	memdev->pmem_qtg_id = atoi(buf);
+
+	sprintf(path, "%s/ram/qtg_id", cxlmem_base);
+	if (sysfs_read_attr(ctx, path, buf) < 0)
+		goto err_read;
+	memdev->ram_qtg_id = atoi(buf);
+
 	sprintf(path, "%s/payload_max", cxlmem_base);
 	if (sysfs_read_attr(ctx, path, buf) < 0)
 		goto err_read;
@@ -1368,6 +1378,16 @@  CXL_EXPORT unsigned long long cxl_memdev_get_ram_size(struct cxl_memdev *memdev)
 	return memdev->ram_size;
 }
 
+CXL_EXPORT int cxl_memdev_get_pmem_qtg_id(struct cxl_memdev *memdev)
+{
+	return memdev->pmem_qtg_id;
+}
+
+CXL_EXPORT int cxl_memdev_get_ram_qtg_id(struct cxl_memdev *memdev)
+{
+	return memdev->ram_qtg_id;
+}
+
 CXL_EXPORT const char *cxl_memdev_get_firmware_verison(struct cxl_memdev *memdev)
 {
 	return memdev->firmware_version;
diff --git a/cxl/lib/libcxl.sym b/cxl/lib/libcxl.sym
index d1c61f9252fe..60ad16e33f30 100644
--- a/cxl/lib/libcxl.sym
+++ b/cxl/lib/libcxl.sym
@@ -249,4 +249,6 @@  global:
 	cxl_decoder_create_ram_region;
 	cxl_region_get_daxctl_region;
 	cxl_decoder_get_qtg_id;
+	cxl_memdev_get_pmem_qtg_id;
+	cxl_memdev_get_ram_qtg_id;
 } LIBCXL_4;
diff --git a/cxl/lib/private.h b/cxl/lib/private.h
index ac6f111b5956..dfd77ff2a781 100644
--- a/cxl/lib/private.h
+++ b/cxl/lib/private.h
@@ -32,6 +32,8 @@  struct cxl_memdev {
 	struct list_node list;
 	unsigned long long pmem_size;
 	unsigned long long ram_size;
+	int pmem_qtg_id;
+	int ram_qtg_id;
 	int payload_max;
 	size_t lsa_size;
 	struct kmod_module *module;
diff --git a/cxl/libcxl.h b/cxl/libcxl.h
index 66ce4a021c62..c89806cbbd57 100644
--- a/cxl/libcxl.h
+++ b/cxl/libcxl.h
@@ -47,6 +47,8 @@  int cxl_memdev_get_minor(struct cxl_memdev *memdev);
 struct cxl_ctx *cxl_memdev_get_ctx(struct cxl_memdev *memdev);
 unsigned long long cxl_memdev_get_pmem_size(struct cxl_memdev *memdev);
 unsigned long long cxl_memdev_get_ram_size(struct cxl_memdev *memdev);
+int cxl_memdev_get_pmem_qtg_id(struct cxl_memdev *memdev);
+int cxl_memdev_get_ram_qtg_id(struct cxl_memdev *memdev);
 const char *cxl_memdev_get_firmware_verison(struct cxl_memdev *memdev);
 
 /* ABI spelling mistakes are forever */