aboutsummaryrefslogtreecommitdiffstats
path: root/mm/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/util.c')
-rw-r--r--mm/util.c58
1 files changed, 37 insertions, 21 deletions
diff --git a/mm/util.c b/mm/util.c
index 4735ea481816..88ea1bd661c0 100644
--- a/mm/util.c
+++ b/mm/util.c
@@ -6,6 +6,8 @@
6#include <linux/sched.h> 6#include <linux/sched.h>
7#include <asm/uaccess.h> 7#include <asm/uaccess.h>
8 8
9#include "internal.h"
10
9#define CREATE_TRACE_POINTS 11#define CREATE_TRACE_POINTS
10#include <trace/events/kmem.h> 12#include <trace/events/kmem.h>
11 13
@@ -186,27 +188,6 @@ void kzfree(const void *p)
186} 188}
187EXPORT_SYMBOL(kzfree); 189EXPORT_SYMBOL(kzfree);
188 190
189int kern_ptr_validate(const void *ptr, unsigned long size)
190{
191 unsigned long addr = (unsigned long)ptr;
192 unsigned long min_addr = PAGE_OFFSET;
193 unsigned long align_mask = sizeof(void *) - 1;
194
195 if (unlikely(addr < min_addr))
196 goto out;
197 if (unlikely(addr > (unsigned long)high_memory - size))
198 goto out;
199 if (unlikely(addr & align_mask))
200 goto out;
201 if (unlikely(!kern_addr_valid(addr)))
202 goto out;
203 if (unlikely(!kern_addr_valid(addr + size - 1)))
204 goto out;
205 return 1;
206out:
207 return 0;
208}
209
210/* 191/*
211 * strndup_user - duplicate an existing string from user space 192 * strndup_user - duplicate an existing string from user space
212 * @s: The string to duplicate 193 * @s: The string to duplicate
@@ -236,6 +217,28 @@ char *strndup_user(const char __user *s, long n)
236} 217}
237EXPORT_SYMBOL(strndup_user); 218EXPORT_SYMBOL(strndup_user);
238 219
220void __vma_link_list(struct mm_struct *mm, struct vm_area_struct *vma,
221 struct vm_area_struct *prev, struct rb_node *rb_parent)
222{
223 struct vm_area_struct *next;
224
225 vma->vm_prev = prev;
226 if (prev) {
227 next = prev->vm_next;
228 prev->vm_next = vma;
229 } else {
230 mm->mmap = vma;
231 if (rb_parent)
232 next = rb_entry(rb_parent,
233 struct vm_area_struct, vm_rb);
234 else
235 next = NULL;
236 }
237 vma->vm_next = next;
238 if (next)
239 next->vm_prev = vma;
240}
241
239#if defined(CONFIG_MMU) && !defined(HAVE_ARCH_PICK_MMAP_LAYOUT) 242#if defined(CONFIG_MMU) && !defined(HAVE_ARCH_PICK_MMAP_LAYOUT)
240void arch_pick_mmap_layout(struct mm_struct *mm) 243void arch_pick_mmap_layout(struct mm_struct *mm)
241{ 244{
@@ -245,6 +248,19 @@ void arch_pick_mmap_layout(struct mm_struct *mm)
245} 248}
246#endif 249#endif
247 250
251/*
252 * Like get_user_pages_fast() except its IRQ-safe in that it won't fall
253 * back to the regular GUP.
254 * If the architecture not support this function, simply return with no
255 * page pinned
256 */
257int __attribute__((weak)) __get_user_pages_fast(unsigned long start,
258 int nr_pages, int write, struct page **pages)
259{
260 return 0;
261}
262EXPORT_SYMBOL_GPL(__get_user_pages_fast);
263
248/** 264/**
249 * get_user_pages_fast() - pin user pages in memory 265 * get_user_pages_fast() - pin user pages in memory
250 * @start: starting user address 266 * @start: starting user address