diff mbox series

[ndctl,v2,14/18] cxl/region: Trim region size by max available extent

Message ID 167053496075.582963.15276731392463349632.stgit@dwillia2-xfh.jf.intel.com (mailing list archive)
State Accepted
Commit 2904504721a601c4ecf9e5f0a9a14e9799251580
Headers show
Series cxl-cli test and usability updates | expand

Commit Message

Dan Williams Dec. 8, 2022, 9:29 p.m. UTC
When a size is not specified, limit the size to either the available DPA
capacity, or the max available extent in the root decoder, whichever is
smaller.

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
---
 cxl/region.c |    7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

Comments

Alison Schofield Dec. 9, 2022, 5:31 p.m. UTC | #1
On Thu, Dec 08, 2022 at 01:29:20PM -0800, Dan Williams wrote:
> When a size is not specified, limit the size to either the available DPA
> capacity, or the max available extent in the root decoder, whichever is
> smaller.

Reviewed-by: Alison Schofield <alison.schofield@intel.com>
> 
> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
> ---
>  cxl/region.c |    7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)
> 
> diff --git a/cxl/region.c b/cxl/region.c
> index 36ebc8e5210f..286c358f1a34 100644
> --- a/cxl/region.c
> +++ b/cxl/region.c
> @@ -544,6 +544,7 @@ static int create_region(struct cxl_ctx *ctx, int *count,
>  	unsigned long flags = UTIL_JSON_TARGETS;
>  	struct json_object *jregion;
>  	struct cxl_region *region;
> +	bool default_size = true;
>  	int i, rc, granularity;
>  	u64 size, max_extent;
>  	const char *devname;
> @@ -555,6 +556,7 @@ static int create_region(struct cxl_ctx *ctx, int *count,
>  
>  	if (p->size) {
>  		size = p->size;
> +		default_size = false;
>  	} else if (p->ep_min_size) {
>  		size = p->ep_min_size * p->ways;
>  	} else {
> @@ -567,13 +569,16 @@ static int create_region(struct cxl_ctx *ctx, int *count,
>  			cxl_decoder_get_devname(p->root_decoder));
>  		return -EINVAL;
>  	}
> -	if (size > max_extent) {
> +	if (!default_size && size > max_extent) {
>  		log_err(&rl,
>  			"%s: region size %#lx exceeds max available space\n",
>  			cxl_decoder_get_devname(p->root_decoder), size);
>  		return -ENOSPC;
>  	}
>  
> +	if (size > max_extent)
> +		size = ALIGN_DOWN(max_extent, SZ_256M * p->ways);
> +
>  	if (p->mode == CXL_DECODER_MODE_PMEM) {
>  		region = cxl_decoder_create_pmem_region(p->root_decoder);
>  		if (!region) {
>
diff mbox series

Patch

diff --git a/cxl/region.c b/cxl/region.c
index 36ebc8e5210f..286c358f1a34 100644
--- a/cxl/region.c
+++ b/cxl/region.c
@@ -544,6 +544,7 @@  static int create_region(struct cxl_ctx *ctx, int *count,
 	unsigned long flags = UTIL_JSON_TARGETS;
 	struct json_object *jregion;
 	struct cxl_region *region;
+	bool default_size = true;
 	int i, rc, granularity;
 	u64 size, max_extent;
 	const char *devname;
@@ -555,6 +556,7 @@  static int create_region(struct cxl_ctx *ctx, int *count,
 
 	if (p->size) {
 		size = p->size;
+		default_size = false;
 	} else if (p->ep_min_size) {
 		size = p->ep_min_size * p->ways;
 	} else {
@@ -567,13 +569,16 @@  static int create_region(struct cxl_ctx *ctx, int *count,
 			cxl_decoder_get_devname(p->root_decoder));
 		return -EINVAL;
 	}
-	if (size > max_extent) {
+	if (!default_size && size > max_extent) {
 		log_err(&rl,
 			"%s: region size %#lx exceeds max available space\n",
 			cxl_decoder_get_devname(p->root_decoder), size);
 		return -ENOSPC;
 	}
 
+	if (size > max_extent)
+		size = ALIGN_DOWN(max_extent, SZ_256M * p->ways);
+
 	if (p->mode == CXL_DECODER_MODE_PMEM) {
 		region = cxl_decoder_create_pmem_region(p->root_decoder);
 		if (!region) {