Skip to content

Commit 34f80bb

Browse files
skoralahdavejiang
authored andcommitted
dax: Track all dax_region allocations under a global resource tree
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 <dan.j.williams@intel.com> Signed-off-by: Smita Koralahalli <Smita.KoralahalliChannabasappa@amd.com> Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com> Reviewed-by: Dave Jiang <dave.jiang@intel.com> Link: https://patch.msgid.link/20260322195343.206900-7-Smita.KoralahalliChannabasappa@amd.com Signed-off-by: Dan Williams <dan.j.williams@intel.com> Signed-off-by: Dave Jiang <dave.jiang@intel.com>
1 parent 39aa1d4 commit 34f80bb

1 file changed

Lines changed: 17 additions & 3 deletions

File tree

drivers/dax/bus.c

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "dax-private.h"
1111
#include "bus.h"
1212

13+
static struct resource dax_regions = DEFINE_RES_MEM_NAMED(0, -1, "DAX Regions");
1314
static DEFINE_MUTEX(dax_bus_lock);
1415

1516
/*
@@ -627,6 +628,7 @@ static void dax_region_unregister(void *region)
627628

628629
sysfs_remove_groups(&dax_region->dev->kobj,
629630
dax_region_attribute_groups);
631+
release_resource(&dax_region->res);
630632
dax_region_put(dax_region);
631633
}
632634

@@ -635,6 +637,7 @@ struct dax_region *alloc_dax_region(struct device *parent, int region_id,
635637
unsigned long flags)
636638
{
637639
struct dax_region *dax_region;
640+
int rc;
638641

639642
/*
640643
* 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,
667670
.flags = IORESOURCE_MEM | flags,
668671
};
669672

670-
if (sysfs_create_groups(&parent->kobj, dax_region_attribute_groups)) {
671-
dax_region_put(dax_region);
672-
return NULL;
673+
rc = request_resource(&dax_regions, &dax_region->res);
674+
if (rc) {
675+
dev_dbg(parent, "dax_region resource conflict for %pR\n",
676+
&dax_region->res);
677+
goto err_res;
673678
}
674679

680+
if (sysfs_create_groups(&parent->kobj, dax_region_attribute_groups))
681+
goto err_sysfs;
682+
675683
if (devm_add_action_or_reset(parent, dax_region_unregister, dax_region))
676684
return NULL;
677685
return dax_region;
686+
687+
err_sysfs:
688+
release_resource(&dax_region->res);
689+
err_res:
690+
dax_region_put(dax_region);
691+
return NULL;
678692
}
679693
EXPORT_SYMBOL_GPL(alloc_dax_region);
680694

0 commit comments

Comments
 (0)