mirror of https://github.com/torvalds/linux.git
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>
This commit is contained in:
parent
4002ee98c0
commit
d364d2ad07
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue