diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/Kconfig | 43 | ||||
| -rw-r--r-- | lib/Kconfig.debug | 19 | ||||
| -rw-r--r-- | lib/Makefile | 3 | ||||
| -rw-r--r-- | lib/dma-debug.c | 65 | ||||
| -rw-r--r-- | lib/dma-direct.c | 32 | ||||
| -rw-r--r-- | lib/dma-noncoherent.c | 102 | ||||
| -rw-r--r-- | lib/errseq.c | 23 | ||||
| -rw-r--r-- | lib/find_bit_benchmark.c | 7 | ||||
| -rw-r--r-- | lib/iommu-common.c | 267 | ||||
| -rw-r--r-- | lib/iommu-helper.c | 14 | ||||
| -rw-r--r-- | lib/iov_iter.c | 65 | ||||
| -rw-r--r-- | lib/kobject.c | 11 | ||||
| -rw-r--r-- | lib/radix-tree.c | 10 | ||||
| -rw-r--r-- | lib/reed_solomon/decode_rs.c | 34 | ||||
| -rw-r--r-- | lib/reed_solomon/encode_rs.c | 15 | ||||
| -rw-r--r-- | lib/reed_solomon/reed_solomon.c | 240 | ||||
| -rw-r--r-- | lib/sbitmap.c | 113 | ||||
| -rw-r--r-- | lib/swiotlb.c | 15 | ||||
| -rw-r--r-- | lib/test_bitmap.c | 21 | ||||
| -rw-r--r-- | lib/vsprintf.c | 26 |
20 files changed, 594 insertions, 531 deletions
diff --git a/lib/Kconfig b/lib/Kconfig index 5fe577673b98..7a913937888b 100644 --- a/lib/Kconfig +++ b/lib/Kconfig | |||
| @@ -429,15 +429,50 @@ config SGL_ALLOC | |||
| 429 | bool | 429 | bool |
| 430 | default n | 430 | default n |
| 431 | 431 | ||
| 432 | config NEED_SG_DMA_LENGTH | ||
| 433 | bool | ||
| 434 | |||
| 435 | config NEED_DMA_MAP_STATE | ||
| 436 | bool | ||
| 437 | |||
| 438 | config ARCH_DMA_ADDR_T_64BIT | ||
| 439 | def_bool 64BIT || PHYS_ADDR_T_64BIT | ||
| 440 | |||
| 441 | config IOMMU_HELPER | ||
| 442 | bool | ||
| 443 | |||
| 444 | config ARCH_HAS_SYNC_DMA_FOR_DEVICE | ||
| 445 | bool | ||
| 446 | |||
| 447 | config ARCH_HAS_SYNC_DMA_FOR_CPU | ||
| 448 | bool | ||
| 449 | select NEED_DMA_MAP_STATE | ||
| 450 | |||
| 432 | config DMA_DIRECT_OPS | 451 | config DMA_DIRECT_OPS |
| 433 | bool | 452 | bool |
| 434 | depends on HAS_DMA && (!64BIT || ARCH_DMA_ADDR_T_64BIT) | 453 | depends on HAS_DMA |
| 435 | default n | 454 | |
| 455 | config DMA_NONCOHERENT_OPS | ||
| 456 | bool | ||
| 457 | depends on HAS_DMA | ||
| 458 | select DMA_DIRECT_OPS | ||
| 459 | |||
| 460 | config DMA_NONCOHERENT_MMAP | ||
| 461 | bool | ||
| 462 | depends on DMA_NONCOHERENT_OPS | ||
| 463 | |||
| 464 | config DMA_NONCOHERENT_CACHE_SYNC | ||
| 465 | bool | ||
| 466 | depends on DMA_NONCOHERENT_OPS | ||
| 436 | 467 | ||
| 437 | config DMA_VIRT_OPS | 468 | config DMA_VIRT_OPS |
| 438 | bool | 469 | bool |
| 439 | depends on HAS_DMA && (!64BIT || ARCH_DMA_ADDR_T_64BIT) | 470 | depends on HAS_DMA |
| 440 | default n | 471 | |
| 472 | config SWIOTLB | ||
| 473 | bool | ||
| 474 | select DMA_DIRECT_OPS | ||
| 475 | select NEED_DMA_MAP_STATE | ||
| 441 | 476 | ||
| 442 | config CHECK_SIGNATURE | 477 | config CHECK_SIGNATURE |
| 443 | bool | 478 | bool |
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index c40c7b734cd1..76555479ae36 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug | |||
| @@ -1634,7 +1634,7 @@ config PROVIDE_OHCI1394_DMA_INIT | |||
| 1634 | 1634 | ||
| 1635 | config DMA_API_DEBUG | 1635 | config DMA_API_DEBUG |
| 1636 | bool "Enable debugging of DMA-API usage" | 1636 | bool "Enable debugging of DMA-API usage" |
| 1637 | depends on HAVE_DMA_API_DEBUG | 1637 | select NEED_DMA_MAP_STATE |
| 1638 | help | 1638 | help |
| 1639 | Enable this option to debug the use of the DMA API by device drivers. | 1639 | Enable this option to debug the use of the DMA API by device drivers. |
| 1640 | With this option you will be able to detect common bugs in device | 1640 | With this option you will be able to detect common bugs in device |
| @@ -1651,6 +1651,23 @@ config DMA_API_DEBUG | |||
| 1651 | 1651 | ||
| 1652 | If unsure, say N. | 1652 | If unsure, say N. |
| 1653 | 1653 | ||
| 1654 | config DMA_API_DEBUG_SG | ||
| 1655 | bool "Debug DMA scatter-gather usage" | ||
| 1656 | default y | ||
| 1657 | depends on DMA_API_DEBUG | ||
| 1658 | help | ||
| 1659 | Perform extra checking that callers of dma_map_sg() have respected the | ||
| 1660 | appropriate segment length/boundary limits for the given device when | ||
| 1661 | preparing DMA scatterlists. | ||
| 1662 | |||
| 1663 | This is particularly likely to have been overlooked in cases where the | ||
| 1664 | dma_map_sg() API is used for general bulk mapping of pages rather than | ||
| 1665 | preparing literal scatter-gather descriptors, where there is a risk of | ||
| 1666 | unexpected behaviour from DMA API implementations if the scatterlist | ||
| 1667 | is technically out-of-spec. | ||
| 1668 | |||
| 1669 | If unsure, say N. | ||
| 1670 | |||
| 1654 | menuconfig RUNTIME_TESTING_MENU | 1671 | menuconfig RUNTIME_TESTING_MENU |
| 1655 | bool "Runtime Testing" | 1672 | bool "Runtime Testing" |
| 1656 | def_bool y | 1673 | def_bool y |
diff --git a/lib/Makefile b/lib/Makefile index ce20696d5a92..9f18c8152281 100644 --- a/lib/Makefile +++ b/lib/Makefile | |||
| @@ -30,6 +30,7 @@ lib-$(CONFIG_PRINTK) += dump_stack.o | |||
| 30 | lib-$(CONFIG_MMU) += ioremap.o | 30 | lib-$(CONFIG_MMU) += ioremap.o |
| 31 | lib-$(CONFIG_SMP) += cpumask.o | 31 | lib-$(CONFIG_SMP) += cpumask.o |
| 32 | lib-$(CONFIG_DMA_DIRECT_OPS) += dma-direct.o | 32 | lib-$(CONFIG_DMA_DIRECT_OPS) += dma-direct.o |
| 33 | lib-$(CONFIG_DMA_NONCOHERENT_OPS) += dma-noncoherent.o | ||
| 33 | lib-$(CONFIG_DMA_VIRT_OPS) += dma-virt.o | 34 | lib-$(CONFIG_DMA_VIRT_OPS) += dma-virt.o |
| 34 | 35 | ||
| 35 | lib-y += kobject.o klist.o | 36 | lib-y += kobject.o klist.o |
| @@ -147,7 +148,7 @@ obj-$(CONFIG_AUDIT_GENERIC) += audit.o | |||
| 147 | obj-$(CONFIG_AUDIT_COMPAT_GENERIC) += compat_audit.o | 148 | obj-$(CONFIG_AUDIT_COMPAT_GENERIC) += compat_audit.o |
| 148 | 149 | ||
| 149 | obj-$(CONFIG_SWIOTLB) += swiotlb.o | 150 | obj-$(CONFIG_SWIOTLB) += swiotlb.o |
| 150 | obj-$(CONFIG_IOMMU_HELPER) += iommu-helper.o iommu-common.o | 151 | obj-$(CONFIG_IOMMU_HELPER) += iommu-helper.o |
| 151 | obj-$(CONFIG_FAULT_INJECTION) += fault-inject.o | 152 | obj-$(CONFIG_FAULT_INJECTION) += fault-inject.o |
| 152 | obj-$(CONFIG_NOTIFIER_ERROR_INJECTION) += notifier-error-inject.o | 153 | obj-$(CONFIG_NOTIFIER_ERROR_INJECTION) += notifier-error-inject.o |
| 153 | obj-$(CONFIG_PM_NOTIFIER_ERROR_INJECT) += pm-notifier-error-inject.o | 154 | obj-$(CONFIG_PM_NOTIFIER_ERROR_INJECT) += pm-notifier-error-inject.o |
diff --git a/lib/dma-debug.c b/lib/dma-debug.c index 7f5cdc1e6b29..c007d25bee09 100644 --- a/lib/dma-debug.c +++ b/lib/dma-debug.c | |||
| @@ -41,6 +41,11 @@ | |||
| 41 | #define HASH_FN_SHIFT 13 | 41 | #define HASH_FN_SHIFT 13 |
| 42 | #define HASH_FN_MASK (HASH_SIZE - 1) | 42 | #define HASH_FN_MASK (HASH_SIZE - 1) |
| 43 | 43 | ||
| 44 | /* allow architectures to override this if absolutely required */ | ||
| 45 | #ifndef PREALLOC_DMA_DEBUG_ENTRIES | ||
| 46 | #define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16) | ||
| 47 | #endif | ||
| 48 | |||
| 44 | enum { | 49 | enum { |
| 45 | dma_debug_single, | 50 | dma_debug_single, |
| 46 | dma_debug_page, | 51 | dma_debug_page, |
| @@ -127,7 +132,7 @@ static u32 min_free_entries; | |||
| 127 | static u32 nr_total_entries; | 132 | static u32 nr_total_entries; |
| 128 | 133 | ||
| 129 | /* number of preallocated entries requested by kernel cmdline */ | 134 | /* number of preallocated entries requested by kernel cmdline */ |
| 130 | static u32 req_entries; | 135 | static u32 nr_prealloc_entries = PREALLOC_DMA_DEBUG_ENTRIES; |
| 131 | 136 | ||
| 132 | /* debugfs dentry's for the stuff above */ | 137 | /* debugfs dentry's for the stuff above */ |
| 133 | static struct dentry *dma_debug_dent __read_mostly; | 138 | static struct dentry *dma_debug_dent __read_mostly; |
| @@ -439,7 +444,6 @@ void debug_dma_dump_mappings(struct device *dev) | |||
| 439 | spin_unlock_irqrestore(&bucket->lock, flags); | 444 | spin_unlock_irqrestore(&bucket->lock, flags); |
| 440 | } | 445 | } |
| 441 | } | 446 | } |
| 442 | EXPORT_SYMBOL(debug_dma_dump_mappings); | ||
| 443 | 447 | ||
| 444 | /* | 448 | /* |
| 445 | * For each mapping (initial cacheline in the case of | 449 | * For each mapping (initial cacheline in the case of |
| @@ -748,7 +752,6 @@ int dma_debug_resize_entries(u32 num_entries) | |||
| 748 | 752 | ||
| 749 | return ret; | 753 | return ret; |
| 750 | } | 754 | } |
| 751 | EXPORT_SYMBOL(dma_debug_resize_entries); | ||
| 752 | 755 | ||
| 753 | /* | 756 | /* |
| 754 | * DMA-API debugging init code | 757 | * DMA-API debugging init code |
| @@ -1004,10 +1007,7 @@ void dma_debug_add_bus(struct bus_type *bus) | |||
| 1004 | bus_register_notifier(bus, nb); | 1007 | bus_register_notifier(bus, nb); |
| 1005 | } | 1008 | } |
| 1006 | 1009 | ||
| 1007 | /* | 1010 | static int dma_debug_init(void) |
| 1008 | * Let the architectures decide how many entries should be preallocated. | ||
| 1009 | */ | ||
| 1010 | void dma_debug_init(u32 num_entries) | ||
| 1011 | { | 1011 | { |
| 1012 | int i; | 1012 | int i; |
| 1013 | 1013 | ||
| @@ -1015,7 +1015,7 @@ void dma_debug_init(u32 num_entries) | |||
| 1015 | * called to set dma_debug_initialized | 1015 | * called to set dma_debug_initialized |
| 1016 | */ | 1016 | */ |
| 1017 | if (global_disable) | 1017 | if (global_disable) |
| 1018 | return; | 1018 | return 0; |
| 1019 | 1019 | ||
| 1020 | for (i = 0; i < HASH_SIZE; ++i) { | 1020 | for (i = 0; i < HASH_SIZE; ++i) { |
| 1021 | INIT_LIST_HEAD(&dma_entry_hash[i].list); | 1021 | INIT_LIST_HEAD(&dma_entry_hash[i].list); |
| @@ -1026,17 +1026,14 @@ void dma_debug_init(u32 num_entries) | |||
| 1026 | pr_err("DMA-API: error creating debugfs entries - disabling\n"); | 1026 | pr_err("DMA-API: error creating debugfs entries - disabling\n"); |
| 1027 | global_disable = true; | 1027 | global_disable = true; |
| 1028 | 1028 | ||
| 1029 | return; | 1029 | return 0; |
| 1030 | } | 1030 | } |
| 1031 | 1031 | ||
| 1032 | if (req_entries) | 1032 | if (prealloc_memory(nr_prealloc_entries) != 0) { |
| 1033 | num_entries = req_entries; | ||
| 1034 | |||
| 1035 | if (prealloc_memory(num_entries) != 0) { | ||
| 1036 | pr_err("DMA-API: debugging out of memory error - disabled\n"); | 1033 | pr_err("DMA-API: debugging out of memory error - disabled\n"); |
| 1037 | global_disable = true; | 1034 | global_disable = true; |
| 1038 | 1035 | ||
| 1039 | return; | 1036 | return 0; |
| 1040 | } | 1037 | } |
| 1041 | 1038 | ||
| 1042 | nr_total_entries = num_free_entries; | 1039 | nr_total_entries = num_free_entries; |
| @@ -1044,7 +1041,9 @@ void dma_debug_init(u32 num_entries) | |||
| 1044 | dma_debug_initialized = true; | 1041 | dma_debug_initialized = true; |
| 1045 | 1042 | ||
| 1046 | pr_info("DMA-API: debugging enabled by kernel config\n"); | 1043 | pr_info("DMA-API: debugging enabled by kernel config\n"); |
| 1044 | return 0; | ||
| 1047 | } | 1045 | } |
| 1046 | core_initcall(dma_debug_init); | ||
| 1048 | 1047 | ||
| 1049 | static __init int dma_debug_cmdline(char *str) | 1048 | static __init int dma_debug_cmdline(char *str) |
| 1050 | { | 1049 | { |
| @@ -1061,16 +1060,10 @@ static __init int dma_debug_cmdline(char *str) | |||
| 1061 | 1060 | ||
| 1062 | static __init int dma_debug_entries_cmdline(char *str) | 1061 | static __init int dma_debug_entries_cmdline(char *str) |
| 1063 | { | 1062 | { |
| 1064 | int res; | ||
| 1065 | |||
| 1066 | if (!str) | 1063 | if (!str) |
| 1067 | return -EINVAL; | 1064 | return -EINVAL; |
| 1068 | 1065 | if (!get_option(&str, &nr_prealloc_entries)) | |
| 1069 | res = get_option(&str, &req_entries); | 1066 | nr_prealloc_entries = PREALLOC_DMA_DEBUG_ENTRIES; |
| 1070 | |||
| 1071 | if (!res) | ||
| 1072 | req_entries = 0; | ||
| 1073 | |||
| 1074 | return 0; | 1067 | return 0; |
| 1075 | } | 1068 | } |
| 1076 | 1069 | ||
| @@ -1293,6 +1286,32 @@ out: | |||
| 1293 | put_hash_bucket(bucket, &flags); | 1286 | put_hash_bucket(bucket, &flags); |
| 1294 | } | 1287 | } |
| 1295 | 1288 | ||
| 1289 | static void check_sg_segment(struct device *dev, struct scatterlist *sg) | ||
| 1290 | { | ||
| 1291 | #ifdef CONFIG_DMA_API_DEBUG_SG | ||
| 1292 | unsigned int max_seg = dma_get_max_seg_size(dev); | ||
| 1293 | u64 start, end, boundary = dma_get_seg_boundary(dev); | ||
| 1294 | |||
| 1295 | /* | ||
| 1296 | * Either the driver forgot to set dma_parms appropriately, or | ||
| 1297 | * whoever generated the list forgot to check them. | ||
| 1298 | */ | ||
| 1299 | if (sg->length > max_seg) | ||
| 1300 | err_printk(dev, NULL, "DMA-API: mapping sg segment longer than device claims to support [len=%u] [max=%u]\n", | ||
| 1301 | sg->length, max_seg); | ||
| 1302 | /* | ||
| 1303 | * In some cases this could potentially be the DMA API | ||
| 1304 | * implementation's fault, but it would usually imply that | ||
| 1305 | * the scatterlist was built inappropriately to begin with. | ||
| 1306 | */ | ||
| 1307 | start = sg_dma_address(sg); | ||
| 1308 | end = start + sg_dma_len(sg) - 1; | ||
| 1309 | if ((start ^ end) & ~boundary) | ||
| 1310 | err_printk(dev, NULL, "DMA-API: mapping sg segment across boundary [start=0x%016llx] [end=0x%016llx] [boundary=0x%016llx]\n", | ||
| 1311 | start, end, boundary); | ||
| 1312 | #endif | ||
| 1313 | } | ||
| 1314 | |||
| 1296 | void debug_dma_map_page(struct device *dev, struct page *page, size_t offset, | 1315 | void debug_dma_map_page(struct device *dev, struct page *page, size_t offset, |
| 1297 | size_t size, int direction, dma_addr_t dma_addr, | 1316 | size_t size, int direction, dma_addr_t dma_addr, |
| 1298 | bool map_single) | 1317 | bool map_single) |
| @@ -1423,6 +1442,8 @@ void debug_dma_map_sg(struct device *dev, struct scatterlist *sg, | |||
| 1423 | check_for_illegal_area(dev, sg_virt(s), sg_dma_len(s)); | 1442 | check_for_illegal_area(dev, sg_virt(s), sg_dma_len(s)); |
| 1424 | } | 1443 | } |
| 1425 | 1444 | ||
| 1445 | check_sg_segment(dev, s); | ||
| 1446 | |||
| 1426 | add_dma_entry(entry); | 1447 | add_dma_entry(entry); |
| 1427 | } | 1448 | } |
| 1428 | } | 1449 | } |
diff --git a/lib/dma-direct.c b/lib/dma-direct.c index c0bba30fef0a..8be8106270c2 100644 --- a/lib/dma-direct.c +++ b/lib/dma-direct.c | |||
| @@ -34,6 +34,13 @@ check_addr(struct device *dev, dma_addr_t dma_addr, size_t size, | |||
| 34 | const char *caller) | 34 | const char *caller) |
| 35 | { | 35 | { |
| 36 | if (unlikely(dev && !dma_capable(dev, dma_addr, size))) { | 36 | if (unlikely(dev && !dma_capable(dev, dma_addr, size))) { |
| 37 | if (!dev->dma_mask) { | ||
| 38 | dev_err(dev, | ||
| 39 | "%s: call on device without dma_mask\n", | ||
| 40 | caller); | ||
| 41 | return false; | ||
| 42 | } | ||
| 43 | |||
| 37 | if (*dev->dma_mask >= DMA_BIT_MASK(32)) { | 44 | if (*dev->dma_mask >= DMA_BIT_MASK(32)) { |
| 38 | dev_err(dev, | 45 | dev_err(dev, |
| 39 | "%s: overflow %pad+%zu of device mask %llx\n", | 46 | "%s: overflow %pad+%zu of device mask %llx\n", |
| @@ -84,7 +91,15 @@ again: | |||
| 84 | __free_pages(page, page_order); | 91 | __free_pages(page, page_order); |
| 85 | page = NULL; | 92 | page = NULL; |
| 86 | 93 | ||
| 87 | if (dev->coherent_dma_mask < DMA_BIT_MASK(32) && | 94 | if (IS_ENABLED(CONFIG_ZONE_DMA32) && |
| 95 | dev->coherent_dma_mask < DMA_BIT_MASK(64) && | ||
| 96 | !(gfp & (GFP_DMA32 | GFP_DMA))) { | ||
| 97 | gfp |= GFP_DMA32; | ||
| 98 | goto again; | ||
| 99 | } | ||
| 100 | |||
| 101 | if (IS_ENABLED(CONFIG_ZONE_DMA) && | ||
| 102 | dev->coherent_dma_mask < DMA_BIT_MASK(32) && | ||
| 88 | !(gfp & GFP_DMA)) { | 103 | !(gfp & GFP_DMA)) { |
| 89 | gfp = (gfp & ~GFP_DMA32) | GFP_DMA; | 104 | gfp = (gfp & ~GFP_DMA32) | GFP_DMA; |
| 90 | goto again; | 105 | goto again; |
| @@ -120,7 +135,7 @@ void dma_direct_free(struct device *dev, size_t size, void *cpu_addr, | |||
| 120 | free_pages((unsigned long)cpu_addr, page_order); | 135 | free_pages((unsigned long)cpu_addr, page_order); |
| 121 | } | 136 | } |
| 122 | 137 | ||
| 123 | static dma_addr_t dma_direct_map_page(struct device *dev, struct page *page, | 138 | dma_addr_t dma_direct_map_page(struct device *dev, struct page *page, |
| 124 | unsigned long offset, size_t size, enum dma_data_direction dir, | 139 | unsigned long offset, size_t size, enum dma_data_direction dir, |
| 125 | unsigned long attrs) | 140 | unsigned long attrs) |
| 126 | { | 141 | { |
| @@ -131,8 +146,8 @@ static dma_addr_t dma_direct_map_page(struct device *dev, struct page *page, | |||
| 131 | return dma_addr; | 146 | return dma_addr; |
| 132 | } | 147 | } |
| 133 | 148 | ||
| 134 | static int dma_direct_map_sg(struct device *dev, struct scatterlist *sgl, | 149 | int dma_direct_map_sg(struct device *dev, struct scatterlist *sgl, int nents, |
| 135 | int nents, enum dma_data_direction dir, unsigned long attrs) | 150 | enum dma_data_direction dir, unsigned long attrs) |
| 136 | { | 151 | { |
| 137 | int i; | 152 | int i; |
| 138 | struct scatterlist *sg; | 153 | struct scatterlist *sg; |
| @@ -164,10 +179,16 @@ int dma_direct_supported(struct device *dev, u64 mask) | |||
| 164 | if (mask < DMA_BIT_MASK(32)) | 179 | if (mask < DMA_BIT_MASK(32)) |
| 165 | return 0; | 180 | return 0; |
| 166 | #endif | 181 | #endif |
| 182 | /* | ||
| 183 | * Various PCI/PCIe bridges have broken support for > 32bit DMA even | ||
| 184 | * if the device itself might support it. | ||
| 185 | */ | ||
| 186 | if (dev->dma_32bit_limit && mask > DMA_BIT_MASK(32)) | ||
| 187 | return 0; | ||
| 167 | return 1; | 188 | return 1; |
| 168 | } | 189 | } |
| 169 | 190 | ||
| 170 | static int dma_direct_mapping_error(struct device *dev, dma_addr_t dma_addr) | 191 | int dma_direct_mapping_error(struct device *dev, dma_addr_t dma_addr) |
| 171 | { | 192 | { |
| 172 | return dma_addr == DIRECT_MAPPING_ERROR; | 193 | return dma_addr == DIRECT_MAPPING_ERROR; |
| 173 | } | 194 | } |
| @@ -179,6 +200,5 @@ const struct dma_map_ops dma_direct_ops = { | |||
| 179 | .map_sg = dma_direct_map_sg, | 200 | .map_sg = dma_direct_map_sg, |
| 180 | .dma_supported = dma_direct_supported, | 201 | .dma_supported = dma_direct_supported, |
| 181 | .mapping_error = dma_direct_mapping_error, | 202 | .mapping_error = dma_direct_mapping_error, |
| 182 | .is_phys = 1, | ||
| 183 | }; | 203 | }; |
| 184 | EXPORT_SYMBOL(dma_direct_ops); | 204 | EXPORT_SYMBOL(dma_direct_ops); |
diff --git a/lib/dma-noncoherent.c b/lib/dma-noncoherent.c new file mode 100644 index 000000000000..79e9a757387f --- /dev/null +++ b/lib/dma-noncoherent.c | |||
| @@ -0,0 +1,102 @@ | |||
| 1 | // SPDX-License-Identifier: GPL-2.0 | ||
| 2 | /* | ||
| 3 | * Copyright (C) 2018 Christoph Hellwig. | ||
| 4 | * | ||
| 5 | * DMA operations that map physical memory directly without providing cache | ||
| 6 | * coherence. | ||
| 7 | */ | ||
| 8 | #include <linux/export.h> | ||
| 9 | #include <linux/mm.h> | ||
| 10 | #include <linux/dma-direct.h> | ||
| 11 | #include <linux/dma-noncoherent.h> | ||
| 12 | #include <linux/scatterlist.h> | ||
| 13 | |||
| 14 | static void dma_noncoherent_sync_single_for_device(struct device *dev, | ||
| 15 | dma_addr_t addr, size_t size, enum dma_data_direction dir) | ||
| 16 | { | ||
| 17 | arch_sync_dma_for_device(dev, dma_to_phys(dev, addr), size, dir); | ||
| 18 | } | ||
| 19 | |||
| 20 | static void dma_noncoherent_sync_sg_for_device(struct device *dev, | ||
| 21 | struct scatterlist *sgl, int nents, enum dma_data_direction dir) | ||
| 22 | { | ||
| 23 | struct scatterlist *sg; | ||
| 24 | int i; | ||
| 25 | |||
| 26 | for_each_sg(sgl, sg, nents, i) | ||
| 27 | arch_sync_dma_for_device(dev, sg_phys(sg), sg->length, dir); | ||
| 28 | } | ||
| 29 | |||
| 30 | static dma_addr_t dma_noncoherent_map_page(struct device *dev, struct page *page, | ||
| 31 | unsigned long offset, size_t size, enum dma_data_direction dir, | ||
| 32 | unsigned long attrs) | ||
| 33 | { | ||
| 34 | dma_addr_t addr; | ||
| 35 | |||
| 36 | addr = dma_direct_map_page(dev, page, offset, size, dir, attrs); | ||
| 37 | if (!dma_mapping_error(dev, addr) && !(attrs & DMA_ATTR_SKIP_CPU_SYNC)) | ||
| 38 | arch_sync_dma_for_device(dev, page_to_phys(page) + offset, | ||
| 39 | size, dir); | ||
| 40 | return addr; | ||
| 41 | } | ||
| 42 | |||
| 43 | static int dma_noncoherent_map_sg(struct device *dev, struct scatterlist *sgl, | ||
| 44 | int nents, enum dma_data_direction dir, unsigned long attrs) | ||
| 45 | { | ||
| 46 | nents = dma_direct_map_sg(dev, sgl, nents, dir, attrs); | ||
| 47 | if (nents > 0 && !(attrs & DMA_ATTR_SKIP_CPU_SYNC)) | ||
| 48 | dma_noncoherent_sync_sg_for_device(dev, sgl, nents, dir); | ||
| 49 | return nents; | ||
| 50 | } | ||
| 51 | |||
| 52 | #ifdef CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU | ||
| 53 | static void dma_noncoherent_sync_single_for_cpu(struct device *dev, | ||
| 54 | dma_addr_t addr, size_t size, enum dma_data_direction dir) | ||
| 55 | { | ||
| 56 | arch_sync_dma_for_cpu(dev, dma_to_phys(dev, addr), size, dir); | ||
| 57 | } | ||
| 58 | |||
| 59 | static void dma_noncoherent_sync_sg_for_cpu(struct device *dev, | ||
| 60 | struct scatterlist *sgl, int nents, enum dma_data_direction dir) | ||
| 61 | { | ||
| 62 | struct scatterlist *sg; | ||
| 63 | int i; | ||
| 64 | |||
| 65 | for_each_sg(sgl, sg, nents, i) | ||
| 66 | arch_sync_dma_for_cpu(dev, sg_phys(sg), sg->length, dir); | ||
| 67 | } | ||
| 68 | |||
| 69 | static void dma_noncoherent_unmap_page(struct device *dev, dma_addr_t addr, | ||
| 70 | size_t size, enum dma_data_direction dir, unsigned long attrs) | ||
| 71 | { | ||
| 72 | if (!(attrs & DMA_ATTR_SKIP_CPU_SYNC)) | ||
| 73 | dma_noncoherent_sync_single_for_cpu(dev, addr, size, dir); | ||
| 74 | } | ||
| 75 | |||
| 76 | static void dma_noncoherent_unmap_sg(struct device *dev, struct scatterlist *sgl, | ||
| 77 | int nents, enum dma_data_direction dir, unsigned long attrs) | ||
| 78 | { | ||
| 79 | if (!(attrs & DMA_ATTR_SKIP_CPU_SYNC)) | ||
| 80 | dma_noncoherent_sync_sg_for_cpu(dev, sgl, nents, dir); | ||
| 81 | } | ||
| 82 | #endif | ||
| 83 | |||
| 84 | const struct dma_map_ops dma_noncoherent_ops = { | ||
| 85 | .alloc = arch_dma_alloc, | ||
| 86 | .free = arch_dma_free, | ||
| 87 | .mmap = arch_dma_mmap, | ||
| 88 | .sync_single_for_device = dma_noncoherent_sync_single_for_device, | ||
| 89 | .sync_sg_for_device = dma_noncoherent_sync_sg_for_device, | ||
| 90 | .map_page = dma_noncoherent_map_page, | ||
| 91 | .map_sg = dma_noncoherent_map_sg, | ||
| 92 | #ifdef CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU | ||
| 93 | .sync_single_for_cpu = dma_noncoherent_sync_single_for_cpu, | ||
| 94 | .sync_sg_for_cpu = dma_noncoherent_sync_sg_for_cpu, | ||
| 95 | .unmap_page = dma_noncoherent_unmap_page, | ||
| 96 | .unmap_sg = dma_noncoherent_unmap_sg, | ||
| 97 | #endif | ||
| 98 | .dma_supported = dma_direct_supported, | ||
| 99 | .mapping_error = dma_direct_mapping_error, | ||
| 100 | .cache_sync = arch_dma_cache_sync, | ||
| 101 | }; | ||
| 102 | EXPORT_SYMBOL(dma_noncoherent_ops); | ||
diff --git a/lib/errseq.c b/lib/errseq.c index df782418b333..81f9e33aa7e7 100644 --- a/lib/errseq.c +++ b/lib/errseq.c | |||
| @@ -111,27 +111,22 @@ EXPORT_SYMBOL(errseq_set); | |||
| 111 | * errseq_sample() - Grab current errseq_t value. | 111 | * errseq_sample() - Grab current errseq_t value. |
| 112 | * @eseq: Pointer to errseq_t to be sampled. | 112 | * @eseq: Pointer to errseq_t to be sampled. |
| 113 | * | 113 | * |
| 114 | * This function allows callers to sample an errseq_t value, marking it as | 114 | * This function allows callers to initialise their errseq_t variable. |
| 115 | * "seen" if required. | 115 | * If the error has been "seen", new callers will not see an old error. |
| 116 | * If there is an unseen error in @eseq, the caller of this function will | ||
| 117 | * see it the next time it checks for an error. | ||
| 116 | * | 118 | * |
| 119 | * Context: Any context. | ||
| 117 | * Return: The current errseq value. | 120 | * Return: The current errseq value. |
| 118 | */ | 121 | */ |
| 119 | errseq_t errseq_sample(errseq_t *eseq) | 122 | errseq_t errseq_sample(errseq_t *eseq) |
| 120 | { | 123 | { |
| 121 | errseq_t old = READ_ONCE(*eseq); | 124 | errseq_t old = READ_ONCE(*eseq); |
| 122 | errseq_t new = old; | ||
| 123 | 125 | ||
| 124 | /* | 126 | /* If nobody has seen this error yet, then we can be the first. */ |
| 125 | * For the common case of no errors ever having been set, we can skip | 127 | if (!(old & ERRSEQ_SEEN)) |
| 126 | * marking the SEEN bit. Once an error has been set, the value will | 128 | old = 0; |
| 127 | * never go back to zero. | 129 | return old; |
| 128 | */ | ||
| 129 | if (old != 0) { | ||
| 130 | new |= ERRSEQ_SEEN; | ||
| 131 | if (old != new) | ||
| 132 | cmpxchg(eseq, old, new); | ||
| 133 | } | ||
| 134 | return new; | ||
| 135 | } | 130 | } |
| 136 | EXPORT_SYMBOL(errseq_sample); | 131 | EXPORT_SYMBOL(errseq_sample); |
| 137 | 132 | ||
diff --git a/lib/find_bit_benchmark.c b/lib/find_bit_benchmark.c index 5985a25e6cbc..5367ffa5c18f 100644 --- a/lib/find_bit_benchmark.c +++ b/lib/find_bit_benchmark.c | |||
| @@ -132,7 +132,12 @@ static int __init find_bit_test(void) | |||
| 132 | test_find_next_bit(bitmap, BITMAP_LEN); | 132 | test_find_next_bit(bitmap, BITMAP_LEN); |
| 133 | test_find_next_zero_bit(bitmap, BITMAP_LEN); | 133 | test_find_next_zero_bit(bitmap, BITMAP_LEN); |
| 134 | test_find_last_bit(bitmap, BITMAP_LEN); | 134 | test_find_last_bit(bitmap, BITMAP_LEN); |
| 135 | test_find_first_bit(bitmap, BITMAP_LEN); | 135 | |
| 136 | /* | ||
| 137 | * test_find_first_bit() may take some time, so | ||
| 138 | * traverse only part of bitmap to avoid soft lockup. | ||
| 139 | */ | ||
| 140 | test_find_first_bit(bitmap, BITMAP_LEN / 10); | ||
| 136 | test_find_next_and_bit(bitmap, bitmap2, BITMAP_LEN); | 141 | test_find_next_and_bit(bitmap, bitmap2, BITMAP_LEN); |
| 137 | 142 | ||
| 138 | pr_err("\nStart testing find_bit() with sparse bitmap\n"); | 143 | pr_err("\nStart testing find_bit() with sparse bitmap\n"); |
diff --git a/lib/iommu-common.c b/lib/iommu-common.c deleted file mode 100644 index 55b00de106b5..000000000000 --- a/lib/iommu-common.c +++ /dev/null | |||
| @@ -1,267 +0,0 @@ | |||
| 1 | // SPDX-License-Identifier: GPL-2.0 | ||
| 2 | /* | ||
| 3 | * IOMMU mmap management and range allocation functions. | ||
| 4 | * Based almost entirely upon the powerpc iommu allocator. | ||
| 5 | */ | ||
| 6 | |||
| 7 | #include <linux/export.h> | ||
| 8 | #include <linux/bitmap.h> | ||
| 9 | #include <linux/bug.h> | ||
| 10 | #include <linux/iommu-helper.h> | ||
| 11 | #include <linux/iommu-common.h> | ||
| 12 | #include <linux/dma-mapping.h> | ||
| 13 | #include <linux/hash.h> | ||
| 14 | |||
| 15 | static unsigned long iommu_large_alloc = 15; | ||
| 16 | |||
| 17 | static DEFINE_PER_CPU(unsigned int, iommu_hash_common); | ||
| 18 | |||
| 19 | static inline bool need_flush(struct iommu_map_table *iommu) | ||
| 20 | { | ||
| 21 | return ((iommu->flags & IOMMU_NEED_FLUSH) != 0); | ||
| 22 | } | ||
| 23 | |||
| 24 | static inline void set_flush(struct iommu_map_table *iommu) | ||
| 25 | { | ||
| 26 | iommu->flags |= IOMMU_NEED_FLUSH; | ||
| 27 | } | ||
| 28 | |||
| 29 | static inline void clear_flush(struct iommu_map_table *iommu) | ||
| 30 | { | ||
| 31 | iommu->flags &= ~IOMMU_NEED_FLUSH; | ||
| 32 | } | ||
| 33 | |||
| 34 | static void setup_iommu_pool_hash(void) | ||
| 35 | { | ||
| 36 | unsigned int i; | ||
| 37 | static bool do_once; | ||
| 38 | |||
| 39 | if (do_once) | ||
| 40 | return; | ||
| 41 | do_once = true; | ||
| 42 | for_each_possible_cpu(i) | ||
| 43 | per_cpu(iommu_hash_common, i) = hash_32(i, IOMMU_POOL_HASHBITS); | ||
| 44 | } | ||
| 45 | |||
| 46 | /* | ||
| 47 | * Initialize iommu_pool entries for the iommu_map_table. `num_entries' | ||
| 48 | * is the number of table entries. If `large_pool' is set to true, | ||
| 49 | * the top 1/4 of the table will be set aside for pool allocations | ||
| 50 | * of more than iommu_large_alloc pages. | ||
| 51 | */ | ||
| 52 | void iommu_tbl_pool_init(struct iommu_map_table *iommu, | ||
| 53 | unsigned long num_entries, | ||
| 54 | u32 table_shift, | ||
| 55 | void (*lazy_flush)(struct iommu_map_table *), | ||
| 56 | bool large_pool, u32 npools, | ||
| 57 | bool skip_span_boundary_check) | ||
| 58 | { | ||
| 59 | unsigned int start, i; | ||
| 60 | struct iommu_pool *p = &(iommu->large_pool); | ||
| 61 | |||
| 62 | setup_iommu_pool_hash(); | ||
| 63 | if (npools == 0) | ||
| 64 | iommu->nr_pools = IOMMU_NR_POOLS; | ||
| 65 | else | ||
| 66 | iommu->nr_pools = npools; | ||
| 67 | BUG_ON(npools > IOMMU_NR_POOLS); | ||
| 68 | |||
| 69 | iommu->table_shift = table_shift; | ||
| 70 | iommu->lazy_flush = lazy_flush; | ||
| 71 | start = 0; | ||
| 72 | if (skip_span_boundary_check) | ||
| 73 | iommu->flags |= IOMMU_NO_SPAN_BOUND; | ||
| 74 | if (large_pool) | ||
| 75 | iommu->flags |= IOMMU_HAS_LARGE_POOL; | ||
| 76 | |||
| 77 | if (!large_pool) | ||
| 78 | iommu->poolsize = num_entries/iommu->nr_pools; | ||
| 79 | else | ||
| 80 | iommu->poolsize = (num_entries * 3 / 4)/iommu->nr_pools; | ||
| 81 | for (i = 0; i < iommu->nr_pools; i++) { | ||
| 82 | spin_lock_init(&(iommu->pools[i].lock)); | ||
| 83 | iommu->pools[i].start = start; | ||
| 84 | iommu->pools[i].hint = start; | ||
| 85 | start += iommu->poolsize; /* start for next pool */ | ||
| 86 | iommu->pools[i].end = start - 1; | ||
| 87 | } | ||
| 88 | if (!large_pool) | ||
| 89 | return; | ||
| 90 | /* initialize large_pool */ | ||
| 91 | spin_lock_init(&(p->lock)); | ||
| 92 | p->start = start; | ||
| 93 | p->hint = p->start; | ||
| 94 | p->end = num_entries; | ||
| 95 | } | ||
| 96 | EXPORT_SYMBOL(iommu_tbl_pool_init); | ||
| 97 | |||
| 98 | unsigned long iommu_tbl_range_alloc(struct device *dev, | ||
| 99 | struct iommu_map_table *iommu, | ||
| 100 | unsigned long npages, | ||
| 101 | unsigned long *handle, | ||
| 102 | unsigned long mask, | ||
| 103 | unsigned int align_order) | ||
| 104 | { | ||
| 105 | unsigned int pool_hash = __this_cpu_read(iommu_hash_common); | ||
| 106 | unsigned long n, end, start, limit, boundary_size; | ||
| 107 | struct iommu_pool *pool; | ||
| 108 | int pass = 0; | ||
| 109 | unsigned int pool_nr; | ||
| 110 | unsigned int npools = iommu->nr_pools; | ||
| 111 | unsigned long flags; | ||
| 112 | bool large_pool = ((iommu->flags & IOMMU_HAS_LARGE_POOL) != 0); | ||
| 113 | bool largealloc = (large_pool && npages > iommu_large_alloc); | ||
| 114 | unsigned long shift; | ||
| 115 | unsigned long align_mask = 0; | ||
| 116 | |||
| 117 | if (align_order > 0) | ||
| 118 | align_mask = ~0ul >> (BITS_PER_LONG - align_order); | ||
| 119 | |||
| 120 | /* Sanity check */ | ||
| 121 | if (unlikely(npages == 0)) { | ||
| 122 | WARN_ON_ONCE(1); | ||
| 123 | return IOMMU_ERROR_CODE; | ||
| 124 | } | ||
| 125 | |||
| 126 | if (largealloc) { | ||
| 127 | pool = &(iommu->large_pool); | ||
| 128 | pool_nr = 0; /* to keep compiler happy */ | ||
| 129 | } else { | ||
| 130 | /* pick out pool_nr */ | ||
| 131 | pool_nr = pool_hash & (npools - 1); | ||
| 132 | pool = &(iommu->pools[pool_nr]); | ||
| 133 | } | ||
| 134 | spin_lock_irqsave(&pool->lock, flags); | ||
| 135 | |||
| 136 | again: | ||
| 137 | if (pass == 0 && handle && *handle && | ||
| 138 | (*handle >= pool->start) && (*handle < pool->end)) | ||
| 139 | start = *handle; | ||
| 140 | else | ||
| 141 | start = pool->hint; | ||
| 142 | |||
| 143 | limit = pool->end; | ||
| 144 | |||
| 145 | /* The case below can happen if we have a small segment appended | ||
| 146 | * to a large, or when the previous alloc was at the very end of | ||
| 147 | * the available space. If so, go back to the beginning. If a | ||
| 148 | * flush is needed, it will get done based on the return value | ||
| 149 | * from iommu_area_alloc() below. | ||
| 150 | */ | ||
| 151 | if (start >= limit) | ||
| 152 | start = pool->start; | ||
| 153 | shift = iommu->table_map_base >> iommu->table_shift; | ||
| 154 | if (limit + shift > mask) { | ||
| 155 | limit = mask - shift + 1; | ||
| 156 | /* If we're constrained on address range, first try | ||
| 157 | * at the masked hint to avoid O(n) search complexity, | ||
| 158 | * but on second pass, start at 0 in pool 0. | ||
| 159 | */ | ||
| 160 | if ((start & mask) >= limit || pass > 0) { | ||
| 161 | spin_unlock(&(pool->lock)); | ||
| 162 | pool = &(iommu->pools[0]); | ||
| 163 | spin_lock(&(pool->lock)); | ||
| 164 | start = pool->start; | ||
| 165 | } else { | ||
| 166 | start &= mask; | ||
| 167 | } | ||
| 168 | } | ||
| 169 | |||
| 170 | if (dev) | ||
| 171 | boundary_size = ALIGN(dma_get_seg_boundary(dev) + 1, | ||
| 172 | 1 << iommu->table_shift); | ||
| 173 | else | ||
| 174 | boundary_size = ALIGN(1ULL << 32, 1 << iommu->table_shift); | ||
| 175 | |||
| 176 | boundary_size = boundary_size >> iommu->table_shift; | ||
| 177 | /* | ||
| 178 | * if the skip_span_boundary_check had been set during init, we set | ||
| 179 | * things up so that iommu_is_span_boundary() merely checks if the | ||
| 180 | * (index + npages) < num_tsb_entries | ||
| 181 | */ | ||
| 182 | if ((iommu->flags & IOMMU_NO_SPAN_BOUND) != 0) { | ||
| 183 | shift = 0; | ||
| 184 | boundary_size = iommu->poolsize * iommu->nr_pools; | ||
| 185 | } | ||
| 186 | n = iommu_area_alloc(iommu->map, limit, start, npages, shift, | ||
| 187 | boundary_size, align_mask); | ||
| 188 | if (n == -1) { | ||
| 189 | if (likely(pass == 0)) { | ||
| 190 | /* First failure, rescan from the beginning. */ | ||
| 191 | pool->hint = pool->start; | ||
| 192 | set_flush(iommu); | ||
| 193 | pass++; | ||
| 194 | goto again; | ||
| 195 | } else if (!largealloc && pass <= iommu->nr_pools) { | ||
| 196 | spin_unlock(&(pool->lock)); | ||
| 197 | pool_nr = (pool_nr + 1) & (iommu->nr_pools - 1); | ||
| 198 | pool = &(iommu->pools[pool_nr]); | ||
| 199 | spin_lock(&(pool->lock)); | ||
| 200 | pool->hint = pool->start; | ||
| 201 | set_flush(iommu); | ||
| 202 | pass++; | ||
| 203 | goto again; | ||
| 204 | } else { | ||
| 205 | /* give up */ | ||
| 206 | n = IOMMU_ERROR_CODE; | ||
| 207 | goto bail; | ||
| 208 | } | ||
| 209 | } | ||
| 210 | if (iommu->lazy_flush && | ||
| 211 | (n < pool->hint || need_flush(iommu))) { | ||
| 212 | clear_flush(iommu); | ||
| 213 | iommu->lazy_flush(iommu); | ||
| 214 | } | ||
| 215 | |||
| 216 | end = n + npages; | ||
| 217 | pool->hint = end; | ||
| 218 | |||
| 219 | /* Update handle for SG allocations */ | ||
| 220 | if (handle) | ||
| 221 | *handle = end; | ||
| 222 | bail: | ||
| 223 | spin_unlock_irqrestore(&(pool->lock), flags); | ||
| 224 | |||
| 225 | return n; | ||
| 226 | } | ||
| 227 | EXPORT_SYMBOL(iommu_tbl_range_alloc); | ||
| 228 | |||
| 229 | static struct iommu_pool *get_pool(struct iommu_map_table *tbl, | ||
| 230 | unsigned long entry) | ||
| 231 | { | ||
| 232 | struct iommu_pool *p; | ||
| 233 | unsigned long largepool_start = tbl->large_pool.start; | ||
| 234 | bool large_pool = ((tbl->flags & IOMMU_HAS_LARGE_POOL) != 0); | ||
| 235 | |||
| 236 | /* The large pool is the last pool at the top of the table */ | ||
| 237 | if (large_pool && entry >= largepool_start) { | ||
| 238 | p = &tbl->large_pool; | ||
| 239 | } else { | ||
| 240 | unsigned int pool_nr = entry / tbl->poolsize; | ||
| 241 | |||
| 242 | BUG_ON(pool_nr >= tbl->nr_pools); | ||
| 243 | p = &tbl->pools[pool_nr]; | ||
| 244 | } | ||
| 245 | return p; | ||
| 246 | } | ||
| 247 | |||
| 248 | /* Caller supplies the index of the entry into the iommu map table | ||
| 249 | * itself when the mapping from dma_addr to the entry is not the | ||
| 250 | * default addr->entry mapping below. | ||
| 251 | */ | ||
| 252 | void iommu_tbl_range_free(struct iommu_map_table *iommu, u64 dma_addr, | ||
| 253 | unsigned long npages, unsigned long entry) | ||
| 254 | { | ||
| 255 | struct iommu_pool *pool; | ||
| 256 | unsigned long flags; | ||
| 257 | unsigned long shift = iommu->table_shift; | ||
| 258 | |||
| 259 | if (entry == IOMMU_ERROR_CODE) /* use default addr->entry mapping */ | ||
| 260 | entry = (dma_addr - iommu->table_map_base) >> shift; | ||
| 261 | pool = get_pool(iommu, entry); | ||
| 262 | |||
| 263 | spin_lock_irqsave(&(pool->lock), flags); | ||
| 264 | bitmap_clear(iommu->map, entry, npages); | ||
| 265 | spin_unlock_irqrestore(&(pool->lock), flags); | ||
| 266 | } | ||
| 267 | EXPORT_SYMBOL(iommu_tbl_range_free); | ||
diff --git a/lib/iommu-helper.c b/lib/iommu-helper.c index 23633c0fda4a..92a9f243c0e2 100644 --- a/lib/iommu-helper.c +++ b/lib/iommu-helper.c | |||
| @@ -3,19 +3,8 @@ | |||
| 3 | * IOMMU helper functions for the free area management | 3 | * IOMMU helper functions for the free area management |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | #include <linux/export.h> | ||
| 7 | #include <linux/bitmap.h> | 6 | #include <linux/bitmap.h> |
| 8 | #include <linux/bug.h> | 7 | #include <linux/iommu-helper.h> |
| 9 | |||
| 10 | int iommu_is_span_boundary(unsigned int index, unsigned int nr, | ||
| 11 | unsigned long shift, | ||
| 12 | unsigned long boundary_size) | ||
| 13 | { | ||
| 14 | BUG_ON(!is_power_of_2(boundary_size)); | ||
| 15 | |||
| 16 | shift = (shift + index) & (boundary_size - 1); | ||
| 17 | return shift + nr > boundary_size; | ||
| 18 | } | ||
| 19 | 8 | ||
| 20 | unsigned long iommu_area_alloc(unsigned long *map, unsigned long size, | 9 | unsigned long iommu_area_alloc(unsigned long *map, unsigned long size, |
| 21 | unsigned long start, unsigned int nr, | 10 | unsigned long start, unsigned int nr, |
| @@ -38,4 +27,3 @@ again: | |||
| 38 | } | 27 | } |
| 39 | return -1; | 28 | return -1; |
| 40 | } | 29 | } |
| 41 | EXPORT_SYMBOL(iommu_area_alloc); | ||
diff --git a/lib/iov_iter.c b/lib/iov_iter.c index 970212670b6a..7e43cd54c84c 100644 --- a/lib/iov_iter.c +++ b/lib/iov_iter.c | |||
| @@ -573,6 +573,67 @@ size_t _copy_to_iter(const void *addr, size_t bytes, struct iov_iter *i) | |||
| 573 | } | 573 | } |
| 574 | EXPORT_SYMBOL(_copy_to_iter); | 574 | EXPORT_SYMBOL(_copy_to_iter); |
| 575 | 575 | ||
| 576 | #ifdef CONFIG_ARCH_HAS_UACCESS_MCSAFE | ||
| 577 | static int copyout_mcsafe(void __user *to, const void *from, size_t n) | ||
| 578 | { | ||
| 579 | if (access_ok(VERIFY_WRITE, to, n)) { | ||
| 580 | kasan_check_read(from, n); | ||
| 581 | n = copy_to_user_mcsafe((__force void *) to, from, n); | ||
| 582 | } | ||
| 583 | return n; | ||
| 584 | } | ||
| 585 | |||
| 586 | static unsigned long memcpy_mcsafe_to_page(struct page *page, size_t offset, | ||
| 587 | const char *from, size_t len) | ||
| 588 | { | ||
| 589 | unsigned long ret; | ||
| 590 | char *to; | ||
| 591 | |||
| 592 | to = kmap_atomic(page); | ||
| 593 | ret = memcpy_mcsafe(to + offset, from, len); | ||
| 594 | kunmap_atomic(to); | ||
| 595 | |||
| 596 | return ret; | ||
| 597 | } | ||
| 598 | |||
| 599 | size_t _copy_to_iter_mcsafe(const void *addr, size_t bytes, struct iov_iter *i) | ||
| 600 | { | ||
| 601 | const char *from = addr; | ||
| 602 | unsigned long rem, curr_addr, s_addr = (unsigned long) addr; | ||
| 603 | |||
| 604 | if (unlikely(i->type & ITER_PIPE)) { | ||
| 605 | WARN_ON(1); | ||
| 606 | return 0; | ||
| 607 | } | ||
| 608 | if (iter_is_iovec(i)) | ||
| 609 | might_fault(); | ||
| 610 | iterate_and_advance(i, bytes, v, | ||
| 611 | copyout_mcsafe(v.iov_base, (from += v.iov_len) - v.iov_len, v.iov_len), | ||
| 612 | ({ | ||
| 613 | rem = memcpy_mcsafe_to_page(v.bv_page, v.bv_offset, | ||
| 614 | (from += v.bv_len) - v.bv_len, v.bv_len); | ||
| 615 | if (rem) { | ||
| 616 | curr_addr = (unsigned long) from; | ||
| 617 | bytes = curr_addr - s_addr - rem; | ||
| 618 | return bytes; | ||
| 619 | } | ||
| 620 | }), | ||
| 621 | ({ | ||
| 622 | rem = memcpy_mcsafe(v.iov_base, (from += v.iov_len) - v.iov_len, | ||
| 623 | v.iov_len); | ||
| 624 | if (rem) { | ||
| 625 | curr_addr = (unsigned long) from; | ||
| 626 | bytes = curr_addr - s_addr - rem; | ||
| 627 | return bytes; | ||
| 628 | } | ||
| 629 | }) | ||
| 630 | ) | ||
| 631 | |||
| 632 | return bytes; | ||
| 633 | } | ||
| 634 | EXPORT_SYMBOL_GPL(_copy_to_iter_mcsafe); | ||
| 635 | #endif /* CONFIG_ARCH_HAS_UACCESS_MCSAFE */ | ||
| 636 | |||
| 576 | size_t _copy_from_iter(void *addr, size_t bytes, struct iov_iter *i) | 637 | size_t _copy_from_iter(void *addr, size_t bytes, struct iov_iter *i) |
| 577 | { | 638 | { |
| 578 | char *to = addr; | 639 | char *to = addr; |
| @@ -1012,7 +1073,7 @@ unsigned long iov_iter_gap_alignment(const struct iov_iter *i) | |||
| 1012 | } | 1073 | } |
| 1013 | EXPORT_SYMBOL(iov_iter_gap_alignment); | 1074 | EXPORT_SYMBOL(iov_iter_gap_alignment); |
| 1014 | 1075 | ||
| 1015 | static inline size_t __pipe_get_pages(struct iov_iter *i, | 1076 | static inline ssize_t __pipe_get_pages(struct iov_iter *i, |
| 1016 | size_t maxsize, | 1077 | size_t maxsize, |
| 1017 | struct page **pages, | 1078 | struct page **pages, |
| 1018 | int idx, | 1079 | int idx, |
| @@ -1102,7 +1163,7 @@ static ssize_t pipe_get_pages_alloc(struct iov_iter *i, | |||
| 1102 | size_t *start) | 1163 | size_t *start) |
| 1103 | { | 1164 | { |
| 1104 | struct page **p; | 1165 | struct page **p; |
| 1105 | size_t n; | 1166 | ssize_t n; |
| 1106 | int idx; | 1167 | int idx; |
| 1107 | int npages; | 1168 | int npages; |
| 1108 | 1169 | ||
diff --git a/lib/kobject.c b/lib/kobject.c index e1d1f290bf35..18989b5b3b56 100644 --- a/lib/kobject.c +++ b/lib/kobject.c | |||
| @@ -233,13 +233,12 @@ static int kobject_add_internal(struct kobject *kobj) | |||
| 233 | 233 | ||
| 234 | /* be noisy on error issues */ | 234 | /* be noisy on error issues */ |
| 235 | if (error == -EEXIST) | 235 | if (error == -EEXIST) |
| 236 | WARN(1, | 236 | pr_err("%s failed for %s with -EEXIST, don't try to register things with the same name in the same directory.\n", |
| 237 | "%s failed for %s with -EEXIST, don't try to register things with the same name in the same directory.\n", | 237 | __func__, kobject_name(kobj)); |
| 238 | __func__, kobject_name(kobj)); | ||
| 239 | else | 238 | else |
| 240 | WARN(1, "%s failed for %s (error: %d parent: %s)\n", | 239 | pr_err("%s failed for %s (error: %d parent: %s)\n", |
| 241 | __func__, kobject_name(kobj), error, | 240 | __func__, kobject_name(kobj), error, |
| 242 | parent ? kobject_name(parent) : "'none'"); | 241 | parent ? kobject_name(parent) : "'none'"); |
| 243 | } else | 242 | } else |
| 244 | kobj->state_in_sysfs = 1; | 243 | kobj->state_in_sysfs = 1; |
| 245 | 244 | ||
diff --git a/lib/radix-tree.c b/lib/radix-tree.c index da9e10c827df..a9e41aed6de4 100644 --- a/lib/radix-tree.c +++ b/lib/radix-tree.c | |||
| @@ -1612,11 +1612,9 @@ static void set_iter_tags(struct radix_tree_iter *iter, | |||
| 1612 | static void __rcu **skip_siblings(struct radix_tree_node **nodep, | 1612 | static void __rcu **skip_siblings(struct radix_tree_node **nodep, |
| 1613 | void __rcu **slot, struct radix_tree_iter *iter) | 1613 | void __rcu **slot, struct radix_tree_iter *iter) |
| 1614 | { | 1614 | { |
| 1615 | void *sib = node_to_entry(slot - 1); | ||
| 1616 | |||
| 1617 | while (iter->index < iter->next_index) { | 1615 | while (iter->index < iter->next_index) { |
| 1618 | *nodep = rcu_dereference_raw(*slot); | 1616 | *nodep = rcu_dereference_raw(*slot); |
| 1619 | if (*nodep && *nodep != sib) | 1617 | if (*nodep && !is_sibling_entry(iter->node, *nodep)) |
| 1620 | return slot; | 1618 | return slot; |
| 1621 | slot++; | 1619 | slot++; |
| 1622 | iter->index = __radix_tree_iter_add(iter, 1); | 1620 | iter->index = __radix_tree_iter_add(iter, 1); |
| @@ -1631,7 +1629,7 @@ void __rcu **__radix_tree_next_slot(void __rcu **slot, | |||
| 1631 | struct radix_tree_iter *iter, unsigned flags) | 1629 | struct radix_tree_iter *iter, unsigned flags) |
| 1632 | { | 1630 | { |
| 1633 | unsigned tag = flags & RADIX_TREE_ITER_TAG_MASK; | 1631 | unsigned tag = flags & RADIX_TREE_ITER_TAG_MASK; |
| 1634 | struct radix_tree_node *node = rcu_dereference_raw(*slot); | 1632 | struct radix_tree_node *node; |
| 1635 | 1633 | ||
| 1636 | slot = skip_siblings(&node, slot, iter); | 1634 | slot = skip_siblings(&node, slot, iter); |
| 1637 | 1635 | ||
| @@ -2036,10 +2034,12 @@ void *radix_tree_delete_item(struct radix_tree_root *root, | |||
| 2036 | unsigned long index, void *item) | 2034 | unsigned long index, void *item) |
| 2037 | { | 2035 | { |
| 2038 | struct radix_tree_node *node = NULL; | 2036 | struct radix_tree_node *node = NULL; |
| 2039 | void __rcu **slot; | 2037 | void __rcu **slot = NULL; |
| 2040 | void *entry; | 2038 | void *entry; |
| 2041 | 2039 | ||
| 2042 | entry = __radix_tree_lookup(root, index, &node, &slot); | 2040 | entry = __radix_tree_lookup(root, index, &node, &slot); |
| 2041 | if (!slot) | ||
| 2042 | return NULL; | ||
| 2043 | if (!entry && (!is_idr(root) || node_tag_get(root, node, IDR_FREE, | 2043 | if (!entry && (!is_idr(root) || node_tag_get(root, node, IDR_FREE, |
| 2044 | get_slot_offset(node, slot)))) | 2044 | get_slot_offset(node, slot)))) |
| 2045 | return NULL; | 2045 | return NULL; |
diff --git a/lib/reed_solomon/decode_rs.c b/lib/reed_solomon/decode_rs.c index 0ec3f257ffdf..1db74eb098d0 100644 --- a/lib/reed_solomon/decode_rs.c +++ b/lib/reed_solomon/decode_rs.c | |||
| @@ -1,22 +1,16 @@ | |||
| 1 | // SPDX-License-Identifier: GPL-2.0 | ||
| 1 | /* | 2 | /* |
| 2 | * lib/reed_solomon/decode_rs.c | 3 | * Generic Reed Solomon encoder / decoder library |
| 3 | * | ||
| 4 | * Overview: | ||
| 5 | * Generic Reed Solomon encoder / decoder library | ||
| 6 | * | 4 | * |
| 7 | * Copyright 2002, Phil Karn, KA9Q | 5 | * Copyright 2002, Phil Karn, KA9Q |
| 8 | * May be used under the terms of the GNU General Public License (GPL) | 6 | * May be used under the terms of the GNU General Public License (GPL) |
| 9 | * | 7 | * |
| 10 | * Adaption to the kernel by Thomas Gleixner (tglx@linutronix.de) | 8 | * Adaption to the kernel by Thomas Gleixner (tglx@linutronix.de) |
| 11 | * | 9 | * |
| 12 | * $Id: decode_rs.c,v 1.7 2005/11/07 11:14:59 gleixner Exp $ | 10 | * Generic data width independent code which is included by the wrappers. |
| 13 | * | ||
| 14 | */ | ||
| 15 | |||
| 16 | /* Generic data width independent code which is included by the | ||
| 17 | * wrappers. | ||
| 18 | */ | 11 | */ |
| 19 | { | 12 | { |
| 13 | struct rs_codec *rs = rsc->codec; | ||
| 20 | int deg_lambda, el, deg_omega; | 14 | int deg_lambda, el, deg_omega; |
| 21 | int i, j, r, k, pad; | 15 | int i, j, r, k, pad; |
| 22 | int nn = rs->nn; | 16 | int nn = rs->nn; |
| @@ -27,16 +21,22 @@ | |||
| 27 | uint16_t *alpha_to = rs->alpha_to; | 21 | uint16_t *alpha_to = rs->alpha_to; |
| 28 | uint16_t *index_of = rs->index_of; | 22 | uint16_t *index_of = rs->index_of; |
| 29 | uint16_t u, q, tmp, num1, num2, den, discr_r, syn_error; | 23 | uint16_t u, q, tmp, num1, num2, den, discr_r, syn_error; |
| 30 | /* Err+Eras Locator poly and syndrome poly The maximum value | ||
| 31 | * of nroots is 8. So the necessary stack size will be about | ||
| 32 | * 220 bytes max. | ||
| 33 | */ | ||
| 34 | uint16_t lambda[nroots + 1], syn[nroots]; | ||
| 35 | uint16_t b[nroots + 1], t[nroots + 1], omega[nroots + 1]; | ||
| 36 | uint16_t root[nroots], reg[nroots + 1], loc[nroots]; | ||
| 37 | int count = 0; | 24 | int count = 0; |
| 38 | uint16_t msk = (uint16_t) rs->nn; | 25 | uint16_t msk = (uint16_t) rs->nn; |
| 39 | 26 | ||
| 27 | /* | ||
| 28 | * The decoder buffers are in the rs control struct. They are | ||
| 29 | * arrays sized [nroots + 1] | ||
| 30 | */ | ||
| 31 | uint16_t *lambda = rsc->buffers + RS_DECODE_LAMBDA * (nroots + 1); | ||
| 32 | uint16_t *syn = rsc->buffers + RS_DECODE_SYN * (nroots + 1); | ||
| 33 | uint16_t *b = rsc->buffers + RS_DECODE_B * (nroots + 1); | ||
| 34 | uint16_t *t = rsc->buffers + RS_DECODE_T * (nroots + 1); | ||
| 35 | uint16_t *omega = rsc->buffers + RS_DECODE_OMEGA * (nroots + 1); | ||
| 36 | uint16_t *root = rsc->buffers + RS_DECODE_ROOT * (nroots + 1); | ||
| 37 | uint16_t *reg = rsc->buffers + RS_DECODE_REG * (nroots + 1); | ||
| 38 | uint16_t *loc = rsc->buffers + RS_DECODE_LOC * (nroots + 1); | ||
| 39 | |||
| 40 | /* Check length parameter for validity */ | 40 | /* Check length parameter for validity */ |
| 41 | pad = nn - nroots - len; | 41 | pad = nn - nroots - len; |
| 42 | BUG_ON(pad < 0 || pad >= nn); | 42 | BUG_ON(pad < 0 || pad >= nn); |
diff --git a/lib/reed_solomon/encode_rs.c b/lib/reed_solomon/encode_rs.c index 0b5b1a6728ec..9112d46e869e 100644 --- a/lib/reed_solomon/encode_rs.c +++ b/lib/reed_solomon/encode_rs.c | |||
| @@ -1,23 +1,16 @@ | |||
| 1 | // SPDX-License-Identifier: GPL-2.0 | ||
| 1 | /* | 2 | /* |
| 2 | * lib/reed_solomon/encode_rs.c | 3 | * Generic Reed Solomon encoder / decoder library |
| 3 | * | ||
| 4 | * Overview: | ||
| 5 | * Generic Reed Solomon encoder / decoder library | ||
| 6 | * | 4 | * |
| 7 | * Copyright 2002, Phil Karn, KA9Q | 5 | * Copyright 2002, Phil Karn, KA9Q |
| 8 | * May be used under the terms of the GNU General Public License (GPL) | 6 | * May be used under the terms of the GNU General Public License (GPL) |
| 9 | * | 7 | * |
| 10 | * Adaption to the kernel by Thomas Gleixner (tglx@linutronix.de) | 8 | * Adaption to the kernel by Thomas Gleixner (tglx@linutronix.de) |
| 11 | * | 9 | * |
| 12 | * $Id: encode_rs.c,v 1.5 2005/11/07 11:14:59 gleixner Exp $ | 10 | * Generic data width independent code which is included by the wrappers. |
| 13 | * | ||
| 14 | */ | ||
| 15 | |||
| 16 | /* Generic data width independent code which is included by the | ||
| 17 | * wrappers. | ||
| 18 | * int encode_rsX (struct rs_control *rs, uintX_t *data, int len, uintY_t *par) | ||
| 19 | */ | 11 | */ |
| 20 | { | 12 | { |
| 13 | struct rs_codec *rs = rsc->codec; | ||
| 21 | int i, j, pad; | 14 | int i, j, pad; |
| 22 | int nn = rs->nn; | 15 | int nn = rs->nn; |
| 23 | int nroots = rs->nroots; | 16 | int nroots = rs->nroots; |
diff --git a/lib/reed_solomon/reed_solomon.c b/lib/reed_solomon/reed_solomon.c index 06d04cfa9339..dfcf54242fb9 100644 --- a/lib/reed_solomon/reed_solomon.c +++ b/lib/reed_solomon/reed_solomon.c | |||
| @@ -1,43 +1,34 @@ | |||
| 1 | // SPDX-License-Identifier: GPL-2.0 | ||
| 1 | /* | 2 | /* |
| 2 | * lib/reed_solomon/reed_solomon.c | 3 | * Generic Reed Solomon encoder / decoder library |
| 3 | * | ||
| 4 | * Overview: | ||
| 5 | * Generic Reed Solomon encoder / decoder library | ||
| 6 | * | 4 | * |
| 7 | * Copyright (C) 2004 Thomas Gleixner (tglx@linutronix.de) | 5 | * Copyright (C) 2004 Thomas Gleixner (tglx@linutronix.de) |
| 8 | * | 6 | * |
| 9 | * Reed Solomon code lifted from reed solomon library written by Phil Karn | 7 | * Reed Solomon code lifted from reed solomon library written by Phil Karn |
| 10 | * Copyright 2002 Phil Karn, KA9Q | 8 | * Copyright 2002 Phil Karn, KA9Q |
| 11 | * | 9 | * |
| 12 | * $Id: rslib.c,v 1.7 2005/11/07 11:14:59 gleixner Exp $ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License version 2 as | ||
| 16 | * published by the Free Software Foundation. | ||
| 17 | * | ||
| 18 | * Description: | 10 | * Description: |
| 19 | * | 11 | * |
| 20 | * The generic Reed Solomon library provides runtime configurable | 12 | * The generic Reed Solomon library provides runtime configurable |
| 21 | * encoding / decoding of RS codes. | 13 | * encoding / decoding of RS codes. |
| 22 | * Each user must call init_rs to get a pointer to a rs_control | ||
| 23 | * structure for the given rs parameters. This structure is either | ||
| 24 | * generated or a already available matching control structure is used. | ||
| 25 | * If a structure is generated then the polynomial arrays for | ||
| 26 | * fast encoding / decoding are built. This can take some time so | ||
| 27 | * make sure not to call this function from a time critical path. | ||
| 28 | * Usually a module / driver should initialize the necessary | ||
| 29 | * rs_control structure on module / driver init and release it | ||
| 30 | * on exit. | ||
| 31 | * The encoding puts the calculated syndrome into a given syndrome | ||
| 32 | * buffer. | ||
| 33 | * The decoding is a two step process. The first step calculates | ||
| 34 | * the syndrome over the received (data + syndrome) and calls the | ||
| 35 | * second stage, which does the decoding / error correction itself. | ||
| 36 | * Many hw encoders provide a syndrome calculation over the received | ||
| 37 | * data + syndrome and can call the second stage directly. | ||
| 38 | * | 14 | * |
| 15 | * Each user must call init_rs to get a pointer to a rs_control structure | ||
| 16 | * for the given rs parameters. The control struct is unique per instance. | ||
| 17 | * It points to a codec which can be shared by multiple control structures. | ||
| 18 | * If a codec is newly allocated then the polynomial arrays for fast | ||
| 19 | * encoding / decoding are built. This can take some time so make sure not | ||
| 20 | * to call this function from a time critical path. Usually a module / | ||
| 21 | * driver should initialize the necessary rs_control structure on module / | ||
| 22 | * driver init and release it on exit. | ||
| 23 | * | ||
| 24 | * The encoding puts the calculated syndrome into a given syndrome buffer. | ||
| 25 | * | ||
| 26 | * The decoding is a two step process. The first step calculates the | ||
| 27 | * syndrome over the received (data + syndrome) and calls the second stage, | ||
| 28 | * which does the decoding / error correction itself. Many hw encoders | ||
| 29 | * provide a syndrome calculation over the received data + syndrome and can | ||
| 30 | * call the second stage directly. | ||
| 39 | */ | 31 | */ |
| 40 | |||
| 41 | #include <linux/errno.h> | 32 | #include <linux/errno.h> |
| 42 | #include <linux/kernel.h> | 33 | #include <linux/kernel.h> |
| 43 | #include <linux/init.h> | 34 | #include <linux/init.h> |
| @@ -46,32 +37,44 @@ | |||
| 46 | #include <linux/slab.h> | 37 | #include <linux/slab.h> |
| 47 | #include <linux/mutex.h> | 38 | #include <linux/mutex.h> |
| 48 | 39 | ||
| 49 | /* This list holds all currently allocated rs control structures */ | 40 | enum { |
| 50 | static LIST_HEAD (rslist); | 41 | RS_DECODE_LAMBDA, |
| 42 | RS_DECODE_SYN, | ||
| 43 | RS_DECODE_B, | ||
| 44 | RS_DECODE_T, | ||
| 45 | RS_DECODE_OMEGA, | ||
| 46 | RS_DECODE_ROOT, | ||
| 47 | RS_DECODE_REG, | ||
| 48 | RS_DECODE_LOC, | ||
| 49 | RS_DECODE_NUM_BUFFERS | ||
| 50 | }; | ||
| 51 | |||
| 52 | /* This list holds all currently allocated rs codec structures */ | ||
| 53 | static LIST_HEAD(codec_list); | ||
| 51 | /* Protection for the list */ | 54 | /* Protection for the list */ |
| 52 | static DEFINE_MUTEX(rslistlock); | 55 | static DEFINE_MUTEX(rslistlock); |
| 53 | 56 | ||
| 54 | /** | 57 | /** |
| 55 | * rs_init - Initialize a Reed-Solomon codec | 58 | * codec_init - Initialize a Reed-Solomon codec |
| 56 | * @symsize: symbol size, bits (1-8) | 59 | * @symsize: symbol size, bits (1-8) |
| 57 | * @gfpoly: Field generator polynomial coefficients | 60 | * @gfpoly: Field generator polynomial coefficients |
| 58 | * @gffunc: Field generator function | 61 | * @gffunc: Field generator function |
| 59 | * @fcr: first root of RS code generator polynomial, index form | 62 | * @fcr: first root of RS code generator polynomial, index form |
| 60 | * @prim: primitive element to generate polynomial roots | 63 | * @prim: primitive element to generate polynomial roots |
| 61 | * @nroots: RS code generator polynomial degree (number of roots) | 64 | * @nroots: RS code generator polynomial degree (number of roots) |
| 65 | * @gfp: GFP_ flags for allocations | ||
| 62 | * | 66 | * |
| 63 | * Allocate a control structure and the polynom arrays for faster | 67 | * Allocate a codec structure and the polynom arrays for faster |
| 64 | * en/decoding. Fill the arrays according to the given parameters. | 68 | * en/decoding. Fill the arrays according to the given parameters. |
| 65 | */ | 69 | */ |
| 66 | static struct rs_control *rs_init(int symsize, int gfpoly, int (*gffunc)(int), | 70 | static struct rs_codec *codec_init(int symsize, int gfpoly, int (*gffunc)(int), |
| 67 | int fcr, int prim, int nroots) | 71 | int fcr, int prim, int nroots, gfp_t gfp) |
| 68 | { | 72 | { |
| 69 | struct rs_control *rs; | ||
| 70 | int i, j, sr, root, iprim; | 73 | int i, j, sr, root, iprim; |
| 74 | struct rs_codec *rs; | ||
| 71 | 75 | ||
| 72 | /* Allocate the control structure */ | 76 | rs = kzalloc(sizeof(*rs), gfp); |
| 73 | rs = kmalloc(sizeof (struct rs_control), GFP_KERNEL); | 77 | if (!rs) |
| 74 | if (rs == NULL) | ||
| 75 | return NULL; | 78 | return NULL; |
| 76 | 79 | ||
| 77 | INIT_LIST_HEAD(&rs->list); | 80 | INIT_LIST_HEAD(&rs->list); |
| @@ -85,17 +88,17 @@ static struct rs_control *rs_init(int symsize, int gfpoly, int (*gffunc)(int), | |||
| 85 | rs->gffunc = gffunc; | 88 | rs->gffunc = gffunc; |
| 86 | 89 | ||
| 87 | /* Allocate the arrays */ | 90 | /* Allocate the arrays */ |
| 88 | rs->alpha_to = kmalloc(sizeof(uint16_t) * (rs->nn + 1), GFP_KERNEL); | 91 | rs->alpha_to = kmalloc(sizeof(uint16_t) * (rs->nn + 1), gfp); |
| 89 | if (rs->alpha_to == NULL) | 92 | if (rs->alpha_to == NULL) |
| 90 | goto errrs; | 93 | goto err; |
| 91 | 94 | ||
| 92 | rs->index_of = kmalloc(sizeof(uint16_t) * (rs->nn + 1), GFP_KERNEL); | 95 | rs->index_of = kmalloc(sizeof(uint16_t) * (rs->nn + 1), gfp); |
| 93 | if (rs->index_of == NULL) | 96 | if (rs->index_of == NULL) |
| 94 | goto erralp; | 97 | goto err; |
| 95 | 98 | ||
| 96 | rs->genpoly = kmalloc(sizeof(uint16_t) * (rs->nroots + 1), GFP_KERNEL); | 99 | rs->genpoly = kmalloc(sizeof(uint16_t) * (rs->nroots + 1), gfp); |
| 97 | if(rs->genpoly == NULL) | 100 | if(rs->genpoly == NULL) |
| 98 | goto erridx; | 101 | goto err; |
| 99 | 102 | ||
| 100 | /* Generate Galois field lookup tables */ | 103 | /* Generate Galois field lookup tables */ |
| 101 | rs->index_of[0] = rs->nn; /* log(zero) = -inf */ | 104 | rs->index_of[0] = rs->nn; /* log(zero) = -inf */ |
| @@ -120,7 +123,7 @@ static struct rs_control *rs_init(int symsize, int gfpoly, int (*gffunc)(int), | |||
| 120 | } | 123 | } |
| 121 | /* If it's not primitive, exit */ | 124 | /* If it's not primitive, exit */ |
| 122 | if(sr != rs->alpha_to[0]) | 125 | if(sr != rs->alpha_to[0]) |
| 123 | goto errpol; | 126 | goto err; |
| 124 | 127 | ||
| 125 | /* Find prim-th root of 1, used in decoding */ | 128 | /* Find prim-th root of 1, used in decoding */ |
| 126 | for(iprim = 1; (iprim % prim) != 0; iprim += rs->nn); | 129 | for(iprim = 1; (iprim % prim) != 0; iprim += rs->nn); |
| @@ -148,42 +151,52 @@ static struct rs_control *rs_init(int symsize, int gfpoly, int (*gffunc)(int), | |||
| 148 | /* convert rs->genpoly[] to index form for quicker encoding */ | 151 | /* convert rs->genpoly[] to index form for quicker encoding */ |
| 149 | for (i = 0; i <= nroots; i++) | 152 | for (i = 0; i <= nroots; i++) |
| 150 | rs->genpoly[i] = rs->index_of[rs->genpoly[i]]; | 153 | rs->genpoly[i] = rs->index_of[rs->genpoly[i]]; |
| 154 | |||
| 155 | rs->users = 1; | ||
| 156 | list_add(&rs->list, &codec_list); | ||
| 151 | return rs; | 157 | return rs; |
| 152 | 158 | ||
| 153 | /* Error exit */ | 159 | err: |
| 154 | errpol: | ||
| 155 | kfree(rs->genpoly); | 160 | kfree(rs->genpoly); |
| 156 | erridx: | ||
| 157 | kfree(rs->index_of); | 161 | kfree(rs->index_of); |
| 158 | erralp: | ||
| 159 | kfree(rs->alpha_to); | 162 | kfree(rs->alpha_to); |
| 160 | errrs: | ||
| 161 | kfree(rs); | 163 | kfree(rs); |
| 162 | return NULL; | 164 | return NULL; |
| 163 | } | 165 | } |
| 164 | 166 | ||
| 165 | 167 | ||
| 166 | /** | 168 | /** |
| 167 | * free_rs - Free the rs control structure, if it is no longer used | 169 | * free_rs - Free the rs control structure |
| 168 | * @rs: the control structure which is not longer used by the | 170 | * @rs: The control structure which is not longer used by the |
| 169 | * caller | 171 | * caller |
| 172 | * | ||
| 173 | * Free the control structure. If @rs is the last user of the associated | ||
| 174 | * codec, free the codec as well. | ||
| 170 | */ | 175 | */ |
| 171 | void free_rs(struct rs_control *rs) | 176 | void free_rs(struct rs_control *rs) |
| 172 | { | 177 | { |
| 178 | struct rs_codec *cd; | ||
| 179 | |||
| 180 | if (!rs) | ||
| 181 | return; | ||
| 182 | |||
| 183 | cd = rs->codec; | ||
| 173 | mutex_lock(&rslistlock); | 184 | mutex_lock(&rslistlock); |
| 174 | rs->users--; | 185 | cd->users--; |
| 175 | if(!rs->users) { | 186 | if(!cd->users) { |
| 176 | list_del(&rs->list); | 187 | list_del(&cd->list); |
| 177 | kfree(rs->alpha_to); | 188 | kfree(cd->alpha_to); |
| 178 | kfree(rs->index_of); | 189 | kfree(cd->index_of); |
| 179 | kfree(rs->genpoly); | 190 | kfree(cd->genpoly); |
| 180 | kfree(rs); | 191 | kfree(cd); |
| 181 | } | 192 | } |
| 182 | mutex_unlock(&rslistlock); | 193 | mutex_unlock(&rslistlock); |
| 194 | kfree(rs); | ||
| 183 | } | 195 | } |
| 196 | EXPORT_SYMBOL_GPL(free_rs); | ||
| 184 | 197 | ||
| 185 | /** | 198 | /** |
| 186 | * init_rs_internal - Find a matching or allocate a new rs control structure | 199 | * init_rs_internal - Allocate rs control, find a matching codec or allocate a new one |
| 187 | * @symsize: the symbol size (number of bits) | 200 | * @symsize: the symbol size (number of bits) |
| 188 | * @gfpoly: the extended Galois field generator polynomial coefficients, | 201 | * @gfpoly: the extended Galois field generator polynomial coefficients, |
| 189 | * with the 0th coefficient in the low order bit. The polynomial | 202 | * with the 0th coefficient in the low order bit. The polynomial |
| @@ -191,55 +204,69 @@ void free_rs(struct rs_control *rs) | |||
| 191 | * @gffunc: pointer to function to generate the next field element, | 204 | * @gffunc: pointer to function to generate the next field element, |
| 192 | * or the multiplicative identity element if given 0. Used | 205 | * or the multiplicative identity element if given 0. Used |
| 193 | * instead of gfpoly if gfpoly is 0 | 206 | * instead of gfpoly if gfpoly is 0 |
| 194 | * @fcr: the first consecutive root of the rs code generator polynomial | 207 | * @fcr: the first consecutive root of the rs code generator polynomial |
| 195 | * in index form | 208 | * in index form |
| 196 | * @prim: primitive element to generate polynomial roots | 209 | * @prim: primitive element to generate polynomial roots |
| 197 | * @nroots: RS code generator polynomial degree (number of roots) | 210 | * @nroots: RS code generator polynomial degree (number of roots) |
| 211 | * @gfp: GFP_ flags for allocations | ||
| 198 | */ | 212 | */ |
| 199 | static struct rs_control *init_rs_internal(int symsize, int gfpoly, | 213 | static struct rs_control *init_rs_internal(int symsize, int gfpoly, |
| 200 | int (*gffunc)(int), int fcr, | 214 | int (*gffunc)(int), int fcr, |
| 201 | int prim, int nroots) | 215 | int prim, int nroots, gfp_t gfp) |
| 202 | { | 216 | { |
| 203 | struct list_head *tmp; | 217 | struct list_head *tmp; |
| 204 | struct rs_control *rs; | 218 | struct rs_control *rs; |
| 219 | unsigned int bsize; | ||
| 205 | 220 | ||
| 206 | /* Sanity checks */ | 221 | /* Sanity checks */ |
| 207 | if (symsize < 1) | 222 | if (symsize < 1) |
| 208 | return NULL; | 223 | return NULL; |
| 209 | if (fcr < 0 || fcr >= (1<<symsize)) | 224 | if (fcr < 0 || fcr >= (1<<symsize)) |
| 210 | return NULL; | 225 | return NULL; |
| 211 | if (prim <= 0 || prim >= (1<<symsize)) | 226 | if (prim <= 0 || prim >= (1<<symsize)) |
| 212 | return NULL; | 227 | return NULL; |
| 213 | if (nroots < 0 || nroots >= (1<<symsize)) | 228 | if (nroots < 0 || nroots >= (1<<symsize)) |
| 214 | return NULL; | 229 | return NULL; |
| 215 | 230 | ||
| 231 | /* | ||
| 232 | * The decoder needs buffers in each control struct instance to | ||
| 233 | * avoid variable size or large fixed size allocations on | ||
| 234 | * stack. Size the buffers to arrays of [nroots + 1]. | ||
| 235 | */ | ||
| 236 | bsize = sizeof(uint16_t) * RS_DECODE_NUM_BUFFERS * (nroots + 1); | ||
| 237 | rs = kzalloc(sizeof(*rs) + bsize, gfp); | ||
| 238 | if (!rs) | ||
| 239 | return NULL; | ||
| 240 | |||
| 216 | mutex_lock(&rslistlock); | 241 | mutex_lock(&rslistlock); |
| 217 | 242 | ||
| 218 | /* Walk through the list and look for a matching entry */ | 243 | /* Walk through the list and look for a matching entry */ |
| 219 | list_for_each(tmp, &rslist) { | 244 | list_for_each(tmp, &codec_list) { |
| 220 | rs = list_entry(tmp, struct rs_control, list); | 245 | struct rs_codec *cd = list_entry(tmp, struct rs_codec, list); |
| 221 | if (symsize != rs->mm) | 246 | |
| 247 | if (symsize != cd->mm) | ||
| 222 | continue; | 248 | continue; |
| 223 | if (gfpoly != rs->gfpoly) | 249 | if (gfpoly != cd->gfpoly) |
| 224 | continue; | 250 | continue; |
| 225 | if (gffunc != rs->gffunc) | 251 | if (gffunc != cd->gffunc) |
| 226 | continue; | 252 | continue; |
| 227 | if (fcr != rs->fcr) | 253 | if (fcr != cd->fcr) |
| 228 | continue; | 254 | continue; |
| 229 | if (prim != rs->prim) | 255 | if (prim != cd->prim) |
| 230 | continue; | 256 | continue; |
| 231 | if (nroots != rs->nroots) | 257 | if (nroots != cd->nroots) |
| 232 | continue; | 258 | continue; |
| 233 | /* We have a matching one already */ | 259 | /* We have a matching one already */ |
| 234 | rs->users++; | 260 | cd->users++; |
| 261 | rs->codec = cd; | ||
| 235 | goto out; | 262 | goto out; |
| 236 | } | 263 | } |
| 237 | 264 | ||
| 238 | /* Create a new one */ | 265 | /* Create a new one */ |
| 239 | rs = rs_init(symsize, gfpoly, gffunc, fcr, prim, nroots); | 266 | rs->codec = codec_init(symsize, gfpoly, gffunc, fcr, prim, nroots, gfp); |
| 240 | if (rs) { | 267 | if (!rs->codec) { |
| 241 | rs->users = 1; | 268 | kfree(rs); |
| 242 | list_add(&rs->list, &rslist); | 269 | rs = NULL; |
| 243 | } | 270 | } |
| 244 | out: | 271 | out: |
| 245 | mutex_unlock(&rslistlock); | 272 | mutex_unlock(&rslistlock); |
| @@ -247,45 +274,48 @@ out: | |||
| 247 | } | 274 | } |
| 248 | 275 | ||
| 249 | /** | 276 | /** |
| 250 | * init_rs - Find a matching or allocate a new rs control structure | 277 | * init_rs_gfp - Create a RS control struct and initialize it |
| 251 | * @symsize: the symbol size (number of bits) | 278 | * @symsize: the symbol size (number of bits) |
| 252 | * @gfpoly: the extended Galois field generator polynomial coefficients, | 279 | * @gfpoly: the extended Galois field generator polynomial coefficients, |
| 253 | * with the 0th coefficient in the low order bit. The polynomial | 280 | * with the 0th coefficient in the low order bit. The polynomial |
| 254 | * must be primitive; | 281 | * must be primitive; |
| 255 | * @fcr: the first consecutive root of the rs code generator polynomial | 282 | * @fcr: the first consecutive root of the rs code generator polynomial |
| 256 | * in index form | 283 | * in index form |
| 257 | * @prim: primitive element to generate polynomial roots | 284 | * @prim: primitive element to generate polynomial roots |
| 258 | * @nroots: RS code generator polynomial degree (number of roots) | 285 | * @nroots: RS code generator polynomial degree (number of roots) |
| 286 | * @gfp: GFP_ flags for allocations | ||
| 259 | */ | 287 | */ |
| 260 | struct rs_control *init_rs(int symsize, int gfpoly, int fcr, int prim, | 288 | struct rs_control *init_rs_gfp(int symsize, int gfpoly, int fcr, int prim, |
| 261 | int nroots) | 289 | int nroots, gfp_t gfp) |
| 262 | { | 290 | { |
| 263 | return init_rs_internal(symsize, gfpoly, NULL, fcr, prim, nroots); | 291 | return init_rs_internal(symsize, gfpoly, NULL, fcr, prim, nroots, gfp); |
| 264 | } | 292 | } |
| 293 | EXPORT_SYMBOL_GPL(init_rs_gfp); | ||
| 265 | 294 | ||
| 266 | /** | 295 | /** |
| 267 | * init_rs_non_canonical - Find a matching or allocate a new rs control | 296 | * init_rs_non_canonical - Allocate rs control struct for fields with |
| 268 | * structure, for fields with non-canonical | 297 | * non-canonical representation |
| 269 | * representation | ||
| 270 | * @symsize: the symbol size (number of bits) | 298 | * @symsize: the symbol size (number of bits) |
| 271 | * @gffunc: pointer to function to generate the next field element, | 299 | * @gffunc: pointer to function to generate the next field element, |
| 272 | * or the multiplicative identity element if given 0. Used | 300 | * or the multiplicative identity element if given 0. Used |
| 273 | * instead of gfpoly if gfpoly is 0 | 301 | * instead of gfpoly if gfpoly is 0 |
| 274 | * @fcr: the first consecutive root of the rs code generator polynomial | 302 | * @fcr: the first consecutive root of the rs code generator polynomial |
| 275 | * in index form | 303 | * in index form |
| 276 | * @prim: primitive element to generate polynomial roots | 304 | * @prim: primitive element to generate polynomial roots |
| 277 | * @nroots: RS code generator polynomial degree (number of roots) | 305 | * @nroots: RS code generator polynomial degree (number of roots) |
| 278 | */ | 306 | */ |
| 279 | struct rs_control *init_rs_non_canonical(int symsize, int (*gffunc)(int), | 307 | struct rs_control *init_rs_non_canonical(int symsize, int (*gffunc)(int), |
| 280 | int fcr, int prim, int nroots) | 308 | int fcr, int prim, int nroots) |
| 281 | { | 309 | { |
| 282 | return init_rs_internal(symsize, 0, gffunc, fcr, prim, nroots); | 310 | return init_rs_internal(symsize, 0, gffunc, fcr, prim, nroots, |
| 311 | GFP_KERNEL); | ||
| 283 | } | 312 | } |
| 313 | EXPORT_SYMBOL_GPL(init_rs_non_canonical); | ||
| 284 | 314 | ||
| 285 | #ifdef CONFIG_REED_SOLOMON_ENC8 | 315 | #ifdef CONFIG_REED_SOLOMON_ENC8 |
| 286 | /** | 316 | /** |
| 287 | * encode_rs8 - Calculate the parity for data values (8bit data width) | 317 | * encode_rs8 - Calculate the parity for data values (8bit data width) |
| 288 | * @rs: the rs control structure | 318 | * @rsc: the rs control structure |
| 289 | * @data: data field of a given type | 319 | * @data: data field of a given type |
| 290 | * @len: data length | 320 | * @len: data length |
| 291 | * @par: parity data, must be initialized by caller (usually all 0) | 321 | * @par: parity data, must be initialized by caller (usually all 0) |
| @@ -295,7 +325,7 @@ struct rs_control *init_rs_non_canonical(int symsize, int (*gffunc)(int), | |||
| 295 | * symbol size > 8. The calling code must take care of encoding of the | 325 | * symbol size > 8. The calling code must take care of encoding of the |
| 296 | * syndrome result for storage itself. | 326 | * syndrome result for storage itself. |
| 297 | */ | 327 | */ |
| 298 | int encode_rs8(struct rs_control *rs, uint8_t *data, int len, uint16_t *par, | 328 | int encode_rs8(struct rs_control *rsc, uint8_t *data, int len, uint16_t *par, |
| 299 | uint16_t invmsk) | 329 | uint16_t invmsk) |
| 300 | { | 330 | { |
| 301 | #include "encode_rs.c" | 331 | #include "encode_rs.c" |
| @@ -306,7 +336,7 @@ EXPORT_SYMBOL_GPL(encode_rs8); | |||
| 306 | #ifdef CONFIG_REED_SOLOMON_DEC8 | 336 | #ifdef CONFIG_REED_SOLOMON_DEC8 |
| 307 | /** | 337 | /** |
| 308 | * decode_rs8 - Decode codeword (8bit data width) | 338 | * decode_rs8 - Decode codeword (8bit data width) |
| 309 | * @rs: the rs control structure | 339 | * @rsc: the rs control structure |
| 310 | * @data: data field of a given type | 340 | * @data: data field of a given type |
| 311 | * @par: received parity data field | 341 | * @par: received parity data field |
| 312 | * @len: data length | 342 | * @len: data length |
| @@ -319,9 +349,14 @@ EXPORT_SYMBOL_GPL(encode_rs8); | |||
| 319 | * The syndrome and parity uses a uint16_t data type to enable | 349 | * The syndrome and parity uses a uint16_t data type to enable |
| 320 | * symbol size > 8. The calling code must take care of decoding of the | 350 | * symbol size > 8. The calling code must take care of decoding of the |
| 321 | * syndrome result and the received parity before calling this code. | 351 | * syndrome result and the received parity before calling this code. |
| 352 | * | ||
| 353 | * Note: The rs_control struct @rsc contains buffers which are used for | ||
| 354 | * decoding, so the caller has to ensure that decoder invocations are | ||
| 355 | * serialized. | ||
| 356 | * | ||
| 322 | * Returns the number of corrected bits or -EBADMSG for uncorrectable errors. | 357 | * Returns the number of corrected bits or -EBADMSG for uncorrectable errors. |
| 323 | */ | 358 | */ |
| 324 | int decode_rs8(struct rs_control *rs, uint8_t *data, uint16_t *par, int len, | 359 | int decode_rs8(struct rs_control *rsc, uint8_t *data, uint16_t *par, int len, |
| 325 | uint16_t *s, int no_eras, int *eras_pos, uint16_t invmsk, | 360 | uint16_t *s, int no_eras, int *eras_pos, uint16_t invmsk, |
| 326 | uint16_t *corr) | 361 | uint16_t *corr) |
| 327 | { | 362 | { |
| @@ -333,7 +368,7 @@ EXPORT_SYMBOL_GPL(decode_rs8); | |||
| 333 | #ifdef CONFIG_REED_SOLOMON_ENC16 | 368 | #ifdef CONFIG_REED_SOLOMON_ENC16 |
| 334 | /** | 369 | /** |
| 335 | * encode_rs16 - Calculate the parity for data values (16bit data width) | 370 | * encode_rs16 - Calculate the parity for data values (16bit data width) |
| 336 | * @rs: the rs control structure | 371 | * @rsc: the rs control structure |
| 337 | * @data: data field of a given type | 372 | * @data: data field of a given type |
| 338 | * @len: data length | 373 | * @len: data length |
| 339 | * @par: parity data, must be initialized by caller (usually all 0) | 374 | * @par: parity data, must be initialized by caller (usually all 0) |
| @@ -341,7 +376,7 @@ EXPORT_SYMBOL_GPL(decode_rs8); | |||
| 341 | * | 376 | * |
| 342 | * Each field in the data array contains up to symbol size bits of valid data. | 377 | * Each field in the data array contains up to symbol size bits of valid data. |
| 343 | */ | 378 | */ |
| 344 | int encode_rs16(struct rs_control *rs, uint16_t *data, int len, uint16_t *par, | 379 | int encode_rs16(struct rs_control *rsc, uint16_t *data, int len, uint16_t *par, |
| 345 | uint16_t invmsk) | 380 | uint16_t invmsk) |
| 346 | { | 381 | { |
| 347 | #include "encode_rs.c" | 382 | #include "encode_rs.c" |
| @@ -352,7 +387,7 @@ EXPORT_SYMBOL_GPL(encode_rs16); | |||
| 352 | #ifdef CONFIG_REED_SOLOMON_DEC16 | 387 | #ifdef CONFIG_REED_SOLOMON_DEC16 |
| 353 | /** | 388 | /** |
| 354 | * decode_rs16 - Decode codeword (16bit data width) | 389 | * decode_rs16 - Decode codeword (16bit data width) |
| 355 | * @rs: the rs control structure | 390 | * @rsc: the rs control structure |
| 356 | * @data: data field of a given type | 391 | * @data: data field of a given type |
| 357 | * @par: received parity data field | 392 | * @par: received parity data field |
| 358 | * @len: data length | 393 | * @len: data length |
| @@ -363,9 +398,14 @@ EXPORT_SYMBOL_GPL(encode_rs16); | |||
| 363 | * @corr: buffer to store correction bitmask on eras_pos | 398 | * @corr: buffer to store correction bitmask on eras_pos |
| 364 | * | 399 | * |
| 365 | * Each field in the data array contains up to symbol size bits of valid data. | 400 | * Each field in the data array contains up to symbol size bits of valid data. |
| 401 | * | ||
| 402 | * Note: The rc_control struct @rsc contains buffers which are used for | ||
| 403 | * decoding, so the caller has to ensure that decoder invocations are | ||
| 404 | * serialized. | ||
| 405 | * | ||
| 366 | * Returns the number of corrected bits or -EBADMSG for uncorrectable errors. | 406 | * Returns the number of corrected bits or -EBADMSG for uncorrectable errors. |
| 367 | */ | 407 | */ |
| 368 | int decode_rs16(struct rs_control *rs, uint16_t *data, uint16_t *par, int len, | 408 | int decode_rs16(struct rs_control *rsc, uint16_t *data, uint16_t *par, int len, |
| 369 | uint16_t *s, int no_eras, int *eras_pos, uint16_t invmsk, | 409 | uint16_t *s, int no_eras, int *eras_pos, uint16_t invmsk, |
| 370 | uint16_t *corr) | 410 | uint16_t *corr) |
| 371 | { | 411 | { |
| @@ -374,10 +414,6 @@ int decode_rs16(struct rs_control *rs, uint16_t *data, uint16_t *par, int len, | |||
| 374 | EXPORT_SYMBOL_GPL(decode_rs16); | 414 | EXPORT_SYMBOL_GPL(decode_rs16); |
| 375 | #endif | 415 | #endif |
| 376 | 416 | ||
| 377 | EXPORT_SYMBOL_GPL(init_rs); | ||
| 378 | EXPORT_SYMBOL_GPL(init_rs_non_canonical); | ||
| 379 | EXPORT_SYMBOL_GPL(free_rs); | ||
| 380 | |||
| 381 | MODULE_LICENSE("GPL"); | 417 | MODULE_LICENSE("GPL"); |
| 382 | MODULE_DESCRIPTION("Reed Solomon encoder/decoder"); | 418 | MODULE_DESCRIPTION("Reed Solomon encoder/decoder"); |
| 383 | MODULE_AUTHOR("Phil Karn, Thomas Gleixner"); | 419 | MODULE_AUTHOR("Phil Karn, Thomas Gleixner"); |
diff --git a/lib/sbitmap.c b/lib/sbitmap.c index e6a9c06ec70c..6fdc6267f4a8 100644 --- a/lib/sbitmap.c +++ b/lib/sbitmap.c | |||
| @@ -270,18 +270,33 @@ void sbitmap_bitmap_show(struct sbitmap *sb, struct seq_file *m) | |||
| 270 | } | 270 | } |
| 271 | EXPORT_SYMBOL_GPL(sbitmap_bitmap_show); | 271 | EXPORT_SYMBOL_GPL(sbitmap_bitmap_show); |
| 272 | 272 | ||
| 273 | static unsigned int sbq_calc_wake_batch(unsigned int depth) | 273 | static unsigned int sbq_calc_wake_batch(struct sbitmap_queue *sbq, |
| 274 | unsigned int depth) | ||
| 274 | { | 275 | { |
| 275 | unsigned int wake_batch; | 276 | unsigned int wake_batch; |
| 277 | unsigned int shallow_depth; | ||
| 276 | 278 | ||
| 277 | /* | 279 | /* |
| 278 | * For each batch, we wake up one queue. We need to make sure that our | 280 | * For each batch, we wake up one queue. We need to make sure that our |
| 279 | * batch size is small enough that the full depth of the bitmap is | 281 | * batch size is small enough that the full depth of the bitmap, |
| 280 | * enough to wake up all of the queues. | 282 | * potentially limited by a shallow depth, is enough to wake up all of |
| 283 | * the queues. | ||
| 284 | * | ||
| 285 | * Each full word of the bitmap has bits_per_word bits, and there might | ||
| 286 | * be a partial word. There are depth / bits_per_word full words and | ||
| 287 | * depth % bits_per_word bits left over. In bitwise arithmetic: | ||
| 288 | * | ||
| 289 | * bits_per_word = 1 << shift | ||
| 290 | * depth / bits_per_word = depth >> shift | ||
| 291 | * depth % bits_per_word = depth & ((1 << shift) - 1) | ||
| 292 | * | ||
| 293 | * Each word can be limited to sbq->min_shallow_depth bits. | ||
| 281 | */ | 294 | */ |
| 282 | wake_batch = SBQ_WAKE_BATCH; | 295 | shallow_depth = min(1U << sbq->sb.shift, sbq->min_shallow_depth); |
| 283 | if (wake_batch > depth / SBQ_WAIT_QUEUES) | 296 | depth = ((depth >> sbq->sb.shift) * shallow_depth + |
| 284 | wake_batch = max(1U, depth / SBQ_WAIT_QUEUES); | 297 | min(depth & ((1U << sbq->sb.shift) - 1), shallow_depth)); |
| 298 | wake_batch = clamp_t(unsigned int, depth / SBQ_WAIT_QUEUES, 1, | ||
| 299 | SBQ_WAKE_BATCH); | ||
| 285 | 300 | ||
| 286 | return wake_batch; | 301 | return wake_batch; |
| 287 | } | 302 | } |
| @@ -307,7 +322,8 @@ int sbitmap_queue_init_node(struct sbitmap_queue *sbq, unsigned int depth, | |||
| 307 | *per_cpu_ptr(sbq->alloc_hint, i) = prandom_u32() % depth; | 322 | *per_cpu_ptr(sbq->alloc_hint, i) = prandom_u32() % depth; |
| 308 | } | 323 | } |
| 309 | 324 | ||
| 310 | sbq->wake_batch = sbq_calc_wake_batch(depth); | 325 | sbq->min_shallow_depth = UINT_MAX; |
| 326 | sbq->wake_batch = sbq_calc_wake_batch(sbq, depth); | ||
| 311 | atomic_set(&sbq->wake_index, 0); | 327 | atomic_set(&sbq->wake_index, 0); |
| 312 | 328 | ||
| 313 | sbq->ws = kzalloc_node(SBQ_WAIT_QUEUES * sizeof(*sbq->ws), flags, node); | 329 | sbq->ws = kzalloc_node(SBQ_WAIT_QUEUES * sizeof(*sbq->ws), flags, node); |
| @@ -327,21 +343,28 @@ int sbitmap_queue_init_node(struct sbitmap_queue *sbq, unsigned int depth, | |||
| 327 | } | 343 | } |
| 328 | EXPORT_SYMBOL_GPL(sbitmap_queue_init_node); | 344 | EXPORT_SYMBOL_GPL(sbitmap_queue_init_node); |
| 329 | 345 | ||
| 330 | void sbitmap_queue_resize(struct sbitmap_queue *sbq, unsigned int depth) | 346 | static void sbitmap_queue_update_wake_batch(struct sbitmap_queue *sbq, |
| 347 | unsigned int depth) | ||
| 331 | { | 348 | { |
| 332 | unsigned int wake_batch = sbq_calc_wake_batch(depth); | 349 | unsigned int wake_batch = sbq_calc_wake_batch(sbq, depth); |
| 333 | int i; | 350 | int i; |
| 334 | 351 | ||
| 335 | if (sbq->wake_batch != wake_batch) { | 352 | if (sbq->wake_batch != wake_batch) { |
| 336 | WRITE_ONCE(sbq->wake_batch, wake_batch); | 353 | WRITE_ONCE(sbq->wake_batch, wake_batch); |
| 337 | /* | 354 | /* |
| 338 | * Pairs with the memory barrier in sbq_wake_up() to ensure that | 355 | * Pairs with the memory barrier in sbitmap_queue_wake_up() |
| 339 | * the batch size is updated before the wait counts. | 356 | * to ensure that the batch size is updated before the wait |
| 357 | * counts. | ||
| 340 | */ | 358 | */ |
| 341 | smp_mb__before_atomic(); | 359 | smp_mb__before_atomic(); |
| 342 | for (i = 0; i < SBQ_WAIT_QUEUES; i++) | 360 | for (i = 0; i < SBQ_WAIT_QUEUES; i++) |
| 343 | atomic_set(&sbq->ws[i].wait_cnt, 1); | 361 | atomic_set(&sbq->ws[i].wait_cnt, 1); |
| 344 | } | 362 | } |
| 363 | } | ||
| 364 | |||
| 365 | void sbitmap_queue_resize(struct sbitmap_queue *sbq, unsigned int depth) | ||
| 366 | { | ||
| 367 | sbitmap_queue_update_wake_batch(sbq, depth); | ||
| 345 | sbitmap_resize(&sbq->sb, depth); | 368 | sbitmap_resize(&sbq->sb, depth); |
| 346 | } | 369 | } |
| 347 | EXPORT_SYMBOL_GPL(sbitmap_queue_resize); | 370 | EXPORT_SYMBOL_GPL(sbitmap_queue_resize); |
| @@ -380,6 +403,8 @@ int __sbitmap_queue_get_shallow(struct sbitmap_queue *sbq, | |||
| 380 | unsigned int hint, depth; | 403 | unsigned int hint, depth; |
| 381 | int nr; | 404 | int nr; |
| 382 | 405 | ||
| 406 | WARN_ON_ONCE(shallow_depth < sbq->min_shallow_depth); | ||
| 407 | |||
| 383 | hint = this_cpu_read(*sbq->alloc_hint); | 408 | hint = this_cpu_read(*sbq->alloc_hint); |
| 384 | depth = READ_ONCE(sbq->sb.depth); | 409 | depth = READ_ONCE(sbq->sb.depth); |
| 385 | if (unlikely(hint >= depth)) { | 410 | if (unlikely(hint >= depth)) { |
| @@ -403,6 +428,14 @@ int __sbitmap_queue_get_shallow(struct sbitmap_queue *sbq, | |||
| 403 | } | 428 | } |
| 404 | EXPORT_SYMBOL_GPL(__sbitmap_queue_get_shallow); | 429 | EXPORT_SYMBOL_GPL(__sbitmap_queue_get_shallow); |
| 405 | 430 | ||
| 431 | void sbitmap_queue_min_shallow_depth(struct sbitmap_queue *sbq, | ||
| 432 | unsigned int min_shallow_depth) | ||
| 433 | { | ||
| 434 | sbq->min_shallow_depth = min_shallow_depth; | ||
| 435 | sbitmap_queue_update_wake_batch(sbq, sbq->sb.depth); | ||
| 436 | } | ||
| 437 | EXPORT_SYMBOL_GPL(sbitmap_queue_min_shallow_depth); | ||
| 438 | |||
| 406 | static struct sbq_wait_state *sbq_wake_ptr(struct sbitmap_queue *sbq) | 439 | static struct sbq_wait_state *sbq_wake_ptr(struct sbitmap_queue *sbq) |
| 407 | { | 440 | { |
| 408 | int i, wake_index; | 441 | int i, wake_index; |
| @@ -425,52 +458,67 @@ static struct sbq_wait_state *sbq_wake_ptr(struct sbitmap_queue *sbq) | |||
| 425 | return NULL; | 458 | return NULL; |
| 426 | } | 459 | } |
| 427 | 460 | ||
| 428 | static void sbq_wake_up(struct sbitmap_queue *sbq) | 461 | static bool __sbq_wake_up(struct sbitmap_queue *sbq) |
| 429 | { | 462 | { |
| 430 | struct sbq_wait_state *ws; | 463 | struct sbq_wait_state *ws; |
| 431 | unsigned int wake_batch; | 464 | unsigned int wake_batch; |
| 432 | int wait_cnt; | 465 | int wait_cnt; |
| 433 | 466 | ||
| 434 | /* | ||
| 435 | * Pairs with the memory barrier in set_current_state() to ensure the | ||
| 436 | * proper ordering of clear_bit()/waitqueue_active() in the waker and | ||
| 437 | * test_and_set_bit_lock()/prepare_to_wait()/finish_wait() in the | ||
| 438 | * waiter. See the comment on waitqueue_active(). This is __after_atomic | ||
| 439 | * because we just did clear_bit_unlock() in the caller. | ||
| 440 | */ | ||
| 441 | smp_mb__after_atomic(); | ||
| 442 | |||
| 443 | ws = sbq_wake_ptr(sbq); | 467 | ws = sbq_wake_ptr(sbq); |
| 444 | if (!ws) | 468 | if (!ws) |
| 445 | return; | 469 | return false; |
| 446 | 470 | ||
| 447 | wait_cnt = atomic_dec_return(&ws->wait_cnt); | 471 | wait_cnt = atomic_dec_return(&ws->wait_cnt); |
| 448 | if (wait_cnt <= 0) { | 472 | if (wait_cnt <= 0) { |
| 473 | int ret; | ||
| 474 | |||
| 449 | wake_batch = READ_ONCE(sbq->wake_batch); | 475 | wake_batch = READ_ONCE(sbq->wake_batch); |
| 476 | |||
| 450 | /* | 477 | /* |
| 451 | * Pairs with the memory barrier in sbitmap_queue_resize() to | 478 | * Pairs with the memory barrier in sbitmap_queue_resize() to |
| 452 | * ensure that we see the batch size update before the wait | 479 | * ensure that we see the batch size update before the wait |
| 453 | * count is reset. | 480 | * count is reset. |
| 454 | */ | 481 | */ |
| 455 | smp_mb__before_atomic(); | 482 | smp_mb__before_atomic(); |
| 483 | |||
| 456 | /* | 484 | /* |
| 457 | * If there are concurrent callers to sbq_wake_up(), the last | 485 | * For concurrent callers of this, the one that failed the |
| 458 | * one to decrement the wait count below zero will bump it back | 486 | * atomic_cmpxhcg() race should call this function again |
| 459 | * up. If there is a concurrent resize, the count reset will | 487 | * to wakeup a new batch on a different 'ws'. |
| 460 | * either cause the cmpxchg to fail or overwrite after the | ||
| 461 | * cmpxchg. | ||
| 462 | */ | 488 | */ |
| 463 | atomic_cmpxchg(&ws->wait_cnt, wait_cnt, wait_cnt + wake_batch); | 489 | ret = atomic_cmpxchg(&ws->wait_cnt, wait_cnt, wake_batch); |
| 464 | sbq_index_atomic_inc(&sbq->wake_index); | 490 | if (ret == wait_cnt) { |
| 465 | wake_up_nr(&ws->wait, wake_batch); | 491 | sbq_index_atomic_inc(&sbq->wake_index); |
| 492 | wake_up_nr(&ws->wait, wake_batch); | ||
| 493 | return false; | ||
| 494 | } | ||
| 495 | |||
| 496 | return true; | ||
| 466 | } | 497 | } |
| 498 | |||
| 499 | return false; | ||
| 500 | } | ||
| 501 | |||
| 502 | void sbitmap_queue_wake_up(struct sbitmap_queue *sbq) | ||
| 503 | { | ||
| 504 | while (__sbq_wake_up(sbq)) | ||
| 505 | ; | ||
| 467 | } | 506 | } |
| 507 | EXPORT_SYMBOL_GPL(sbitmap_queue_wake_up); | ||
| 468 | 508 | ||
| 469 | void sbitmap_queue_clear(struct sbitmap_queue *sbq, unsigned int nr, | 509 | void sbitmap_queue_clear(struct sbitmap_queue *sbq, unsigned int nr, |
| 470 | unsigned int cpu) | 510 | unsigned int cpu) |
| 471 | { | 511 | { |
| 472 | sbitmap_clear_bit_unlock(&sbq->sb, nr); | 512 | sbitmap_clear_bit_unlock(&sbq->sb, nr); |
| 473 | sbq_wake_up(sbq); | 513 | /* |
| 514 | * Pairs with the memory barrier in set_current_state() to ensure the | ||
| 515 | * proper ordering of clear_bit_unlock()/waitqueue_active() in the waker | ||
| 516 | * and test_and_set_bit_lock()/prepare_to_wait()/finish_wait() in the | ||
| 517 | * waiter. See the comment on waitqueue_active(). | ||
| 518 | */ | ||
| 519 | smp_mb__after_atomic(); | ||
| 520 | sbitmap_queue_wake_up(sbq); | ||
| 521 | |||
| 474 | if (likely(!sbq->round_robin && nr < sbq->sb.depth)) | 522 | if (likely(!sbq->round_robin && nr < sbq->sb.depth)) |
| 475 | *per_cpu_ptr(sbq->alloc_hint, cpu) = nr; | 523 | *per_cpu_ptr(sbq->alloc_hint, cpu) = nr; |
| 476 | } | 524 | } |
| @@ -482,7 +530,7 @@ void sbitmap_queue_wake_all(struct sbitmap_queue *sbq) | |||
| 482 | 530 | ||
| 483 | /* | 531 | /* |
| 484 | * Pairs with the memory barrier in set_current_state() like in | 532 | * Pairs with the memory barrier in set_current_state() like in |
| 485 | * sbq_wake_up(). | 533 | * sbitmap_queue_wake_up(). |
| 486 | */ | 534 | */ |
| 487 | smp_mb(); | 535 | smp_mb(); |
| 488 | wake_index = atomic_read(&sbq->wake_index); | 536 | wake_index = atomic_read(&sbq->wake_index); |
| @@ -528,5 +576,6 @@ void sbitmap_queue_show(struct sbitmap_queue *sbq, struct seq_file *m) | |||
| 528 | seq_puts(m, "}\n"); | 576 | seq_puts(m, "}\n"); |
| 529 | 577 | ||
| 530 | seq_printf(m, "round_robin=%d\n", sbq->round_robin); | 578 | seq_printf(m, "round_robin=%d\n", sbq->round_robin); |
| 579 | seq_printf(m, "min_shallow_depth=%u\n", sbq->min_shallow_depth); | ||
| 531 | } | 580 | } |
| 532 | EXPORT_SYMBOL_GPL(sbitmap_queue_show); | 581 | EXPORT_SYMBOL_GPL(sbitmap_queue_show); |
diff --git a/lib/swiotlb.c b/lib/swiotlb.c index fece57566d45..04b68d9dffac 100644 --- a/lib/swiotlb.c +++ b/lib/swiotlb.c | |||
| @@ -593,9 +593,8 @@ found: | |||
| 593 | } | 593 | } |
| 594 | 594 | ||
| 595 | /* | 595 | /* |
| 596 | * Allocates bounce buffer and returns its kernel virtual address. | 596 | * Allocates bounce buffer and returns its physical address. |
| 597 | */ | 597 | */ |
| 598 | |||
| 599 | static phys_addr_t | 598 | static phys_addr_t |
| 600 | map_single(struct device *hwdev, phys_addr_t phys, size_t size, | 599 | map_single(struct device *hwdev, phys_addr_t phys, size_t size, |
| 601 | enum dma_data_direction dir, unsigned long attrs) | 600 | enum dma_data_direction dir, unsigned long attrs) |
| @@ -614,7 +613,7 @@ map_single(struct device *hwdev, phys_addr_t phys, size_t size, | |||
| 614 | } | 613 | } |
| 615 | 614 | ||
| 616 | /* | 615 | /* |
| 617 | * dma_addr is the kernel virtual address of the bounce buffer to unmap. | 616 | * tlb_addr is the physical address of the bounce buffer to unmap. |
| 618 | */ | 617 | */ |
| 619 | void swiotlb_tbl_unmap_single(struct device *hwdev, phys_addr_t tlb_addr, | 618 | void swiotlb_tbl_unmap_single(struct device *hwdev, phys_addr_t tlb_addr, |
| 620 | size_t size, enum dma_data_direction dir, | 619 | size_t size, enum dma_data_direction dir, |
| @@ -692,7 +691,6 @@ void swiotlb_tbl_sync_single(struct device *hwdev, phys_addr_t tlb_addr, | |||
| 692 | } | 691 | } |
| 693 | } | 692 | } |
| 694 | 693 | ||
| 695 | #ifdef CONFIG_DMA_DIRECT_OPS | ||
| 696 | static inline bool dma_coherent_ok(struct device *dev, dma_addr_t addr, | 694 | static inline bool dma_coherent_ok(struct device *dev, dma_addr_t addr, |
| 697 | size_t size) | 695 | size_t size) |
| 698 | { | 696 | { |
| @@ -714,7 +712,7 @@ swiotlb_alloc_buffer(struct device *dev, size_t size, dma_addr_t *dma_handle, | |||
| 714 | 712 | ||
| 715 | phys_addr = swiotlb_tbl_map_single(dev, | 713 | phys_addr = swiotlb_tbl_map_single(dev, |
| 716 | __phys_to_dma(dev, io_tlb_start), | 714 | __phys_to_dma(dev, io_tlb_start), |
| 717 | 0, size, DMA_FROM_DEVICE, 0); | 715 | 0, size, DMA_FROM_DEVICE, attrs); |
| 718 | if (phys_addr == SWIOTLB_MAP_ERROR) | 716 | if (phys_addr == SWIOTLB_MAP_ERROR) |
| 719 | goto out_warn; | 717 | goto out_warn; |
| 720 | 718 | ||
| @@ -727,7 +725,7 @@ swiotlb_alloc_buffer(struct device *dev, size_t size, dma_addr_t *dma_handle, | |||
| 727 | 725 | ||
| 728 | out_unmap: | 726 | out_unmap: |
| 729 | dev_warn(dev, "hwdev DMA mask = 0x%016Lx, dev_addr = 0x%016Lx\n", | 727 | dev_warn(dev, "hwdev DMA mask = 0x%016Lx, dev_addr = 0x%016Lx\n", |
| 730 | (unsigned long long)(dev ? dev->coherent_dma_mask : 0), | 728 | (unsigned long long)dev->coherent_dma_mask, |
| 731 | (unsigned long long)*dma_handle); | 729 | (unsigned long long)*dma_handle); |
| 732 | 730 | ||
| 733 | /* | 731 | /* |
| @@ -737,7 +735,7 @@ out_unmap: | |||
| 737 | swiotlb_tbl_unmap_single(dev, phys_addr, size, DMA_TO_DEVICE, | 735 | swiotlb_tbl_unmap_single(dev, phys_addr, size, DMA_TO_DEVICE, |
| 738 | DMA_ATTR_SKIP_CPU_SYNC); | 736 | DMA_ATTR_SKIP_CPU_SYNC); |
| 739 | out_warn: | 737 | out_warn: |
| 740 | if ((attrs & DMA_ATTR_NO_WARN) && printk_ratelimit()) { | 738 | if (!(attrs & DMA_ATTR_NO_WARN) && printk_ratelimit()) { |
| 741 | dev_warn(dev, | 739 | dev_warn(dev, |
| 742 | "swiotlb: coherent allocation failed, size=%zu\n", | 740 | "swiotlb: coherent allocation failed, size=%zu\n", |
| 743 | size); | 741 | size); |
| @@ -764,7 +762,6 @@ static bool swiotlb_free_buffer(struct device *dev, size_t size, | |||
| 764 | DMA_ATTR_SKIP_CPU_SYNC); | 762 | DMA_ATTR_SKIP_CPU_SYNC); |
| 765 | return true; | 763 | return true; |
| 766 | } | 764 | } |
| 767 | #endif | ||
| 768 | 765 | ||
| 769 | static void | 766 | static void |
| 770 | swiotlb_full(struct device *dev, size_t size, enum dma_data_direction dir, | 767 | swiotlb_full(struct device *dev, size_t size, enum dma_data_direction dir, |
| @@ -1045,7 +1042,6 @@ swiotlb_dma_supported(struct device *hwdev, u64 mask) | |||
| 1045 | return __phys_to_dma(hwdev, io_tlb_end - 1) <= mask; | 1042 | return __phys_to_dma(hwdev, io_tlb_end - 1) <= mask; |
| 1046 | } | 1043 | } |
| 1047 | 1044 | ||
| 1048 | #ifdef CONFIG_DMA_DIRECT_OPS | ||
| 1049 | void *swiotlb_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle, | 1045 | void *swiotlb_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle, |
| 1050 | gfp_t gfp, unsigned long attrs) | 1046 | gfp_t gfp, unsigned long attrs) |
| 1051 | { | 1047 | { |
| @@ -1089,4 +1085,3 @@ const struct dma_map_ops swiotlb_dma_ops = { | |||
| 1089 | .unmap_page = swiotlb_unmap_page, | 1085 | .unmap_page = swiotlb_unmap_page, |
| 1090 | .dma_supported = dma_direct_supported, | 1086 | .dma_supported = dma_direct_supported, |
| 1091 | }; | 1087 | }; |
| 1092 | #endif /* CONFIG_DMA_DIRECT_OPS */ | ||
diff --git a/lib/test_bitmap.c b/lib/test_bitmap.c index de16f7869fb1..6cd7d0740005 100644 --- a/lib/test_bitmap.c +++ b/lib/test_bitmap.c | |||
| @@ -331,23 +331,32 @@ static void noinline __init test_mem_optimisations(void) | |||
| 331 | unsigned int start, nbits; | 331 | unsigned int start, nbits; |
| 332 | 332 | ||
| 333 | for (start = 0; start < 1024; start += 8) { | 333 | for (start = 0; start < 1024; start += 8) { |
| 334 | memset(bmap1, 0x5a, sizeof(bmap1)); | ||
| 335 | memset(bmap2, 0x5a, sizeof(bmap2)); | ||
| 336 | for (nbits = 0; nbits < 1024 - start; nbits += 8) { | 334 | for (nbits = 0; nbits < 1024 - start; nbits += 8) { |
| 335 | memset(bmap1, 0x5a, sizeof(bmap1)); | ||
| 336 | memset(bmap2, 0x5a, sizeof(bmap2)); | ||
| 337 | |||
| 337 | bitmap_set(bmap1, start, nbits); | 338 | bitmap_set(bmap1, start, nbits); |
| 338 | __bitmap_set(bmap2, start, nbits); | 339 | __bitmap_set(bmap2, start, nbits); |
| 339 | if (!bitmap_equal(bmap1, bmap2, 1024)) | 340 | if (!bitmap_equal(bmap1, bmap2, 1024)) { |
| 340 | printk("set not equal %d %d\n", start, nbits); | 341 | printk("set not equal %d %d\n", start, nbits); |
| 341 | if (!__bitmap_equal(bmap1, bmap2, 1024)) | 342 | failed_tests++; |
| 343 | } | ||
| 344 | if (!__bitmap_equal(bmap1, bmap2, 1024)) { | ||
| 342 | printk("set not __equal %d %d\n", start, nbits); | 345 | printk("set not __equal %d %d\n", start, nbits); |
| 346 | failed_tests++; | ||
| 347 | } | ||
| 343 | 348 | ||
| 344 | bitmap_clear(bmap1, start, nbits); | 349 | bitmap_clear(bmap1, start, nbits); |
| 345 | __bitmap_clear(bmap2, start, nbits); | 350 | __bitmap_clear(bmap2, start, nbits); |
| 346 | if (!bitmap_equal(bmap1, bmap2, 1024)) | 351 | if (!bitmap_equal(bmap1, bmap2, 1024)) { |
| 347 | printk("clear not equal %d %d\n", start, nbits); | 352 | printk("clear not equal %d %d\n", start, nbits); |
| 348 | if (!__bitmap_equal(bmap1, bmap2, 1024)) | 353 | failed_tests++; |
| 354 | } | ||
| 355 | if (!__bitmap_equal(bmap1, bmap2, 1024)) { | ||
| 349 | printk("clear not __equal %d %d\n", start, | 356 | printk("clear not __equal %d %d\n", start, |
| 350 | nbits); | 357 | nbits); |
| 358 | failed_tests++; | ||
| 359 | } | ||
| 351 | } | 360 | } |
| 352 | } | 361 | } |
| 353 | } | 362 | } |
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index 30c0cb8cc9bc..23920c5ff728 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c | |||
| @@ -1669,19 +1669,22 @@ char *pointer_string(char *buf, char *end, const void *ptr, | |||
| 1669 | return number(buf, end, (unsigned long int)ptr, spec); | 1669 | return number(buf, end, (unsigned long int)ptr, spec); |
| 1670 | } | 1670 | } |
| 1671 | 1671 | ||
| 1672 | static bool have_filled_random_ptr_key __read_mostly; | 1672 | static DEFINE_STATIC_KEY_TRUE(not_filled_random_ptr_key); |
| 1673 | static siphash_key_t ptr_key __read_mostly; | 1673 | static siphash_key_t ptr_key __read_mostly; |
| 1674 | 1674 | ||
| 1675 | static void fill_random_ptr_key(struct random_ready_callback *unused) | 1675 | static void enable_ptr_key_workfn(struct work_struct *work) |
| 1676 | { | 1676 | { |
| 1677 | get_random_bytes(&ptr_key, sizeof(ptr_key)); | 1677 | get_random_bytes(&ptr_key, sizeof(ptr_key)); |
| 1678 | /* | 1678 | /* Needs to run from preemptible context */ |
| 1679 | * have_filled_random_ptr_key==true is dependent on get_random_bytes(). | 1679 | static_branch_disable(¬_filled_random_ptr_key); |
| 1680 | * ptr_to_id() needs to see have_filled_random_ptr_key==true | 1680 | } |
| 1681 | * after get_random_bytes() returns. | 1681 | |
| 1682 | */ | 1682 | static DECLARE_WORK(enable_ptr_key_work, enable_ptr_key_workfn); |
| 1683 | smp_mb(); | 1683 | |
| 1684 | WRITE_ONCE(have_filled_random_ptr_key, true); | 1684 | static void fill_random_ptr_key(struct random_ready_callback *unused) |
| 1685 | { | ||
| 1686 | /* This may be in an interrupt handler. */ | ||
| 1687 | queue_work(system_unbound_wq, &enable_ptr_key_work); | ||
| 1685 | } | 1688 | } |
| 1686 | 1689 | ||
| 1687 | static struct random_ready_callback random_ready = { | 1690 | static struct random_ready_callback random_ready = { |
| @@ -1695,7 +1698,8 @@ static int __init initialize_ptr_random(void) | |||
| 1695 | if (!ret) { | 1698 | if (!ret) { |
| 1696 | return 0; | 1699 | return 0; |
| 1697 | } else if (ret == -EALREADY) { | 1700 | } else if (ret == -EALREADY) { |
| 1698 | fill_random_ptr_key(&random_ready); | 1701 | /* This is in preemptible context */ |
| 1702 | enable_ptr_key_workfn(&enable_ptr_key_work); | ||
| 1699 | return 0; | 1703 | return 0; |
| 1700 | } | 1704 | } |
| 1701 | 1705 | ||
| @@ -1709,7 +1713,7 @@ static char *ptr_to_id(char *buf, char *end, void *ptr, struct printf_spec spec) | |||
| 1709 | unsigned long hashval; | 1713 | unsigned long hashval; |
| 1710 | const int default_width = 2 * sizeof(ptr); | 1714 | const int default_width = 2 * sizeof(ptr); |
| 1711 | 1715 | ||
| 1712 | if (unlikely(!have_filled_random_ptr_key)) { | 1716 | if (static_branch_unlikely(¬_filled_random_ptr_key)) { |
| 1713 | spec.field_width = default_width; | 1717 | spec.field_width = default_width; |
| 1714 | /* string length must be less than default_width */ | 1718 | /* string length must be less than default_width */ |
| 1715 | return string(buf, end, "(ptrval)", spec); | 1719 | return string(buf, end, "(ptrval)", spec); |
