From: Ira Weiny <ira.weiny@intel.com>
To: Alison Schofield <alison.schofield@intel.com>
Cc: Vishal Verma <vishal.l.verma@intel.com>,
Jonathan Cameron <jonathan.cameron@Huawei.com>,
Fan Ni <fan.ni@samsung.com>,
Sushant1 Kumar <sushant1.kumar@intel.com>,
Dan Williams <dan.j.williams@intel.com>,
Dave Jiang <dave.jiang@intel.com>,
linux-cxl@vger.kernel.org, nvdimm@lists.linux.dev,
Ira Weiny <ira.weiny@intel.com>
Subject: [ndctl PATCH v4 4/9] cxl/region: Use new region mode in cxl-cli
Date: Sat, 14 Dec 2024 20:58:31 -0600 [thread overview]
Message-ID: <20241214-dcd-region2-v4-4-36550a97f8e2@intel.com> (raw)
In-Reply-To: <20241214-dcd-region2-v4-0-36550a97f8e2@intel.com>
With the introduction of DCD, region mode and decoder mode no longer
remain a 1:1 relation. An interleaved region may be made up of Dynamic
Capacity partitions with different indexes on each of the target
devices.
Modify cxl-cli to use the new region mode interface from libcxl. Modify
parameter processing and variable name changes for clarity in the
future.
Functionality remains the same.
Signed-off-by: Ira Weiny <ira.weiny@intel.com>
---
cxl/json.c | 6 +++---
cxl/region.c | 50 ++++++++++++++++++++++++++++++++------------------
2 files changed, 35 insertions(+), 21 deletions(-)
diff --git a/cxl/json.c b/cxl/json.c
index 5066d3bed13f8fcc36ab8f0ea127685c246d94d7..dcd3cc28393faf7e8adf299a857531ecdeaac50a 100644
--- a/cxl/json.c
+++ b/cxl/json.c
@@ -1147,7 +1147,7 @@ void util_cxl_mappings_append_json(struct json_object *jregion,
struct json_object *util_cxl_region_to_json(struct cxl_region *region,
unsigned long flags)
{
- enum cxl_decoder_mode mode = cxl_region_get_mode(region);
+ enum cxl_region_mode mode = cxl_region_get_region_mode(region);
const char *devname = cxl_region_get_devname(region);
struct json_object *jregion, *jobj;
u64 val;
@@ -1174,8 +1174,8 @@ struct json_object *util_cxl_region_to_json(struct cxl_region *region,
json_object_object_add(jregion, "size", jobj);
}
- if (mode != CXL_DECODER_MODE_NONE) {
- jobj = json_object_new_string(cxl_decoder_mode_name(mode));
+ if (mode != CXL_REGION_MODE_NONE) {
+ jobj = json_object_new_string(cxl_region_mode_name(mode));
if (jobj)
json_object_object_add(jregion, "type", jobj);
}
diff --git a/cxl/region.c b/cxl/region.c
index 207cf2d003148992255c715f286bc0f38de2ca84..527bd6708b162815068a95ddb360fce3914347de 100644
--- a/cxl/region.c
+++ b/cxl/region.c
@@ -49,7 +49,8 @@ struct parsed_params {
int argc;
const char **argv;
struct cxl_decoder *root_decoder;
- enum cxl_decoder_mode mode;
+ enum cxl_decoder_mode decoder_mode;
+ enum cxl_region_mode region_mode;
bool enforce_qos;
};
@@ -301,19 +302,28 @@ static int parse_create_options(struct cxl_ctx *ctx, int count,
return -ENXIO;
p->num_memdevs = json_object_array_length(p->memdevs);
+ p->region_mode = CXL_REGION_MODE_NONE;
if (param.type) {
- p->mode = cxl_decoder_mode_from_ident(param.type);
- if (p->mode == CXL_DECODER_MODE_RAM && param.uuid) {
+ p->region_mode = cxl_region_mode_from_ident(param.type);
+ if (p->region_mode == CXL_REGION_MODE_RAM && param.uuid) {
log_err(&rl,
"can't set UUID for ram / volatile regions");
goto err;
}
- if (p->mode == CXL_DECODER_MODE_NONE) {
+ if (p->region_mode == CXL_REGION_MODE_NONE) {
log_err(&rl, "unsupported type: %s\n", param.type);
goto err;
}
- } else {
- p->mode = CXL_DECODER_MODE_PMEM;
+ }
+
+ switch (p->region_mode) {
+ case CXL_REGION_MODE_RAM:
+ p->decoder_mode = CXL_DECODER_MODE_RAM;
+ break;
+ case CXL_REGION_MODE_PMEM:
+ default:
+ p->decoder_mode = CXL_DECODER_MODE_PMEM;
+ break;
}
if (param.size) {
@@ -410,7 +420,7 @@ static void collect_minsize(struct cxl_ctx *ctx, struct parsed_params *p)
struct cxl_memdev *memdev = json_object_get_userdata(jobj);
u64 size = 0;
- switch(p->mode) {
+ switch(p->decoder_mode) {
case CXL_DECODER_MODE_RAM:
size = cxl_memdev_get_ram_size(memdev);
break;
@@ -446,7 +456,7 @@ static int create_region_validate_qos_class(struct parsed_params *p)
json_object_array_get_idx(p->memdevs, i);
struct cxl_memdev *memdev = json_object_get_userdata(jobj);
- if (p->mode == CXL_DECODER_MODE_RAM)
+ if (p->decoder_mode == CXL_DECODER_MODE_RAM)
qos_class = cxl_memdev_get_ram_qos_class(memdev);
else
qos_class = cxl_memdev_get_pmem_qos_class(memdev);
@@ -475,7 +485,7 @@ static int validate_decoder(struct cxl_decoder *decoder,
const char *devname = cxl_decoder_get_devname(decoder);
int rc;
- switch(p->mode) {
+ switch(p->decoder_mode) {
case CXL_DECODER_MODE_RAM:
if (!cxl_decoder_is_volatile_capable(decoder)) {
log_err(&rl, "%s is not volatile capable\n", devname);
@@ -512,10 +522,14 @@ static void set_type_from_decoder(struct cxl_ctx *ctx, struct parsed_params *p)
* default to pmem if both types are set, otherwise the single
* capability dominates.
*/
- if (cxl_decoder_is_volatile_capable(p->root_decoder))
- p->mode = CXL_DECODER_MODE_RAM;
- if (cxl_decoder_is_pmem_capable(p->root_decoder))
- p->mode = CXL_DECODER_MODE_PMEM;
+ if (cxl_decoder_is_volatile_capable(p->root_decoder)) {
+ p->decoder_mode = CXL_DECODER_MODE_RAM;
+ p->region_mode = CXL_REGION_MODE_RAM;
+ }
+ if (cxl_decoder_is_pmem_capable(p->root_decoder)) {
+ p->decoder_mode = CXL_DECODER_MODE_PMEM;
+ p->region_mode = CXL_REGION_MODE_PMEM;
+ }
}
static int create_region_validate_config(struct cxl_ctx *ctx,
@@ -685,14 +699,14 @@ static int create_region(struct cxl_ctx *ctx, int *count,
if (size > max_extent)
size = ALIGN_DOWN(max_extent, SZ_256M * p->ways);
- if (p->mode == CXL_DECODER_MODE_PMEM) {
+ if (p->region_mode == CXL_REGION_MODE_PMEM) {
region = cxl_decoder_create_pmem_region(p->root_decoder);
if (!region) {
log_err(&rl, "failed to create region under %s\n",
param.root_decoder);
return -ENXIO;
}
- } else if (p->mode == CXL_DECODER_MODE_RAM) {
+ } else if (p->region_mode == CXL_REGION_MODE_RAM) {
region = cxl_decoder_create_ram_region(p->root_decoder);
if (!region) {
log_err(&rl, "failed to create region under %s\n",
@@ -714,7 +728,7 @@ static int create_region(struct cxl_ctx *ctx, int *count,
try(cxl_region, set_interleave_granularity, region, granularity);
try(cxl_region, set_interleave_ways, region, p->ways);
- if (p->mode == CXL_DECODER_MODE_PMEM) {
+ if (p->region_mode == CXL_REGION_MODE_PMEM) {
if (!param.uuid)
uuid_generate(p->uuid);
try(cxl_region, set_uuid, region, p->uuid);
@@ -732,14 +746,14 @@ static int create_region(struct cxl_ctx *ctx, int *count,
rc = -ENXIO;
goto out;
}
- if (cxl_decoder_get_mode(ep_decoder) != p->mode) {
+ if (cxl_decoder_get_mode(ep_decoder) != p->decoder_mode) {
/*
* The cxl_memdev_find_decoder() helper returns a free
* decoder whose size has been checked for 0.
* Thus it is safe to change the mode here if needed.
*/
try(cxl_decoder, set_dpa_size, ep_decoder, 0);
- try(cxl_decoder, set_mode, ep_decoder, p->mode);
+ try(cxl_decoder, set_mode, ep_decoder, p->decoder_mode);
}
try(cxl_decoder, set_dpa_size, ep_decoder, size/p->ways);
rc = cxl_region_set_target(region, i, ep_decoder);
--
2.47.1
next prev parent reply other threads:[~2024-12-15 2:58 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-12-15 2:58 [ndctl PATCH v4 0/9] ndctl: Dynamic Capacity additions for cxl-cli Ira Weiny
2024-12-15 2:58 ` [ndctl PATCH v4 1/9] ndctl/cxl-events: Don't fail test until event counts are reported Ira Weiny
2024-12-15 2:58 ` [ndctl PATCH v4 2/9] ndctl/cxl/region: Report max size for region creation Ira Weiny
2024-12-15 2:58 ` [ndctl PATCH v4 3/9] libcxl: Separate region mode from decoder mode Ira Weiny
2024-12-15 2:58 ` Ira Weiny [this message]
2024-12-15 2:58 ` [ndctl PATCH v4 5/9] libcxl: Add Dynamic Capacity region support Ira Weiny
2025-02-11 3:12 ` Alison Schofield
2024-12-15 2:58 ` [ndctl PATCH v4 6/9] cxl/region: Add cxl-cli support for DCD regions Ira Weiny
2025-02-11 3:21 ` Alison Schofield
2024-12-15 2:58 ` [ndctl PATCH v4 7/9] libcxl: Add extent functionality to DC regions Ira Weiny
2024-12-15 2:58 ` [ndctl PATCH v4 8/9] cxl/region: Add extent output to region query Ira Weiny
2025-02-11 3:24 ` Alison Schofield
2025-02-12 22:03 ` Ira Weiny
2024-12-15 2:58 ` [ndctl PATCH v4 9/9] cxl/test: Add Dynamic Capacity tests Ira Weiny
2025-02-11 3:33 ` Alison Schofield
2025-02-11 2:47 ` [ndctl PATCH v4 0/9] ndctl: Dynamic Capacity additions for cxl-cli Alison Schofield
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20241214-dcd-region2-v4-4-36550a97f8e2@intel.com \
--to=ira.weiny@intel.com \
--cc=alison.schofield@intel.com \
--cc=dan.j.williams@intel.com \
--cc=dave.jiang@intel.com \
--cc=fan.ni@samsung.com \
--cc=jonathan.cameron@Huawei.com \
--cc=linux-cxl@vger.kernel.org \
--cc=nvdimm@lists.linux.dev \
--cc=sushant1.kumar@intel.com \
--cc=vishal.l.verma@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox