anitazha / rpms / ndctl

Forked from rpms/ndctl a year ago
Clone

Blame 0135-cxl-add-memdev-partition-information-to-cxl-list.patch

Jeff Moyer 2c91dc
From 033b94ad7346a82504cffba3d87650b60945c1eb Mon Sep 17 00:00:00 2001
Jeff Moyer 2c91dc
From: Alison Schofield <alison.schofield@intel.com>
Jeff Moyer 2c91dc
Date: Tue, 22 Feb 2022 11:56:06 -0800
Jeff Moyer 2c91dc
Subject: [PATCH 135/217] cxl: add memdev partition information to cxl-list
Jeff Moyer 2c91dc
Jeff Moyer 2c91dc
The CXL PMEM provisioning model depends upon the values reported in
Jeff Moyer 2c91dc
both the CXL IDENTIFY and GET_PARTITION_INFO mailbox commands when
Jeff Moyer 2c91dc
changing the partitioning between volatile and persistent capacity.
Jeff Moyer 2c91dc
Jeff Moyer 2c91dc
Add an option to the 'cxl list' command to display partition information.
Jeff Moyer 2c91dc
Jeff Moyer 2c91dc
Include the partitioning related fields from the IDENTIFY command:
Jeff Moyer 2c91dc
total, volatile_only, persistent_only, and partition_alignment sizes.
Jeff Moyer 2c91dc
When the partition_alignment size is greater than zero, indicating
Jeff Moyer 2c91dc
partitionable capacity, include the active and next size fields of
Jeff Moyer 2c91dc
GET_PARTITION_INFO.
Jeff Moyer 2c91dc
Jeff Moyer 2c91dc
Example:
Jeff Moyer 2c91dc
    "partition_info":{
Jeff Moyer 2c91dc
      "total_size":273535729664,
Jeff Moyer 2c91dc
      "volatile_only_size":0,
Jeff Moyer 2c91dc
      "persistent_only_size":0,
Jeff Moyer 2c91dc
      "partition_alignment_size":268435456
Jeff Moyer 2c91dc
      "active_volatile_size":273535729664,
Jeff Moyer 2c91dc
      "active_persistent_size":0,
Jeff Moyer 2c91dc
      "next_volatile_size":0,
Jeff Moyer 2c91dc
      "next_persistent_size":0,
Jeff Moyer 2c91dc
    }
Jeff Moyer 2c91dc
Jeff Moyer 2c91dc
Link: https://lore.kernel.org/r/70cc57379d2c49692036b1daa158a122aa19c126.1645558189.git.alison.schofield@intel.com
Jeff Moyer 2c91dc
Reviewed-by: Dan Williams <dan.j.williams@intel.com>
Jeff Moyer 2c91dc
Signed-off-by: Alison Schofield <alison.schofield@intel.com>
Jeff Moyer 2c91dc
Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
Jeff Moyer 2c91dc
---
Jeff Moyer 2c91dc
 Documentation/cxl/cxl-list.txt |  23 +++++++
Jeff Moyer 2c91dc
 cxl/filter.c                   |   2 +
Jeff Moyer 2c91dc
 cxl/filter.h                   |   1 +
Jeff Moyer 2c91dc
 cxl/json.c                     | 120 +++++++++++++++++++++++++++++++++
Jeff Moyer 2c91dc
 cxl/list.c                     |   2 +
Jeff Moyer 2c91dc
 util/json.h                    |   1 +
Jeff Moyer 2c91dc
 6 files changed, 149 insertions(+)
Jeff Moyer 2c91dc
Jeff Moyer 2c91dc
diff --git a/Documentation/cxl/cxl-list.txt b/Documentation/cxl/cxl-list.txt
Jeff Moyer 2c91dc
index 90e6d9f..f6aba0c 100644
Jeff Moyer 2c91dc
--- a/Documentation/cxl/cxl-list.txt
Jeff Moyer 2c91dc
+++ b/Documentation/cxl/cxl-list.txt
Jeff Moyer 2c91dc
@@ -196,6 +196,29 @@ OPTIONS
Jeff Moyer 2c91dc
   }
Jeff Moyer 2c91dc
 ]
Jeff Moyer 2c91dc
 ----
