Commit 127c3d2e authored by Dan Williams's avatar Dan Williams

Merge branch 'for-5.11/dax' into for-5.11/libnvdimm

Pull in miscellaneous device-dax fixups and cleanups for v5.11.
parents 4c467647 ff8da37d
...@@ -367,19 +367,28 @@ void kill_dev_dax(struct dev_dax *dev_dax) ...@@ -367,19 +367,28 @@ void kill_dev_dax(struct dev_dax *dev_dax)
} }
EXPORT_SYMBOL_GPL(kill_dev_dax); EXPORT_SYMBOL_GPL(kill_dev_dax);
static void free_dev_dax_ranges(struct dev_dax *dev_dax) static void trim_dev_dax_range(struct dev_dax *dev_dax)
{ {
int i = dev_dax->nr_range - 1;
struct range *range = &dev_dax->ranges[i].range;
struct dax_region *dax_region = dev_dax->region; struct dax_region *dax_region = dev_dax->region;
int i;
device_lock_assert(dax_region->dev); device_lock_assert(dax_region->dev);
for (i = 0; i < dev_dax->nr_range; i++) { dev_dbg(&dev_dax->dev, "delete range[%d]: %#llx:%#llx\n", i,
struct range *range = &dev_dax->ranges[i].range; (unsigned long long)range->start,
(unsigned long long)range->end);
__release_region(&dax_region->res, range->start,
range_len(range)); __release_region(&dax_region->res, range->start, range_len(range));
if (--dev_dax->nr_range == 0) {
kfree(dev_dax->ranges);
dev_dax->ranges = NULL;
} }
dev_dax->nr_range = 0; }
static void free_dev_dax_ranges(struct dev_dax *dev_dax)
{
while (dev_dax->nr_range)
trim_dev_dax_range(dev_dax);
} }
static void unregister_dev_dax(void *dev) static void unregister_dev_dax(void *dev)
...@@ -763,22 +772,14 @@ static int alloc_dev_dax_range(struct dev_dax *dev_dax, u64 start, ...@@ -763,22 +772,14 @@ static int alloc_dev_dax_range(struct dev_dax *dev_dax, u64 start,
return 0; return 0;
} }
ranges = krealloc(dev_dax->ranges, sizeof(*ranges) alloc = __request_region(res, start, size, dev_name(dev), 0);
* (dev_dax->nr_range + 1), GFP_KERNEL); if (!alloc)
if (!ranges)
return -ENOMEM; return -ENOMEM;
alloc = __request_region(res, start, size, dev_name(dev), 0); ranges = krealloc(dev_dax->ranges, sizeof(*ranges)
if (!alloc) { * (dev_dax->nr_range + 1), GFP_KERNEL);
/* if (!ranges) {
* If this was an empty set of ranges nothing else __release_region(res, alloc->start, resource_size(alloc));
* will release @ranges, so do it now.
*/
if (!dev_dax->nr_range) {
kfree(ranges);
ranges = NULL;
}
dev_dax->ranges = ranges;
return -ENOMEM; return -ENOMEM;
} }
...@@ -804,15 +805,10 @@ static int alloc_dev_dax_range(struct dev_dax *dev_dax, u64 start, ...@@ -804,15 +805,10 @@ static int alloc_dev_dax_range(struct dev_dax *dev_dax, u64 start,
return 0; return 0;
rc = devm_register_dax_mapping(dev_dax, dev_dax->nr_range - 1); rc = devm_register_dax_mapping(dev_dax, dev_dax->nr_range - 1);
if (rc) { if (rc)
dev_dbg(dev, "delete range[%d]: %pa:%pa\n", dev_dax->nr_range - 1, trim_dev_dax_range(dev_dax);
&alloc->start, &alloc->end);
dev_dax->nr_range--;
__release_region(res, alloc->start, resource_size(alloc));
return rc;
}
return 0; return rc;
} }
static int adjust_dev_dax_range(struct dev_dax *dev_dax, struct resource *res, resource_size_t size) static int adjust_dev_dax_range(struct dev_dax *dev_dax, struct resource *res, resource_size_t size)
...@@ -885,12 +881,7 @@ static int dev_dax_shrink(struct dev_dax *dev_dax, resource_size_t size) ...@@ -885,12 +881,7 @@ static int dev_dax_shrink(struct dev_dax *dev_dax, resource_size_t size)
if (shrink >= range_len(range)) { if (shrink >= range_len(range)) {
devm_release_action(dax_region->dev, devm_release_action(dax_region->dev,
unregister_dax_mapping, &mapping->dev); unregister_dax_mapping, &mapping->dev);
__release_region(&dax_region->res, range->start, trim_dev_dax_range(dev_dax);
range_len(range));
dev_dax->nr_range--;
dev_dbg(dev, "delete range[%d]: %#llx:%#llx\n", i,
(unsigned long long) range->start,
(unsigned long long) range->end);
to_shrink -= shrink; to_shrink -= shrink;
if (!to_shrink) if (!to_shrink)
break; break;
...@@ -1114,16 +1105,9 @@ static ssize_t align_show(struct device *dev, ...@@ -1114,16 +1105,9 @@ static ssize_t align_show(struct device *dev,
static ssize_t dev_dax_validate_align(struct dev_dax *dev_dax) static ssize_t dev_dax_validate_align(struct dev_dax *dev_dax)
{ {
resource_size_t dev_size = dev_dax_size(dev_dax);
struct device *dev = &dev_dax->dev; struct device *dev = &dev_dax->dev;
int i; int i;
if (dev_size > 0 && !alloc_is_aligned(dev_dax, dev_size)) {
dev_dbg(dev, "%s: align %u invalid for size %pa\n",
__func__, dev_dax->align, &dev_size);
return -EINVAL;
}
for (i = 0; i < dev_dax->nr_range; i++) { for (i = 0; i < dev_dax->nr_range; i++) {
size_t len = range_len(&dev_dax->ranges[i].range); size_t len = range_len(&dev_dax->ranges[i].range);
...@@ -1274,7 +1258,6 @@ static void dev_dax_release(struct device *dev) ...@@ -1274,7 +1258,6 @@ static void dev_dax_release(struct device *dev)
put_dax(dax_dev); put_dax(dax_dev);
free_dev_dax_id(dev_dax); free_dev_dax_id(dev_dax);
dax_region_put(dax_region); dax_region_put(dax_region);
kfree(dev_dax->ranges);
kfree(dev_dax->pgmap); kfree(dev_dax->pgmap);
kfree(dev_dax); kfree(dev_dax);
} }
......
...@@ -52,7 +52,7 @@ struct dev_dax *__dax_pmem_probe(struct device *dev, enum dev_dax_subsys subsys) ...@@ -52,7 +52,7 @@ struct dev_dax *__dax_pmem_probe(struct device *dev, enum dev_dax_subsys subsys)
/* adjust the dax_region range to the start of data */ /* adjust the dax_region range to the start of data */
range = pgmap.range; range = pgmap.range;
range.start += offset, range.start += offset;
dax_region = alloc_dax_region(dev, region_id, &range, dax_region = alloc_dax_region(dev, region_id, &range,
nd_region->target_node, le32_to_cpu(pfn_sb->align), nd_region->target_node, le32_to_cpu(pfn_sb->align),
IORESOURCE_DAX_STATIC); IORESOURCE_DAX_STATIC);
......
...@@ -752,6 +752,7 @@ static int __init dax_core_init(void) ...@@ -752,6 +752,7 @@ static int __init dax_core_init(void)
static void __exit dax_core_exit(void) static void __exit dax_core_exit(void)
{ {
dax_bus_exit();
unregister_chrdev_region(dax_devt, MINORMASK+1); unregister_chrdev_region(dax_devt, MINORMASK+1);
ida_destroy(&dax_minor_ida); ida_destroy(&dax_minor_ida);
dax_fs_exit(); dax_fs_exit();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment