On 3/22/26 12:53 PM, Smita Koralahalli wrote:
> Introduce a global "DAX Regions" resource root and register each
> dax_region->res under it via request_resource(). Release the resource on
> dax_region teardown.
> 
> By enforcing a single global namespace for dax_region allocations, this
> ensures only one of dax_hmem or dax_cxl can successfully register a
> dax_region for a given range.
> 
> Suggested-by: Dan Williams <[email protected]>
> Signed-off-by: Smita Koralahalli <[email protected]>
> Reviewed-by: Jonathan Cameron <[email protected]>

Reviewed-by: Dave Jiang <[email protected]>

> ---
>  drivers/dax/bus.c | 20 +++++++++++++++++---
>  1 file changed, 17 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/dax/bus.c b/drivers/dax/bus.c
> index 299134c9b294..68437c05e21d 100644
> --- a/drivers/dax/bus.c
> +++ b/drivers/dax/bus.c
> @@ -10,6 +10,7 @@
>  #include "dax-private.h"
>  #include "bus.h"
>  
> +static struct resource dax_regions = DEFINE_RES_MEM_NAMED(0, -1, "DAX 
> Regions");
>  static DEFINE_MUTEX(dax_bus_lock);
>  
>  /*
> @@ -627,6 +628,7 @@ static void dax_region_unregister(void *region)
>  
>       sysfs_remove_groups(&dax_region->dev->kobj,
>                       dax_region_attribute_groups);
> +     release_resource(&dax_region->res);
>       dax_region_put(dax_region);
>  }
>  
> @@ -635,6 +637,7 @@ struct dax_region *alloc_dax_region(struct device 
> *parent, int region_id,
>               unsigned long flags)
>  {
>       struct dax_region *dax_region;
> +     int rc;
>  
>       /*
>        * The DAX core assumes that it can store its private data in
> @@ -667,14 +670,25 @@ struct dax_region *alloc_dax_region(struct device 
> *parent, int region_id,
>               .flags = IORESOURCE_MEM | flags,
>       };
>  
> -     if (sysfs_create_groups(&parent->kobj, dax_region_attribute_groups)) {
> -             dax_region_put(dax_region);
> -             return NULL;
> +     rc = request_resource(&dax_regions, &dax_region->res);
> +     if (rc) {
> +             dev_dbg(parent, "dax_region resource conflict for %pR\n",
> +                     &dax_region->res);
> +             goto err_res;
>       }
>  
> +     if (sysfs_create_groups(&parent->kobj, dax_region_attribute_groups))
> +             goto err_sysfs;
> +
>       if (devm_add_action_or_reset(parent, dax_region_unregister, dax_region))
>               return NULL;
>       return dax_region;
> +
> +err_sysfs:
> +     release_resource(&dax_region->res);
> +err_res:
> +     dax_region_put(dax_region);
> +     return NULL;
>  }
>  EXPORT_SYMBOL_GPL(alloc_dax_region);
>  


Reply via email to