Jeff Moyer 2c91dc
+-I::
Jeff Moyer 2c91dc
+--partition::
Jeff Moyer 2c91dc
+	Include partition information in the memdev listing. Example listing:
Jeff Moyer 2c91dc
+----
Jeff Moyer 2c91dc
+# cxl list -m mem0 -I
Jeff Moyer 2c91dc
+[
Jeff Moyer 2c91dc
+  {
Jeff Moyer 2c91dc
+    "memdev":"mem0",
Jeff Moyer 2c91dc
+    "pmem_size":0,
Jeff Moyer 2c91dc
+    "ram_size":273535729664,
Jeff Moyer 2c91dc
+    "partition_info":{
Jeff Moyer 2c91dc
+      "total_size":273535729664,
Jeff Moyer 2c91dc
+      "volatile_only_size":0,
Jeff Moyer 2c91dc
+      "persistent_only_size":0,
Jeff Moyer 2c91dc
+      "partition_alignment_size":268435456
Jeff Moyer 2c91dc
+      "active_volatile_size":273535729664,
Jeff Moyer 2c91dc
+      "active_persistent_size":0,
Jeff Moyer 2c91dc
+      "next_volatile_size":0,
Jeff Moyer 2c91dc
+      "next_persistent_size":0,
Jeff Moyer 2c91dc
+    }
Jeff Moyer 2c91dc
+  }
Jeff Moyer 2c91dc
+]
Jeff Moyer 2c91dc
+----
Jeff Moyer 2c91dc
 
Jeff Moyer 2c91dc
 -B::
Jeff Moyer 2c91dc
 --buses::
Jeff Moyer 2c91dc
diff --git a/cxl/filter.c b/cxl/filter.c
Jeff Moyer 2c91dc
index 925bf3a..b339642 100644
Jeff Moyer 2c91dc
--- a/cxl/filter.c
Jeff Moyer 2c91dc
+++ b/cxl/filter.c
Jeff Moyer 2c91dc
@@ -581,6 +581,8 @@ static unsigned long params_to_flags(struct cxl_filter_params *param)
Jeff Moyer 2c91dc
 		flags |= UTIL_JSON_HEALTH;
Jeff Moyer 2c91dc
 	if (param->targets)
Jeff Moyer 2c91dc
 		flags |= UTIL_JSON_TARGETS;
Jeff Moyer 2c91dc
+	if (param->partition)
Jeff Moyer 2c91dc
+		flags |= UTIL_JSON_PARTITION;
Jeff Moyer 2c91dc
 	return flags;
Jeff Moyer 2c91dc
 }
Jeff Moyer 2c91dc
 
Jeff Moyer 2c91dc
diff --git a/cxl/filter.h b/cxl/filter.h
Jeff Moyer 2c91dc
index 5deabb3..697b777 100644
Jeff Moyer 2c91dc
--- a/cxl/filter.h
Jeff Moyer 2c91dc
+++ b/cxl/filter.h
Jeff Moyer 2c91dc
@@ -23,6 +23,7 @@ struct cxl_filter_params {
Jeff Moyer 2c91dc
 	bool idle;
Jeff Moyer 2c91dc
 	bool human;
Jeff Moyer 2c91dc
 	bool health;
Jeff Moyer 2c91dc
+	bool partition;
Jeff Moyer 2c91dc
 	struct log_ctx ctx;
Jeff Moyer 2c91dc
 };
Jeff Moyer 2c91dc
 
Jeff Moyer 2c91dc
diff --git a/cxl/json.c b/cxl/json.c
Jeff Moyer 2c91dc
index f3b536e..fdc6f73 100644
Jeff Moyer 2c91dc
--- a/cxl/json.c
Jeff Moyer 2c91dc
+++ b/cxl/json.c
Jeff Moyer 2c91dc
@@ -185,6 +185,121 @@ err_jobj:
Jeff Moyer 2c91dc
 	return NULL;
Jeff Moyer 2c91dc
 }
Jeff Moyer 2c91dc
 
Jeff Moyer 2c91dc
+/*
Jeff Moyer 2c91dc
+ * Present complete view of memdev partition by presenting fields from
Jeff Moyer 2c91dc
+ * both GET_PARTITION_INFO and IDENTIFY mailbox commands.
Jeff Moyer 2c91dc
+ */
Jeff Moyer 2c91dc
+static struct json_object *util_cxl_memdev_partition_to_json(struct cxl_memdev *memdev,
Jeff Moyer 2c91dc
+		unsigned long flags)
Jeff Moyer 2c91dc
+{
Jeff Moyer 2c91dc
+	struct json_object *jobj = NULL;
Jeff Moyer 2c91dc
+	struct json_object *jpart;
Jeff Moyer 2c91dc
+	unsigned long long cap;
Jeff Moyer 2c91dc
+	struct cxl_cmd *cmd;
Jeff Moyer 2c91dc
+	int rc;
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+	jpart = json_object_new_object();
Jeff Moyer 2c91dc
+	if (!jpart)
Jeff Moyer 2c91dc
+		return NULL;
Jeff Moyer 2c91dc
+	if (!memdev)
Jeff Moyer 2c91dc
+		goto err_jobj;
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+	/* Retrieve partition info in the IDENTIFY mbox cmd */
Jeff Moyer 2c91dc
+	cmd = cxl_cmd_new_identify(memdev);
Jeff Moyer 2c91dc
+	if (!cmd)
Jeff Moyer 2c91dc
+		goto err_jobj;
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+	rc = cxl_cmd_submit(cmd);
Jeff Moyer 2c91dc
+	if (rc < 0)
Jeff Moyer 2c91dc
+		goto err_identify;
Jeff Moyer 2c91dc
+	rc = cxl_cmd_get_mbox_status(cmd);
Jeff Moyer 2c91dc
+	if (rc != 0)
Jeff Moyer 2c91dc
+		goto err_identify;
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+	cap = cxl_cmd_identify_get_total_size(cmd);
Jeff Moyer 2c91dc
+	if (cap != ULLONG_MAX) {
Jeff Moyer 2c91dc
+		jobj = util_json_object_size(cap, flags);
Jeff Moyer 2c91dc
+		if (jobj)
Jeff Moyer 2c91dc
+			json_object_object_add(jpart, "total_size", jobj);
Jeff Moyer 2c91dc
+	}
Jeff Moyer 2c91dc
+	cap = cxl_cmd_identify_get_volatile_only_size(cmd);
Jeff Moyer 2c91dc
+	if (cap != ULLONG_MAX) {
Jeff Moyer 2c91dc
+		jobj = util_json_object_size(cap, flags);
Jeff Moyer 2c91dc
+		if (jobj)
Jeff Moyer 2c91dc
+			json_object_object_add(jpart,
Jeff Moyer 2c91dc
+					"volatile_only_size", jobj);
Jeff Moyer 2c91dc
+	}
Jeff Moyer 2c91dc
+	cap = cxl_cmd_identify_get_persistent_only_size(cmd);
Jeff Moyer 2c91dc
+	if (cap != ULLONG_MAX) {
Jeff Moyer 2c91dc
+		jobj = util_json_object_size(cap, flags);
Jeff Moyer 2c91dc
+		if (jobj)
Jeff Moyer 2c91dc
+			json_object_object_add(jpart,
Jeff Moyer 2c91dc
+					"persistent_only_size", jobj);
Jeff Moyer 2c91dc
+	}
Jeff Moyer 2c91dc
+	cap = cxl_cmd_identify_get_partition_align(cmd);
Jeff Moyer 2c91dc
+	jobj = util_json_object_size(cap, flags);
Jeff Moyer 2c91dc
+	if (jobj)
Jeff Moyer 2c91dc
+		json_object_object_add(jpart, "partition_alignment_size", jobj);
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+	cxl_cmd_unref(cmd);
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+	/* Return now if there is no partition info to get. */
Jeff Moyer 2c91dc
+	if (!cap)
Jeff Moyer 2c91dc
+		return jpart;
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+	/* Retrieve partition info in GET_PARTITION_INFO mbox cmd */
Jeff Moyer 2c91dc
+	cmd = cxl_cmd_new_get_partition(memdev);
Jeff Moyer 2c91dc
+	if (!cmd)
Jeff Moyer 2c91dc
+		return jpart;
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+	rc = cxl_cmd_submit(cmd);
Jeff Moyer 2c91dc
+	if (rc < 0)
Jeff Moyer 2c91dc
+		goto err_get;
Jeff Moyer 2c91dc
+	rc = cxl_cmd_get_mbox_status(cmd);
Jeff Moyer 2c91dc
+	if (rc != 0)
Jeff Moyer 2c91dc
+		goto err_get;
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+	cap = cxl_cmd_partition_get_active_volatile_size(cmd);
Jeff Moyer 2c91dc
+	if (cap != ULLONG_MAX) {
Jeff Moyer 2c91dc
+		jobj = util_json_object_size(cap, flags);
Jeff Moyer 2c91dc
+		if (jobj)
Jeff Moyer 2c91dc
+			json_object_object_add(jpart,
Jeff Moyer 2c91dc
+					"active_volatile_size", jobj);
Jeff Moyer 2c91dc
+	}
Jeff Moyer 2c91dc
+	cap = cxl_cmd_partition_get_active_persistent_size(cmd);
Jeff Moyer 2c91dc
+	if (cap != ULLONG_MAX) {
Jeff Moyer 2c91dc
+		jobj = util_json_object_size(cap, flags);
Jeff Moyer 2c91dc
+		if (jobj)
Jeff Moyer 2c91dc
+			json_object_object_add(jpart,
Jeff Moyer 2c91dc
+					"active_persistent_size", jobj);
Jeff Moyer 2c91dc
+	}
Jeff Moyer 2c91dc
+	cap = cxl_cmd_partition_get_next_volatile_size(cmd);
Jeff Moyer 2c91dc
+	if (cap != ULLONG_MAX) {
Jeff Moyer 2c91dc
+		jobj = util_json_object_size(cap, flags);
Jeff Moyer 2c91dc
+		if (jobj)
Jeff Moyer 2c91dc
+			json_object_object_add(jpart,
Jeff Moyer 2c91dc
+					"next_volatile_size", jobj);
Jeff Moyer 2c91dc
+	}
Jeff Moyer 2c91dc
+	cap = cxl_cmd_partition_get_next_persistent_size(cmd);
Jeff Moyer 2c91dc
+	if (cap != ULLONG_MAX) {
Jeff Moyer 2c91dc
+		jobj = util_json_object_size(cap, flags);
Jeff Moyer 2c91dc
+		if (jobj)
Jeff Moyer 2c91dc
+			json_object_object_add(jpart,
Jeff Moyer 2c91dc
+					"next_persistent_size", jobj);
Jeff Moyer 2c91dc
+	}
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+err_get:
Jeff Moyer 2c91dc
+	cxl_cmd_unref(cmd);
Jeff Moyer 2c91dc
+	return jpart;
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+err_identify:
Jeff Moyer 2c91dc
+	cxl_cmd_unref(cmd);
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+err_jobj:
Jeff Moyer 2c91dc
+	json_object_put(jpart);
Jeff Moyer 2c91dc
+	return NULL;
Jeff Moyer 2c91dc
+}
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
 struct json_object *util_cxl_memdev_to_json(struct cxl_memdev *memdev,
Jeff Moyer 2c91dc
 		unsigned long flags)
