Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

devres: provide devm_kmemdup_const()

Provide a function similar to devm_strdup_const() but for copying blocks
of memory that are likely to be placed in .rodata.

Reviewed-by: Andy Shevchenko <andy@kernel.org>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Tested-by: Neil Armstrong <neil.armstrong@linaro.org>
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

authored by

Bartosz Golaszewski and committed by
Linus Walleij
d364d2ad 4002ee98

+23
+21
drivers/base/devres.c
··· 1117 1117 } 1118 1118 EXPORT_SYMBOL_GPL(devm_kmemdup); 1119 1119 1120 + /** 1121 + * devm_kmemdup_const - conditionally duplicate and manage a region of memory 1122 + * 1123 + * @dev: Device this memory belongs to 1124 + * @src: memory region to duplicate 1125 + * @len: memory region length, 1126 + * @gfp: GFP mask to use 1127 + * 1128 + * Return: source address if it is in .rodata or the return value of kmemdup() 1129 + * to which the function falls back otherwise. 1130 + */ 1131 + const void * 1132 + devm_kmemdup_const(struct device *dev, const void *src, size_t len, gfp_t gfp) 1133 + { 1134 + if (is_kernel_rodata((unsigned long)src)) 1135 + return src; 1136 + 1137 + return devm_kmemdup(dev, src, len, gfp); 1138 + } 1139 + EXPORT_SYMBOL_GPL(devm_kmemdup_const); 1140 + 1120 1141 struct pages_devres { 1121 1142 unsigned long addr; 1122 1143 unsigned int order;
+2
include/linux/device/devres.h
··· 80 80 81 81 void * __realloc_size(3) 82 82 devm_kmemdup(struct device *dev, const void *src, size_t len, gfp_t gfp); 83 + const void * 84 + devm_kmemdup_const(struct device *dev, const void *src, size_t len, gfp_t gfp); 83 85 static inline void *devm_kmemdup_array(struct device *dev, const void *src, 84 86 size_t n, size_t size, gfp_t flags) 85 87 {