Lines Matching +full:data +full:- +full:mapping

1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2017-2018 Intel Corporation. All rights reserved. */
10 #include "dax-private.h"
36 * We only ever expect to handle device-dax instances, i.e. the in dax_bus_uevent()
51 list_for_each_entry(dax_id, &dax_drv->ids, list) in __dax_match_id()
52 if (sysfs_streq(dax_id->dev_name, dev_name)) in __dax_match_id()
73 if (dev_dax->region->res.flags & IORESOURCE_DAX_KMEM) in dax_match_type()
76 if (dax_drv->type == type) in dax_match_type()
80 if (dax_drv->type == DAXDRV_DEVICE_TYPE && in dax_match_type()
104 return -EINVAL; in do_id_store()
107 return -EINVAL; in do_id_store()
115 strscpy(dax_id->dev_name, buf, DAX_NAME_LEN); in do_id_store()
116 list_add(&dax_id->list, &dax_drv->ids); in do_id_store()
118 rc = -ENOMEM; in do_id_store()
121 list_del(&dax_id->list); in do_id_store()
170 * (IORESOURCE_DAX_STATIC). On static dax devices, the @pgmap is pre-assigned
172 * devices it is NULL but afterwards allocated by dax core on device ->probe().
178 return (dax_region->res.flags & IORESOURCE_DAX_STATIC) != 0; in is_static()
183 return is_static(dev_dax->region); in static_dev_dax()
194 for (i = 0; i < dev_dax->nr_range; i++) in dev_dax_size()
195 size += range_len(&dev_dax->ranges[i].range); in dev_dax_size()
202 struct dax_device_driver *dax_drv = to_dax_drv(dev->driver); in dax_bus_probe()
204 struct dax_region *dax_region = dev_dax->region; in dax_bus_probe()
214 if (size == 0 || dev_dax->id < 0) in dax_bus_probe()
215 return -ENXIO; in dax_bus_probe()
217 rc = dax_drv->probe(dev_dax); in dax_bus_probe()
226 if (dax_region->seed == dev) in dax_bus_probe()
227 dax_region->seed = NULL; in dax_bus_probe()
234 struct dax_device_driver *dax_drv = to_dax_drv(dev->driver); in dax_bus_remove()
237 if (dax_drv->remove) in dax_bus_remove()
238 dax_drv->remove(dev_dax); in dax_bus_remove()
269 return sysfs_emit(buf, "%d\n", dax_region->id); in id_show()
279 (unsigned long long)resource_size(&dax_region->res)); in region_size_show()
289 return sysfs_emit(buf, "%u\n", dax_region->align); in region_align_show()
295 for (res = (dax_region)->res.child; res; res = res->sibling)
299 resource_size_t size = resource_size(&dax_region->res); in dax_region_avail_size()
305 size -= resource_size(res); in dax_region_avail_size()
334 return -EINVAL; in seed_show()
339 seed = dax_region->seed; in seed_show()
355 return -EINVAL; in create_show()
360 youngest = dax_region->youngest; in create_show()
367 static struct dev_dax *__devm_create_dev_dax(struct dev_dax_data *data);
378 return -EINVAL; in create_store()
384 return -EINVAL; in create_store()
391 rc = -ENOSPC; in create_store()
393 struct dev_dax_data data = { in create_store() local
396 .id = -1, in create_store()
399 struct dev_dax *dev_dax = __devm_create_dev_dax(&data); in create_store()
411 if (!dax_region->seed) in create_store()
412 dax_region->seed = &dev_dax->dev; in create_store()
413 dax_region->youngest = &dev_dax->dev; in create_store()
425 struct dax_device *dax_dev = dev_dax->dax_dev; in kill_dev_dax()
429 unmap_mapping_range(inode->i_mapping, 0, 0, 1); in kill_dev_dax()
437 dev_dax->pgmap = NULL; in kill_dev_dax()
443 int i = dev_dax->nr_range - 1; in trim_dev_dax_range()
444 struct range *range = &dev_dax->ranges[i].range; in trim_dev_dax_range()
445 struct dax_region *dax_region = dev_dax->region; in trim_dev_dax_range()
448 dev_dbg(&dev_dax->dev, "delete range[%d]: %#llx:%#llx\n", i, in trim_dev_dax_range()
449 (unsigned long long)range->start, in trim_dev_dax_range()
450 (unsigned long long)range->end); in trim_dev_dax_range()
452 __release_region(&dax_region->res, range->start, range_len(range)); in trim_dev_dax_range()
453 if (--dev_dax->nr_range == 0) { in trim_dev_dax_range()
454 kfree(dev_dax->ranges); in trim_dev_dax_range()
455 dev_dax->ranges = NULL; in trim_dev_dax_range()
461 while (dev_dax->nr_range) in free_dev_dax_ranges()
489 kref_put(&dax_region->kref, dax_region_free); in dax_region_put()
496 int rc = dev_dax->id; in __free_dev_dax_id()
500 if (!dev_dax->dyn_id || dev_dax->id < 0) in __free_dev_dax_id()
501 return -1; in __free_dev_dax_id()
502 dax_region = dev_dax->region; in __free_dev_dax_id()
503 ida_free(&dax_region->ida, dev_dax->id); in __free_dev_dax_id()
505 dev_dax->id = -1; in __free_dev_dax_id()
523 struct dax_region *dax_region = dev_dax->region; in alloc_dev_dax_id()
526 id = ida_alloc(&dax_region->ida, GFP_KERNEL); in alloc_dev_dax_id()
529 kref_get(&dax_region->kref); in alloc_dev_dax_id()
530 dev_dax->dyn_id = true; in alloc_dev_dax_id()
531 dev_dax->id = id; in alloc_dev_dax_id()
545 return -EINVAL; in delete_store()
547 victim = device_find_child_by_name(dax_region->dev, buf); in delete_store()
549 return -ENXIO; in delete_store()
555 if (victim->driver || dev_dax_size(dev_dax)) in delete_store()
556 rc = -EBUSY; in delete_store()
560 * again, but always preserve device-id-0 so that in delete_store()
564 if (dev_dax->id > 0) { in delete_store()
567 if (dax_region->seed == victim) in delete_store()
568 dax_region->seed = NULL; in delete_store()
569 if (dax_region->youngest == victim) in delete_store()
570 dax_region->youngest = NULL; in delete_store()
572 rc = -EBUSY; in delete_store()
599 return a->mode; in dax_region_visible()
628 sysfs_remove_groups(&dax_region->dev->kobj, in dax_region_unregister()
640 * The DAX core assumes that it can store its private data in in alloc_dax_region()
641 * parent->driver_data. This WARN is a reminder / safeguard for in alloc_dax_region()
642 * developers of device-dax drivers. in alloc_dax_region()
645 dev_WARN(parent, "dax core failed to setup private data\n"); in alloc_dax_region()
649 if (!IS_ALIGNED(range->start, align) in alloc_dax_region()
658 kref_init(&dax_region->kref); in alloc_dax_region()
659 dax_region->id = region_id; in alloc_dax_region()
660 dax_region->align = align; in alloc_dax_region()
661 dax_region->dev = parent; in alloc_dax_region()
662 dax_region->target_node = target_node; in alloc_dax_region()
663 ida_init(&dax_region->ida); in alloc_dax_region()
664 dax_region->res = (struct resource) { in alloc_dax_region()
665 .start = range->start, in alloc_dax_region()
666 .end = range->end, in alloc_dax_region()
670 if (sysfs_create_groups(&parent->kobj, dax_region_attribute_groups)) { in alloc_dax_region()
683 struct dax_mapping *mapping = to_dax_mapping(dev); in dax_mapping_release() local
684 struct device *parent = dev->parent; in dax_mapping_release()
687 ida_free(&dev_dax->ida, mapping->id); in dax_mapping_release()
688 kfree(mapping); in dax_mapping_release()
692 static void unregister_dax_mapping(void *data) in unregister_dax_mapping() argument
694 struct device *dev = data; in unregister_dax_mapping()
695 struct dax_mapping *mapping = to_dax_mapping(dev); in unregister_dax_mapping() local
696 struct dev_dax *dev_dax = to_dev_dax(dev->parent); in unregister_dax_mapping()
700 dev_dax->ranges[mapping->range_id].mapping = NULL; in unregister_dax_mapping()
701 mapping->range_id = -1; in unregister_dax_mapping()
708 struct dax_mapping *mapping = to_dax_mapping(dev); in get_dax_range() local
709 struct dev_dax *dev_dax = to_dev_dax(dev->parent); in get_dax_range()
715 if (mapping->range_id < 0) { in get_dax_range()
720 return &dev_dax->ranges[mapping->range_id]; in get_dax_range()
736 return -ENXIO; in start_show()
737 rc = sysfs_emit(buf, "%#llx\n", dax_range->range.start); in start_show()
752 return -ENXIO; in end_show()
753 rc = sysfs_emit(buf, "%#llx\n", dax_range->range.end); in end_show()
768 return -ENXIO; in pgoff_show()
769 rc = sysfs_emit(buf, "%#lx\n", dax_range->pgoff); in pgoff_show()
799 struct dax_region *dax_region = dev_dax->region; in devm_register_dax_mapping()
800 struct dax_mapping *mapping; in devm_register_dax_mapping() local
806 if (dev_WARN_ONCE(&dev_dax->dev, !dax_region->dev->driver, in devm_register_dax_mapping()
808 return -ENXIO; in devm_register_dax_mapping()
810 mapping = kzalloc(sizeof(*mapping), GFP_KERNEL); in devm_register_dax_mapping()
811 if (!mapping) in devm_register_dax_mapping()
812 return -ENOMEM; in devm_register_dax_mapping()
813 mapping->range_id = range_id; in devm_register_dax_mapping()
814 mapping->id = ida_alloc(&dev_dax->ida, GFP_KERNEL); in devm_register_dax_mapping()
815 if (mapping->id < 0) { in devm_register_dax_mapping()
816 kfree(mapping); in devm_register_dax_mapping()
817 return -ENOMEM; in devm_register_dax_mapping()
819 dev_dax->ranges[range_id].mapping = mapping; in devm_register_dax_mapping()
820 dev = &mapping->dev; in devm_register_dax_mapping()
822 dev->parent = &dev_dax->dev; in devm_register_dax_mapping()
823 get_device(dev->parent); in devm_register_dax_mapping()
824 dev->type = &dax_mapping_type; in devm_register_dax_mapping()
825 dev_set_name(dev, "mapping%d", mapping->id); in devm_register_dax_mapping()
832 rc = devm_add_action_or_reset(dax_region->dev, unregister_dax_mapping, in devm_register_dax_mapping()
842 struct dax_region *dax_region = dev_dax->region; in alloc_dev_dax_range()
843 struct resource *res = &dax_region->res; in alloc_dev_dax_range()
844 struct device *dev = &dev_dax->dev; in alloc_dev_dax_range()
854 if (dev_WARN_ONCE(dev, dev_dax->nr_range, in alloc_dev_dax_range()
855 "0-size allocation must be first\n")) in alloc_dev_dax_range()
856 return -EBUSY; in alloc_dev_dax_range()
857 /* nr_range == 0 is elsewhere special cased as 0-size device */ in alloc_dev_dax_range()
863 return -ENOMEM; in alloc_dev_dax_range()
865 ranges = krealloc(dev_dax->ranges, sizeof(*ranges) in alloc_dev_dax_range()
866 * (dev_dax->nr_range + 1), GFP_KERNEL); in alloc_dev_dax_range()
868 __release_region(res, alloc->start, resource_size(alloc)); in alloc_dev_dax_range()
869 return -ENOMEM; in alloc_dev_dax_range()
872 for (i = 0; i < dev_dax->nr_range; i++) in alloc_dev_dax_range()
874 dev_dax->ranges = ranges; in alloc_dev_dax_range()
875 ranges[dev_dax->nr_range++] = (struct dev_dax_range) { in alloc_dev_dax_range()
878 .start = alloc->start, in alloc_dev_dax_range()
879 .end = alloc->end, in alloc_dev_dax_range()
883 dev_dbg(dev, "alloc range[%d]: %pa:%pa\n", dev_dax->nr_range - 1, in alloc_dev_dax_range()
884 &alloc->start, &alloc->end); in alloc_dev_dax_range()
886 * A dev_dax instance must be registered before mapping device in alloc_dev_dax_range()
888 * the initial mapping device. in alloc_dev_dax_range()
890 if (!device_is_registered(&dev_dax->dev)) in alloc_dev_dax_range()
893 rc = devm_register_dax_mapping(dev_dax, dev_dax->nr_range - 1); in alloc_dev_dax_range()
902 int last_range = dev_dax->nr_range - 1; in adjust_dev_dax_range()
903 struct dev_dax_range *dax_range = &dev_dax->ranges[last_range]; in adjust_dev_dax_range()
905 struct range *range = &dax_range->range; in adjust_dev_dax_range()
906 struct device *dev = &dev_dax->dev; in adjust_dev_dax_range()
912 return -EINVAL; in adjust_dev_dax_range()
914 rc = adjust_resource(res, range->start, size); in adjust_dev_dax_range()
919 .start = range->start, in adjust_dev_dax_range()
920 .end = range->start + size - 1, in adjust_dev_dax_range()
924 last_range, (unsigned long long) range->start, in adjust_dev_dax_range()
925 (unsigned long long) range->end); in adjust_dev_dax_range()
949 * The minimum mapping granularity for a device instance is a in alloc_is_aligned()
952 return IS_ALIGNED(size, max_t(unsigned long, dev_dax->align, memremap_compat_align())); in alloc_is_aligned()
957 resource_size_t to_shrink = dev_dax_size(dev_dax) - size; in dev_dax_shrink()
958 struct dax_region *dax_region = dev_dax->region; in dev_dax_shrink()
959 struct device *dev = &dev_dax->dev; in dev_dax_shrink()
962 for (i = dev_dax->nr_range - 1; i >= 0; i--) { in dev_dax_shrink()
963 struct range *range = &dev_dax->ranges[i].range; in dev_dax_shrink()
964 struct dax_mapping *mapping = dev_dax->ranges[i].mapping; in dev_dax_shrink() local
970 devm_release_action(dax_region->dev, in dev_dax_shrink()
971 unregister_dax_mapping, &mapping->dev); in dev_dax_shrink()
973 to_shrink -= shrink; in dev_dax_shrink()
980 if (strcmp(res->name, dev_name(dev)) == 0 in dev_dax_shrink()
981 && res->start == range->start) { in dev_dax_shrink()
986 if (dev_WARN_ONCE(dev, !adjust || i != dev_dax->nr_range - 1, in dev_dax_shrink()
988 return -ENXIO; in dev_dax_shrink()
990 - shrink); in dev_dax_shrink()
997 * allocations. I.e. the dev_dax->ranges array is ordered by increasing pgoff.
1004 if (dev_dax->nr_range == 0) in adjust_ok()
1006 if (strcmp(res->name, dev_name(&dev_dax->dev)) != 0) in adjust_ok()
1008 last = &dev_dax->ranges[dev_dax->nr_range - 1]; in adjust_ok()
1009 if (last->range.start != res->start || last->range.end != res->end) in adjust_ok()
1011 for (i = 0; i < dev_dax->nr_range - 1; i++) { in adjust_ok()
1012 struct dev_dax_range *dax_range = &dev_dax->ranges[i]; in adjust_ok()
1014 if (dax_range->pgoff > last->pgoff) in adjust_ok()
1026 struct resource *region_res = &dax_region->res; in dev_dax_resize()
1027 struct device *dev = &dev_dax->dev; in dev_dax_resize()
1032 if (dev->driver) in dev_dax_resize()
1033 return -EBUSY; in dev_dax_resize()
1036 if (size > dev_size && size - dev_size > avail) in dev_dax_resize()
1037 return -ENOSPC; in dev_dax_resize()
1041 to_alloc = size - dev_size; in dev_dax_resize()
1044 return -ENXIO; in dev_dax_resize()
1052 first = region_res->child; in dev_dax_resize()
1054 return alloc_dev_dax_range(dev_dax, dax_region->res.start, to_alloc); in dev_dax_resize()
1056 rc = -ENOSPC; in dev_dax_resize()
1057 for (res = first; res; res = res->sibling) { in dev_dax_resize()
1058 struct resource *next = res->sibling; in dev_dax_resize()
1061 if (res == first && res->start > dax_region->res.start) { in dev_dax_resize()
1062 alloc = min(res->start - dax_region->res.start, to_alloc); in dev_dax_resize()
1063 rc = alloc_dev_dax_range(dev_dax, dax_region->res.start, alloc); in dev_dax_resize()
1069 if (next && next->start > res->end + 1) in dev_dax_resize()
1070 alloc = min(next->start - (res->end + 1), to_alloc); in dev_dax_resize()
1073 if (!alloc && !next && res->end < region_res->end) in dev_dax_resize()
1074 alloc = min(region_res->end - res->end, to_alloc); in dev_dax_resize()
1083 rc = alloc_dev_dax_range(dev_dax, res->end + 1, alloc); in dev_dax_resize()
1088 to_alloc -= alloc; in dev_dax_resize()
1100 struct dax_region *dax_region = dev_dax->region; in size_store()
1108 return -EINVAL; in size_store()
1114 if (!dax_region->dev->driver) { in size_store()
1115 rc = -ENXIO; in size_store()
1139 ssize_t rc = -EINVAL; in range_parse()
1146 start = strsep(&end, "-"); in range_parse()
1153 range->start = addr; in range_parse()
1158 range->end = addr; in range_parse()
1169 struct dax_region *dax_region = dev_dax->region; in mapping_store()
1181 if (!dax_region->dev->driver) { in mapping_store()
1199 static DEVICE_ATTR_WO(mapping);
1206 return sysfs_emit(buf, "%d\n", dev_dax->align); in align_show()
1211 struct device *dev = &dev_dax->dev; in dev_dax_validate_align()
1214 for (i = 0; i < dev_dax->nr_range; i++) { in dev_dax_validate_align()
1215 size_t len = range_len(&dev_dax->ranges[i].range); in dev_dax_validate_align()
1219 __func__, dev_dax->align, i); in dev_dax_validate_align()
1220 return -EINVAL; in dev_dax_validate_align()
1231 struct dax_region *dax_region = dev_dax->region; in align_store()
1237 return -ENXIO; in align_store()
1240 return -EINVAL; in align_store()
1245 if (!dax_region->dev->driver) { in align_store()
1247 return -ENXIO; in align_store()
1255 if (dev->driver) { in align_store()
1256 rc = -EBUSY; in align_store()
1260 align_save = dev_dax->align; in align_store()
1261 dev_dax->align = val; in align_store()
1264 dev_dax->align = align_save; in align_store()
1274 struct dax_region *dax_region = dev_dax->region; in dev_dax_target_node()
1276 return dax_region->target_node; in dev_dax_target_node()
1292 struct dax_region *dax_region = dev_dax->region; in resource_show()
1295 if (dev_dax->nr_range < 1) in resource_show()
1296 start = dax_region->res.start; in resource_show()
1298 start = dev_dax->ranges[0].range.start; in resource_show()
1308 * We only ever expect to handle device-dax instances, i.e. the in modalias_show()
1327 return sysfs_emit(buf, "%d\n", dev_dax->memmap_on_memory); in memmap_on_memory_show()
1344 return -EOPNOTSUPP; in memmap_on_memory_store()
1351 if (dev_dax->memmap_on_memory != val && dev->driver && in memmap_on_memory_store()
1352 to_dax_drv(dev->driver)->type == DAXDRV_KMEM_TYPE) { in memmap_on_memory_store()
1354 return -EBUSY; in memmap_on_memory_store()
1357 dev_dax->memmap_on_memory = val; in memmap_on_memory_store()
1368 struct dax_region *dax_region = dev_dax->region; in dev_dax_visible()
1379 return a->mode; in dev_dax_visible()
1407 struct dax_device *dax_dev = dev_dax->dax_dev; in dev_dax_release()
1411 kfree(dev_dax->pgmap); in dev_dax_release()
1420 static struct dev_dax *__devm_create_dev_dax(struct dev_dax_data *data) in __devm_create_dev_dax() argument
1422 struct dax_region *dax_region = data->dax_region; in __devm_create_dev_dax()
1423 struct device *parent = dax_region->dev; in __devm_create_dev_dax()
1432 return ERR_PTR(-ENOMEM); in __devm_create_dev_dax()
1434 dev_dax->region = dax_region; in __devm_create_dev_dax()
1436 if (dev_WARN_ONCE(parent, data->id < 0, in __devm_create_dev_dax()
1438 rc = -EINVAL; in __devm_create_dev_dax()
1442 dev_dax->id = data->id; in __devm_create_dev_dax()
1444 if (dev_WARN_ONCE(parent, data->id >= 0, in __devm_create_dev_dax()
1446 rc = -EINVAL; in __devm_create_dev_dax()
1455 dev = &dev_dax->dev; in __devm_create_dev_dax()
1457 dev_set_name(dev, "dax%d.%d", dax_region->id, dev_dax->id); in __devm_create_dev_dax()
1459 rc = alloc_dev_dax_range(dev_dax, dax_region->res.start, data->size); in __devm_create_dev_dax()
1463 if (data->pgmap) { in __devm_create_dev_dax()
1467 dev_dax->pgmap = kmemdup(data->pgmap, in __devm_create_dev_dax()
1469 if (!dev_dax->pgmap) { in __devm_create_dev_dax()
1470 rc = -ENOMEM; in __devm_create_dev_dax()
1491 dev_dax->dax_dev = dax_dev; in __devm_create_dev_dax()
1492 dev_dax->target_node = dax_region->target_node; in __devm_create_dev_dax()
1493 dev_dax->align = dax_region->align; in __devm_create_dev_dax()
1494 ida_init(&dev_dax->ida); in __devm_create_dev_dax()
1496 dev_dax->memmap_on_memory = data->memmap_on_memory; in __devm_create_dev_dax()
1499 dev->devt = inode->i_rdev; in __devm_create_dev_dax()
1500 dev->bus = &dax_bus_type; in __devm_create_dev_dax()
1501 dev->parent = parent; in __devm_create_dev_dax()
1502 dev->type = &dev_dax_type; in __devm_create_dev_dax()
1511 rc = devm_add_action_or_reset(dax_region->dev, unregister_dev_dax, dev); in __devm_create_dev_dax()
1515 /* register mapping device for the initial allocation range */ in __devm_create_dev_dax()
1516 if (dev_dax->nr_range && range_len(&dev_dax->ranges[0].range)) { in __devm_create_dev_dax()
1525 kfree(dev_dax->pgmap); in __devm_create_dev_dax()
1536 struct dev_dax *devm_create_dev_dax(struct dev_dax_data *data) in devm_create_dev_dax() argument
1541 dev_dax = __devm_create_dev_dax(data); in devm_create_dev_dax()
1551 struct device_driver *drv = &dax_drv->drv; in __dax_driver_register()
1554 * dax_bus_probe() calls dax_drv->probe() unconditionally. in __dax_driver_register()
1557 if (!dax_drv->probe) in __dax_driver_register()
1558 return -EINVAL; in __dax_driver_register()
1560 INIT_LIST_HEAD(&dax_drv->ids); in __dax_driver_register()
1561 drv->owner = module; in __dax_driver_register()
1562 drv->name = mod_name; in __dax_driver_register()
1563 drv->mod_name = mod_name; in __dax_driver_register()
1564 drv->bus = &dax_bus_type; in __dax_driver_register()
1572 struct device_driver *drv = &dax_drv->drv; in dax_driver_unregister()
1576 list_for_each_entry_safe(dax_id, _id, &dax_drv->ids, list) { in dax_driver_unregister()
1577 list_del(&dax_id->list); in dax_driver_unregister()