Commit d364d2ad authored by Bartosz Golaszewski's avatar Bartosz Golaszewski Committed by Linus Walleij
Browse files

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: default avatarAndy Shevchenko <andy@kernel.org>
Acked-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tested-by: default avatarNeil Armstrong <neil.armstrong@linaro.org>
Signed-off-by: default avatarBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent 4002ee98
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -1117,6 +1117,27 @@ void *devm_kmemdup(struct device *dev, const void *src, size_t len, gfp_t gfp)
}
EXPORT_SYMBOL_GPL(devm_kmemdup);

/**
 * devm_kmemdup_const - conditionally duplicate and manage a region of memory
 *
 * @dev: Device this memory belongs to
 * @src: memory region to duplicate
 * @len: memory region length,
 * @gfp: GFP mask to use
 *
 * Return: source address if it is in .rodata or the return value of kmemdup()
 * to which the function falls back otherwise.
 */
const void *
devm_kmemdup_const(struct device *dev, const void *src, size_t len, gfp_t gfp)
{
	if (is_kernel_rodata((unsigned long)src))
		return src;

	return devm_kmemdup(dev, src, len, gfp);
}
EXPORT_SYMBOL_GPL(devm_kmemdup_const);

struct pages_devres {
	unsigned long addr;
	unsigned int order;
+2 −0
Original line number Diff line number Diff line
@@ -80,6 +80,8 @@ void devm_kfree(struct device *dev, const void *p);

void * __realloc_size(3)
devm_kmemdup(struct device *dev, const void *src, size_t len, gfp_t gfp);
const void *
devm_kmemdup_const(struct device *dev, const void *src, size_t len, gfp_t gfp);
static inline void *devm_kmemdup_array(struct device *dev, const void *src,
				       size_t n, size_t size, gfp_t flags)
{