Jeff Moyer 2c91dc
 {
Jeff Moyer 2c91dc
@@ -239,6 +354,11 @@ struct json_object *util_cxl_memdev_to_json(struct cxl_memdev *memdev,
Jeff Moyer 2c91dc
 			json_object_object_add(jdev, "state", jobj);
Jeff Moyer 2c91dc
 	}
Jeff Moyer 2c91dc
 
Jeff Moyer 2c91dc
+	if (flags & UTIL_JSON_PARTITION) {
Jeff Moyer 2c91dc
+		jobj = util_cxl_memdev_partition_to_json(memdev, flags);
Jeff Moyer 2c91dc
+		if (jobj)
Jeff Moyer 2c91dc
+			json_object_object_add(jdev, "partition_info", jobj);
Jeff Moyer 2c91dc
+	}
Jeff Moyer 2c91dc
 	return jdev;
Jeff Moyer 2c91dc
 }
Jeff Moyer 2c91dc
 
Jeff Moyer 2c91dc
diff --git a/cxl/list.c b/cxl/list.c
Jeff Moyer 2c91dc
index de96ff9..1e9d441 100644
Jeff Moyer 2c91dc
--- a/cxl/list.c
Jeff Moyer 2c91dc
+++ b/cxl/list.c
Jeff Moyer 2c91dc
@@ -48,6 +48,8 @@ static const struct option options[] = {
Jeff Moyer 2c91dc
 		    "use human friendly number formats "),
Jeff Moyer 2c91dc
 	OPT_BOOLEAN('H', "health", &param.health,
Jeff Moyer 2c91dc
 		    "include memory device health information "),
Jeff Moyer 2c91dc
+	OPT_BOOLEAN('I', "partition", &param.partition,
Jeff Moyer 2c91dc
+		    "include memory device partition information "),
Jeff Moyer 2c91dc
 #ifdef ENABLE_DEBUG
Jeff Moyer 2c91dc
 	OPT_BOOLEAN(0, "debug", &debug, "debug list walk"),
Jeff Moyer 2c91dc
 #endif
Jeff Moyer 2c91dc
diff --git a/util/json.h b/util/json.h
Jeff Moyer 2c91dc
index e026df1..73bb9f0 100644
Jeff Moyer 2c91dc
--- a/util/json.h
Jeff Moyer 2c91dc
+++ b/util/json.h
Jeff Moyer 2c91dc
@@ -19,6 +19,7 @@ enum util_json_flags {
Jeff Moyer 2c91dc
 	UTIL_JSON_DAX_MAPPINGS	= (1 << 9),
Jeff Moyer 2c91dc
 	UTIL_JSON_HEALTH	= (1 << 10),
Jeff Moyer 2c91dc
 	UTIL_JSON_TARGETS	= (1 << 11),
Jeff Moyer 2c91dc
+	UTIL_JSON_PARTITION	= (1 << 12),
Jeff Moyer 2c91dc
 };
Jeff Moyer 2c91dc
 
Jeff Moyer 2c91dc
 void util_display_json_array(FILE *f_out, struct json_object *jarray,
Jeff Moyer 2c91dc
-- 
Jeff Moyer 2c91dc
2.27.0
Jeff Moyer 2c91dc