|
@@ -395,7 +395,7 @@ EXPORT_SYMBOL_GPL(nvdimm_create);
|
|
|
|
|
|
int alias_dpa_busy(struct device *dev, void *data)
|
|
|
{
|
|
|
- resource_size_t map_end, blk_start, new, busy;
|
|
|
+ resource_size_t map_end, blk_start, new;
|
|
|
struct blk_alloc_info *info = data;
|
|
|
struct nd_mapping *nd_mapping;
|
|
|
struct nd_region *nd_region;
|
|
@@ -436,29 +436,19 @@ int alias_dpa_busy(struct device *dev, void *data)
|
|
|
retry:
|
|
|
/*
|
|
|
* Find the free dpa from the end of the last pmem allocation to
|
|
|
- * the end of the interleave-set mapping that is not already
|
|
|
- * covered by a blk allocation.
|
|
|
+ * the end of the interleave-set mapping.
|
|
|
*/
|
|
|
- busy = 0;
|
|
|
for_each_dpa_resource(ndd, res) {
|
|
|
+ if (strncmp(res->name, "pmem", 4) != 0)
|
|
|
+ continue;
|
|
|
if ((res->start >= blk_start && res->start < map_end)
|
|
|
|| (res->end >= blk_start
|
|
|
&& res->end <= map_end)) {
|
|
|
- if (strncmp(res->name, "pmem", 4) == 0) {
|
|
|
- new = max(blk_start, min(map_end + 1,
|
|
|
- res->end + 1));
|
|
|
- if (new != blk_start) {
|
|
|
- blk_start = new;
|
|
|
- goto retry;
|
|
|
- }
|
|
|
- } else
|
|
|
- busy += min(map_end, res->end)
|
|
|
- - max(nd_mapping->start, res->start) + 1;
|
|
|
- } else if (nd_mapping->start > res->start
|
|
|
- && map_end < res->end) {
|
|
|
- /* total eclipse of the PMEM region mapping */
|
|
|
- busy += nd_mapping->size;
|
|
|
- break;
|
|
|
+ new = max(blk_start, min(map_end + 1, res->end + 1));
|
|
|
+ if (new != blk_start) {
|
|
|
+ blk_start = new;
|
|
|
+ goto retry;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -470,52 +460,11 @@ int alias_dpa_busy(struct device *dev, void *data)
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
- info->available -= blk_start - nd_mapping->start + busy;
|
|
|
+ info->available -= blk_start - nd_mapping->start;
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int blk_dpa_busy(struct device *dev, void *data)
|
|
|
-{
|
|
|
- struct blk_alloc_info *info = data;
|
|
|
- struct nd_mapping *nd_mapping;
|
|
|
- struct nd_region *nd_region;
|
|
|
- resource_size_t map_end;
|
|
|
- int i;
|
|
|
-
|
|
|
- if (!is_nd_pmem(dev))
|
|
|
- return 0;
|
|
|
-
|
|
|
- nd_region = to_nd_region(dev);
|
|
|
- for (i = 0; i < nd_region->ndr_mappings; i++) {
|
|
|
- nd_mapping = &nd_region->mapping[i];
|
|
|
- if (nd_mapping->nvdimm == info->nd_mapping->nvdimm)
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- if (i >= nd_region->ndr_mappings)
|
|
|
- return 0;
|
|
|
-
|
|
|
- map_end = nd_mapping->start + nd_mapping->size - 1;
|
|
|
- if (info->res->start >= nd_mapping->start
|
|
|
- && info->res->start < map_end) {
|
|
|
- if (info->res->end <= map_end) {
|
|
|
- info->busy = 0;
|
|
|
- return 1;
|
|
|
- } else {
|
|
|
- info->busy -= info->res->end - map_end;
|
|
|
- return 0;
|
|
|
- }
|
|
|
- } else if (info->res->end >= nd_mapping->start
|
|
|
- && info->res->end <= map_end) {
|
|
|
- info->busy -= nd_mapping->start - info->res->start;
|
|
|
- return 0;
|
|
|
- } else {
|
|
|
- info->busy -= nd_mapping->size;
|
|
|
- return 0;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* nd_blk_available_dpa - account the unused dpa of BLK region
|
|
|
* @nd_mapping: container of dpa-resource-root + labels
|
|
@@ -545,11 +494,7 @@ resource_size_t nd_blk_available_dpa(struct nd_region *nd_region)
|
|
|
for_each_dpa_resource(ndd, res) {
|
|
|
if (strncmp(res->name, "blk", 3) != 0)
|
|
|
continue;
|
|
|
-
|
|
|
- info.res = res;
|
|
|
- info.busy = resource_size(res);
|
|
|
- device_for_each_child(&nvdimm_bus->dev, &info, blk_dpa_busy);
|
|
|
- info.available -= info.busy;
|
|
|
+ info.available -= resource_size(res);
|
|
|
}
|
|
|
|
|
|
return info.available;
|