Blame view
mm/vmacache.c
2.21 KB
b24413180 License cleanup: ... |
1 |
// SPDX-License-Identifier: GPL-2.0 |
615d6e875 mm: per-thread vm... |
2 3 4 |
/* * Copyright (C) 2014 Davidlohr Bueso. */ |
3f07c0144 sched/headers: Pr... |
5 |
#include <linux/sched/signal.h> |
9164bb4a1 sched/headers: Pr... |
6 |
#include <linux/sched/task.h> |
615d6e875 mm: per-thread vm... |
7 8 9 10 |
#include <linux/mm.h> #include <linux/vmacache.h> /* |
615d6e875 mm: per-thread vm... |
11 12 13 14 15 16 17 18 |
* This task may be accessing a foreign mm via (for example) * get_user_pages()->find_vma(). The vmacache is task-local and this * task's vmacache pertains to a different mm (ie, its own). There is * nothing we can do here. * * Also handle the case where a kernel thread has adopted this mm via use_mm(). * That kernel thread's vmacache is not applicable to this mm. */ |
a2c1aad3b mm/vmacache: inli... |
19 |
static inline bool vmacache_valid_mm(struct mm_struct *mm) |
615d6e875 mm: per-thread vm... |
20 21 22 23 24 25 26 |
{ return current->mm == mm && !(current->flags & PF_KTHREAD); } void vmacache_update(unsigned long addr, struct vm_area_struct *newvma) { if (vmacache_valid_mm(newvma->vm_mm)) |
314ff7851 mm/vmacache, sche... |
27 |
current->vmacache.vmas[VMACACHE_HASH(addr)] = newvma; |
615d6e875 mm: per-thread vm... |
28 29 30 31 32 33 34 35 36 37 |
} static bool vmacache_valid(struct mm_struct *mm) { struct task_struct *curr; if (!vmacache_valid_mm(mm)) return false; curr = current; |
314ff7851 mm/vmacache, sche... |
38 |
if (mm->vmacache_seqnum != curr->vmacache.seqnum) { |
615d6e875 mm: per-thread vm... |
39 40 41 42 |
/* * First attempt will always be invalid, initialize * the new cache for this task here. */ |
314ff7851 mm/vmacache, sche... |
43 |
curr->vmacache.seqnum = mm->vmacache_seqnum; |
615d6e875 mm: per-thread vm... |
44 45 46 47 48 49 50 51 52 |
vmacache_flush(curr); return false; } return true; } struct vm_area_struct *vmacache_find(struct mm_struct *mm, unsigned long addr) { int i; |
131ddc5c7 mm: unrig VMA cac... |
53 |
count_vm_vmacache_event(VMACACHE_FIND_CALLS); |
615d6e875 mm: per-thread vm... |
54 55 56 57 |
if (!vmacache_valid(mm)) return NULL; for (i = 0; i < VMACACHE_SIZE; i++) { |
314ff7851 mm/vmacache, sche... |
58 |
struct vm_area_struct *vma = current->vmacache.vmas[i]; |
615d6e875 mm: per-thread vm... |
59 |
|
50f5aa8a9 mm: don't pointle... |
60 61 62 63 |
if (!vma) continue; if (WARN_ON_ONCE(vma->vm_mm != mm)) break; |
4f115147f mm,vmacache: add ... |
64 65 |
if (vma->vm_start <= addr && vma->vm_end > addr) { count_vm_vmacache_event(VMACACHE_FIND_HITS); |
615d6e875 mm: per-thread vm... |
66 |
return vma; |
4f115147f mm,vmacache: add ... |
67 |
} |
615d6e875 mm: per-thread vm... |
68 69 70 71 72 73 74 75 76 77 78 |
} return NULL; } #ifndef CONFIG_MMU struct vm_area_struct *vmacache_find_exact(struct mm_struct *mm, unsigned long start, unsigned long end) { int i; |
131ddc5c7 mm: unrig VMA cac... |
79 |
count_vm_vmacache_event(VMACACHE_FIND_CALLS); |
615d6e875 mm: per-thread vm... |
80 81 82 83 |
if (!vmacache_valid(mm)) return NULL; for (i = 0; i < VMACACHE_SIZE; i++) { |
314ff7851 mm/vmacache, sche... |
84 |
struct vm_area_struct *vma = current->vmacache.vmas[i]; |
615d6e875 mm: per-thread vm... |
85 |
|
4f115147f mm,vmacache: add ... |
86 87 |
if (vma && vma->vm_start == start && vma->vm_end == end) { count_vm_vmacache_event(VMACACHE_FIND_HITS); |
615d6e875 mm: per-thread vm... |
88 |
return vma; |
4f115147f mm,vmacache: add ... |
89 |
} |
615d6e875 mm: per-thread vm... |
90 91 92 93 94 |
} return NULL; } #endif |