xref: /openbmc/linux/mm/util.c (revision 82ced6fd)
1 #include <linux/mm.h>
2 #include <linux/slab.h>
3 #include <linux/string.h>
4 #include <linux/module.h>
5 #include <linux/err.h>
6 #include <linux/sched.h>
7 #include <linux/tracepoint.h>
8 #include <asm/uaccess.h>
9 
10 /**
11  * kstrdup - allocate space for and copy an existing string
12  * @s: the string to duplicate
13  * @gfp: the GFP mask used in the kmalloc() call when allocating memory
14  */
15 char *kstrdup(const char *s, gfp_t gfp)
16 {
17 	size_t len;
18 	char *buf;
19 
20 	if (!s)
21 		return NULL;
22 
23 	len = strlen(s) + 1;
24 	buf = kmalloc_track_caller(len, gfp);
25 	if (buf)
26 		memcpy(buf, s, len);
27 	return buf;
28 }
29 EXPORT_SYMBOL(kstrdup);
30 
31 /**
32  * kstrndup - allocate space for and copy an existing string
33  * @s: the string to duplicate
34  * @max: read at most @max chars from @s
35  * @gfp: the GFP mask used in the kmalloc() call when allocating memory
36  */
37 char *kstrndup(const char *s, size_t max, gfp_t gfp)
38 {
39 	size_t len;
40 	char *buf;
41 
42 	if (!s)
43 		return NULL;
44 
45 	len = strnlen(s, max);
46 	buf = kmalloc_track_caller(len+1, gfp);
47 	if (buf) {
48 		memcpy(buf, s, len);
49 		buf[len] = '\0';
50 	}
51 	return buf;
52 }
53 EXPORT_SYMBOL(kstrndup);
54 
55 /**
56  * kmemdup - duplicate region of memory
57  *
58  * @src: memory region to duplicate
59  * @len: memory region length
60  * @gfp: GFP mask to use
61  */
62 void *kmemdup(const void *src, size_t len, gfp_t gfp)
63 {
64 	void *p;
65 
66 	p = kmalloc_track_caller(len, gfp);
67 	if (p)
68 		memcpy(p, src, len);
69 	return p;
70 }
71 EXPORT_SYMBOL(kmemdup);
72 
73 /**
74  * memdup_user - duplicate memory region from user space
75  *
76  * @src: source address in user space
77  * @len: number of bytes to copy
78  *
79  * Returns an ERR_PTR() on failure.
80  */
81 void *memdup_user(const void __user *src, size_t len)
82 {
83 	void *p;
84 
85 	/*
86 	 * Always use GFP_KERNEL, since copy_from_user() can sleep and
87 	 * cause pagefault, which makes it pointless to use GFP_NOFS
88 	 * or GFP_ATOMIC.
89 	 */
90 	p = kmalloc_track_caller(len, GFP_KERNEL);
91 	if (!p)
92 		return ERR_PTR(-ENOMEM);
93 
94 	if (copy_from_user(p, src, len)) {
95 		kfree(p);
96 		return ERR_PTR(-EFAULT);
97 	}
98 
99 	return p;
100 }
101 EXPORT_SYMBOL(memdup_user);
102 
103 /**
104  * __krealloc - like krealloc() but don't free @p.
105  * @p: object to reallocate memory for.
106  * @new_size: how many bytes of memory are required.
107  * @flags: the type of memory to allocate.
108  *
109  * This function is like krealloc() except it never frees the originally
110  * allocated buffer. Use this if you don't want to free the buffer immediately
111  * like, for example, with RCU.
112  */
113 void *__krealloc(const void *p, size_t new_size, gfp_t flags)
114 {
115 	void *ret;
116 	size_t ks = 0;
117 
118 	if (unlikely(!new_size))
119 		return ZERO_SIZE_PTR;
120 
121 	if (p)
122 		ks = ksize(p);
123 
124 	if (ks >= new_size)
125 		return (void *)p;
126 
127 	ret = kmalloc_track_caller(new_size, flags);
128 	if (ret && p)
129 		memcpy(ret, p, ks);
130 
131 	return ret;
132 }
133 EXPORT_SYMBOL(__krealloc);
134 
135 /**
136  * krealloc - reallocate memory. The contents will remain unchanged.
137  * @p: object to reallocate memory for.
138  * @new_size: how many bytes of memory are required.
139  * @flags: the type of memory to allocate.
140  *
141  * The contents of the object pointed to are preserved up to the
142  * lesser of the new and old sizes.  If @p is %NULL, krealloc()
143  * behaves exactly like kmalloc().  If @size is 0 and @p is not a
144  * %NULL pointer, the object pointed to is freed.
145  */
146 void *krealloc(const void *p, size_t new_size, gfp_t flags)
147 {
148 	void *ret;
149 
150 	if (unlikely(!new_size)) {
151 		kfree(p);
152 		return ZERO_SIZE_PTR;
153 	}
154 
155 	ret = __krealloc(p, new_size, flags);
156 	if (ret && p != ret)
157 		kfree(p);
158 
159 	return ret;
160 }
161 EXPORT_SYMBOL(krealloc);
162 
163 /**
164  * kzfree - like kfree but zero memory
165  * @p: object to free memory of
166  *
167  * The memory of the object @p points to is zeroed before freed.
168  * If @p is %NULL, kzfree() does nothing.
169  */
170 void kzfree(const void *p)
171 {
172 	size_t ks;
173 	void *mem = (void *)p;
174 
175 	if (unlikely(ZERO_OR_NULL_PTR(mem)))
176 		return;
177 	ks = ksize(mem);
178 	memset(mem, 0, ks);
179 	kfree(mem);
180 }
181 EXPORT_SYMBOL(kzfree);
182 
183 /*
184  * strndup_user - duplicate an existing string from user space
185  * @s: The string to duplicate
186  * @n: Maximum number of bytes to copy, including the trailing NUL.
187  */
188 char *strndup_user(const char __user *s, long n)
189 {
190 	char *p;
191 	long length;
192 
193 	length = strnlen_user(s, n);
194 
195 	if (!length)
196 		return ERR_PTR(-EFAULT);
197 
198 	if (length > n)
199 		return ERR_PTR(-EINVAL);
200 
201 	p = kmalloc(length, GFP_KERNEL);
202 
203 	if (!p)
204 		return ERR_PTR(-ENOMEM);
205 
206 	if (copy_from_user(p, s, length)) {
207 		kfree(p);
208 		return ERR_PTR(-EFAULT);
209 	}
210 
211 	p[length - 1] = '\0';
212 
213 	return p;
214 }
215 EXPORT_SYMBOL(strndup_user);
216 
217 #ifndef HAVE_ARCH_PICK_MMAP_LAYOUT
218 void arch_pick_mmap_layout(struct mm_struct *mm)
219 {
220 	mm->mmap_base = TASK_UNMAPPED_BASE;
221 	mm->get_unmapped_area = arch_get_unmapped_area;
222 	mm->unmap_area = arch_unmap_area;
223 }
224 #endif
225 
226 /**
227  * get_user_pages_fast() - pin user pages in memory
228  * @start:	starting user address
229  * @nr_pages:	number of pages from start to pin
230  * @write:	whether pages will be written to
231  * @pages:	array that receives pointers to the pages pinned.
232  *		Should be at least nr_pages long.
233  *
234  * Attempt to pin user pages in memory without taking mm->mmap_sem.
235  * If not successful, it will fall back to taking the lock and
236  * calling get_user_pages().
237  *
238  * Returns number of pages pinned. This may be fewer than the number
239  * requested. If nr_pages is 0 or negative, returns 0. If no pages
240  * were pinned, returns -errno.
241  */
242 int __attribute__((weak)) get_user_pages_fast(unsigned long start,
243 				int nr_pages, int write, struct page **pages)
244 {
245 	struct mm_struct *mm = current->mm;
246 	int ret;
247 
248 	down_read(&mm->mmap_sem);
249 	ret = get_user_pages(current, mm, start, nr_pages,
250 					write, 0, pages, NULL);
251 	up_read(&mm->mmap_sem);
252 
253 	return ret;
254 }
255 EXPORT_SYMBOL_GPL(get_user_pages_fast);
256 
257 /* Tracepoints definitions. */
258 DEFINE_TRACE(kmalloc);
259 DEFINE_TRACE(kmem_cache_alloc);
260 DEFINE_TRACE(kmalloc_node);
261 DEFINE_TRACE(kmem_cache_alloc_node);
262 DEFINE_TRACE(kfree);
263 DEFINE_TRACE(kmem_cache_free);
264 
265 EXPORT_TRACEPOINT_SYMBOL(kmalloc);
266 EXPORT_TRACEPOINT_SYMBOL(kmem_cache_alloc);
267 EXPORT_TRACEPOINT_SYMBOL(kmalloc_node);
268 EXPORT_TRACEPOINT_SYMBOL(kmem_cache_alloc_node);
269 EXPORT_TRACEPOINT_SYMBOL(kfree);
270 EXPORT_TRACEPOINT_SYMBOL(kmem_cache_free);
271