diff options
Diffstat (limited to 'mm/util.c')
| -rw-r--r-- | mm/util.c | 26 | 
1 files changed, 24 insertions, 2 deletions
diff --git a/mm/util.c b/mm/util.c index b56c92fb910f..b8ed9dbc7fd5 100644 --- a/mm/util.c +++ b/mm/util.c @@ -120,7 +120,8 @@ EXPORT_SYMBOL(kstrndup);   * @len: memory region length   * @gfp: GFP mask to use   * - * Return: newly allocated copy of @src or %NULL in case of error + * Return: newly allocated copy of @src or %NULL in case of error, + * result is physically contiguous. Use kfree() to free.   */  void *kmemdup(const void *src, size_t len, gfp_t gfp)  { @@ -134,6 +135,27 @@ void *kmemdup(const void *src, size_t len, gfp_t gfp)  EXPORT_SYMBOL(kmemdup);  /** + * kvmemdup - duplicate region of memory + * + * @src: memory region to duplicate + * @len: memory region length + * @gfp: GFP mask to use + * + * Return: newly allocated copy of @src or %NULL in case of error, + * result may be not physically contiguous. Use kvfree() to free. + */ +void *kvmemdup(const void *src, size_t len, gfp_t gfp) +{ +	void *p; + +	p = kvmalloc(len, gfp); +	if (p) +		memcpy(p, src, len); +	return p; +} +EXPORT_SYMBOL(kvmemdup); + +/**   * kmemdup_nul - Create a NUL-terminated string from unterminated data   * @s: The data to stringify   * @len: The size of the data @@ -945,7 +967,7 @@ int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin)  	if (percpu_counter_read_positive(&vm_committed_as) < allowed)  		return 0;  error: -	pr_warn_ratelimited("%s: pid: %d, comm: %s, no enough memory for the allocation\n", +	pr_warn_ratelimited("%s: pid: %d, comm: %s, not enough memory for the allocation\n",  			    __func__, current->pid, current->comm);  	vm_unacct_memory(pages);  |