mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-05 19:31:57 -04:00
Revert "mm: protect mm_rb tree with a rwlock"
This reverts commit 9db216b5c9.
Bug: 128240262
Change-Id: I210789054d394b929de6d9444040f1d2aac14917
Signed-off-by: Minchan Kim <minchan@google.com>
[dereference23: Forward port to msm-5.4]
Signed-off-by: Alexander Winkowski <dereference23@outlook.com>
This commit is contained in:
parent
c0e5f947b4
commit
fa0483bf62
6 changed files with 28 additions and 103 deletions
|
|
@ -623,7 +623,6 @@ static inline void INIT_VMA(struct vm_area_struct *vma)
|
|||
INIT_LIST_HEAD(&vma->anon_vma_chain);
|
||||
#ifdef CONFIG_SPECULATIVE_PAGE_FAULT
|
||||
seqcount_init(&vma->vm_sequence);
|
||||
atomic_set(&vma->vm_ref_count, 1);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -364,7 +364,6 @@ struct vm_area_struct {
|
|||
struct vm_userfaultfd_ctx vm_userfaultfd_ctx;
|
||||
#ifdef CONFIG_SPECULATIVE_PAGE_FAULT
|
||||
seqcount_t vm_sequence;
|
||||
atomic_t vm_ref_count; /* see vma_get(), vma_put() */
|
||||
#endif
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
|
|
@ -390,9 +389,6 @@ struct mm_struct {
|
|||
struct vm_area_struct *mmap; /* list of VMAs */
|
||||
struct rb_root mm_rb;
|
||||
u64 vmacache_seqnum; /* per-thread vmacache */
|
||||
#ifdef CONFIG_SPECULATIVE_PAGE_FAULT
|
||||
rwlock_t mm_rb_lock;
|
||||
#endif
|
||||
#ifdef CONFIG_MMU
|
||||
unsigned long (*get_unmapped_area) (struct file *filp,
|
||||
unsigned long addr, unsigned long len,
|
||||
|
|
|
|||
|
|
@ -1036,9 +1036,6 @@ static struct mm_struct *mm_init(struct mm_struct *mm, struct task_struct *p,
|
|||
mm->mmap = NULL;
|
||||
mm->mm_rb = RB_ROOT;
|
||||
mm->vmacache_seqnum = 0;
|
||||
#ifdef CONFIG_SPECULATIVE_PAGE_FAULT
|
||||
rwlock_init(&mm->mm_rb_lock);
|
||||
#endif
|
||||
atomic_set(&mm->mm_users, 1);
|
||||
atomic_set(&mm->mm_count, 1);
|
||||
init_rwsem(&mm->mmap_sem);
|
||||
|
|
|
|||
|
|
@ -28,9 +28,6 @@
|
|||
*/
|
||||
struct mm_struct init_mm = {
|
||||
.mm_rb = RB_ROOT,
|
||||
#ifdef CONFIG_SPECULATIVE_PAGE_FAULT
|
||||
.mm_rb_lock = __RW_LOCK_UNLOCKED(init_mm.mm_rb_lock),
|
||||
#endif
|
||||
.pgd = swapper_pg_dir,
|
||||
.mm_users = ATOMIC_INIT(2),
|
||||
.mm_count = ATOMIC_INIT(1),
|
||||
|
|
|
|||
|
|
@ -36,12 +36,6 @@ void page_writeback_init(void);
|
|||
|
||||
vm_fault_t do_swap_page(struct vm_fault *vmf);
|
||||
|
||||
#ifdef CONFIG_SPECULATIVE_PAGE_FAULT
|
||||
extern struct vm_area_struct *get_vma(struct mm_struct *mm,
|
||||
unsigned long addr);
|
||||
extern void put_vma(struct vm_area_struct *vma);
|
||||
#endif
|
||||
|
||||
void free_pgtables(struct mmu_gather *tlb, struct vm_area_struct *start_vma,
|
||||
unsigned long floor, unsigned long ceiling);
|
||||
|
||||
|
|
|
|||
114
mm/mmap.c
114
mm/mmap.c
|
|
@ -166,27 +166,6 @@ void unlink_file_vma(struct vm_area_struct *vma)
|
|||
}
|
||||
}
|
||||
|
||||
static void __free_vma(struct vm_area_struct *vma)
|
||||
{
|
||||
if (vma->vm_file)
|
||||
fput(vma->vm_file);
|
||||
mpol_put(vma_policy(vma));
|
||||
vm_area_free(vma);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SPECULATIVE_PAGE_FAULT
|
||||
void put_vma(struct vm_area_struct *vma)
|
||||
{
|
||||
if (atomic_dec_and_test(&vma->vm_ref_count))
|
||||
__free_vma(vma);
|
||||
}
|
||||
#else
|
||||
static inline void put_vma(struct vm_area_struct *vma)
|
||||
{
|
||||
__free_vma(vma);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Close a vm structure and free it, returning the next.
|
||||
*/
|
||||
|
|
@ -197,7 +176,10 @@ static struct vm_area_struct *remove_vma(struct vm_area_struct *vma)
|
|||
might_sleep();
|
||||
if (vma->vm_ops && vma->vm_ops->close)
|
||||
vma->vm_ops->close(vma);
|
||||
put_vma(vma);
|
||||
if (vma->vm_file)
|
||||
fput(vma->vm_file);
|
||||
mpol_put(vma_policy(vma));
|
||||
vm_area_free(vma);
|
||||
return next;
|
||||
}
|
||||
|
||||
|
|
@ -450,13 +432,6 @@ static void validate_mm(struct mm_struct *mm)
|
|||
RB_DECLARE_CALLBACKS_MAX(static, vma_gap_callbacks,
|
||||
struct vm_area_struct, vm_rb,
|
||||
unsigned long, rb_subtree_gap, vma_compute_gap)
|
||||
#ifdef CONFIG_SPECULATIVE_PAGE_FAULT
|
||||
#define mm_rb_write_lock(mm) write_lock(&(mm)->mm_rb_lock)
|
||||
#define mm_rb_write_unlock(mm) write_unlock(&(mm)->mm_rb_lock)
|
||||
#else
|
||||
#define mm_rb_write_lock(mm) do { } while (0)
|
||||
#define mm_rb_write_unlock(mm) do { } while (0)
|
||||
#endif /* CONFIG_SPECULATIVE_PAGE_FAULT */
|
||||
|
||||
/*
|
||||
* Update augmented rbtree rb_subtree_gap values after vma->vm_start or
|
||||
|
|
@ -473,37 +448,26 @@ static void vma_gap_update(struct vm_area_struct *vma)
|
|||
}
|
||||
|
||||
static inline void vma_rb_insert(struct vm_area_struct *vma,
|
||||
struct mm_struct *mm)
|
||||
struct rb_root *root)
|
||||
{
|
||||
struct rb_root *root = &mm->mm_rb;
|
||||
|
||||
/* All rb_subtree_gap values must be consistent prior to insertion */
|
||||
validate_mm_rb(root, NULL);
|
||||
|
||||
rb_insert_augmented(&vma->vm_rb, root, &vma_gap_callbacks);
|
||||
}
|
||||
|
||||
static void __vma_rb_erase(struct vm_area_struct *vma, struct mm_struct *mm)
|
||||
static void __vma_rb_erase(struct vm_area_struct *vma, struct rb_root *root)
|
||||
{
|
||||
struct rb_root *root = &mm->mm_rb;
|
||||
/*
|
||||
* Note rb_erase_augmented is a fairly large inline function,
|
||||
* so make sure we instantiate it only once with our desired
|
||||
* augmented rbtree callbacks.
|
||||
*/
|
||||
mm_rb_write_lock(mm);
|
||||
rb_erase_augmented(&vma->vm_rb, root, &vma_gap_callbacks);
|
||||
mm_rb_write_unlock(mm); /* wmb */
|
||||
|
||||
/*
|
||||
* Ensure the removal is complete before clearing the node.
|
||||
* Matched by vma_has_changed()/handle_speculative_fault().
|
||||
*/
|
||||
RB_CLEAR_NODE(&vma->vm_rb);
|
||||
}
|
||||
|
||||
static __always_inline void vma_rb_erase_ignore(struct vm_area_struct *vma,
|
||||
struct mm_struct *mm,
|
||||
struct rb_root *root,
|
||||
struct vm_area_struct *ignore)
|
||||
{
|
||||
/*
|
||||
|
|
@ -511,21 +475,21 @@ static __always_inline void vma_rb_erase_ignore(struct vm_area_struct *vma,
|
|||
* with the possible exception of the "next" vma being erased if
|
||||
* next->vm_start was reduced.
|
||||
*/
|
||||
validate_mm_rb(&mm->mm_rb, ignore);
|
||||
validate_mm_rb(root, ignore);
|
||||
|
||||
__vma_rb_erase(vma, mm);
|
||||
__vma_rb_erase(vma, root);
|
||||
}
|
||||
|
||||
static __always_inline void vma_rb_erase(struct vm_area_struct *vma,
|
||||
struct mm_struct *mm)
|
||||
struct rb_root *root)
|
||||
{
|
||||
/*
|
||||
* All rb_subtree_gap values must be consistent prior to erase,
|
||||
* with the possible exception of the vma being erased.
|
||||
*/
|
||||
validate_mm_rb(&mm->mm_rb, vma);
|
||||
validate_mm_rb(root, vma);
|
||||
|
||||
__vma_rb_erase(vma, mm);
|
||||
__vma_rb_erase(vma, root);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -640,12 +604,10 @@ void __vma_link_rb(struct mm_struct *mm, struct vm_area_struct *vma,
|
|||
* immediately update the gap to the correct value. Finally we
|
||||
* rebalance the rbtree after all augmented values have been set.
|
||||
*/
|
||||
mm_rb_write_lock(mm);
|
||||
rb_link_node(&vma->vm_rb, rb_parent, rb_link);
|
||||
vma->rb_subtree_gap = 0;
|
||||
vma_gap_update(vma);
|
||||
vma_rb_insert(vma, mm);
|
||||
mm_rb_write_unlock(mm);
|
||||
vma_rb_insert(vma, &mm->mm_rb);
|
||||
}
|
||||
|
||||
static void __vma_link_file(struct vm_area_struct *vma)
|
||||
|
|
@ -721,7 +683,7 @@ static __always_inline void __vma_unlink_common(struct mm_struct *mm,
|
|||
{
|
||||
struct vm_area_struct *next;
|
||||
|
||||
vma_rb_erase_ignore(vma, mm, ignore);
|
||||
vma_rb_erase_ignore(vma, &mm->mm_rb, ignore);
|
||||
next = vma->vm_next;
|
||||
if (has_prev)
|
||||
prev->vm_next = next;
|
||||
|
|
@ -998,13 +960,16 @@ again:
|
|||
}
|
||||
|
||||
if (remove_next) {
|
||||
if (file)
|
||||
if (file) {
|
||||
uprobe_munmap(next, next->vm_start, next->vm_end);
|
||||
fput(file);
|
||||
}
|
||||
if (next->anon_vma)
|
||||
anon_vma_merge(vma, next);
|
||||
mm->map_count--;
|
||||
mpol_put(vma_policy(next));
|
||||
vm_raw_write_end(next);
|
||||
put_vma(next);
|
||||
vm_area_free(next);
|
||||
/*
|
||||
* In mprotect's case 6 (see comments on vma_merge),
|
||||
* we must remove another next too. It would clutter
|
||||
|
|
@ -2319,11 +2284,15 @@ get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,
|
|||
EXPORT_SYMBOL(get_unmapped_area);
|
||||
|
||||
/* Look up the first VMA which satisfies addr < vm_end, NULL if none. */
|
||||
static struct vm_area_struct *__find_vma(struct mm_struct *mm,
|
||||
unsigned long addr)
|
||||
struct vm_area_struct *find_vma(struct mm_struct *mm, unsigned long addr)
|
||||
{
|
||||
struct rb_node *rb_node;
|
||||
struct vm_area_struct *vma = NULL;
|
||||
struct vm_area_struct *vma;
|
||||
|
||||
/* Check the cache first. */
|
||||
vma = vmacache_find(mm, addr);
|
||||
if (likely(vma))
|
||||
return vma;
|
||||
|
||||
rb_node = mm->mm_rb.rb_node;
|
||||
|
||||
|
|
@ -2341,40 +2310,13 @@ static struct vm_area_struct *__find_vma(struct mm_struct *mm,
|
|||
rb_node = rb_node->rb_right;
|
||||
}
|
||||
|
||||
return vma;
|
||||
}
|
||||
|
||||
struct vm_area_struct *find_vma(struct mm_struct *mm, unsigned long addr)
|
||||
{
|
||||
struct vm_area_struct *vma;
|
||||
|
||||
/* Check the cache first. */
|
||||
vma = vmacache_find(mm, addr);
|
||||
if (likely(vma))
|
||||
return vma;
|
||||
|
||||
vma = __find_vma(mm, addr);
|
||||
if (vma)
|
||||
vmacache_update(addr, vma);
|
||||
return vma;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(find_vma);
|
||||
|
||||
#ifdef CONFIG_SPECULATIVE_PAGE_FAULT
|
||||
struct vm_area_struct *get_vma(struct mm_struct *mm, unsigned long addr)
|
||||
{
|
||||
struct vm_area_struct *vma = NULL;
|
||||
|
||||
read_lock(&mm->mm_rb_lock);
|
||||
vma = __find_vma(mm, addr);
|
||||
if (vma)
|
||||
atomic_inc(&vma->vm_ref_count);
|
||||
read_unlock(&mm->mm_rb_lock);
|
||||
|
||||
return vma;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Same as find_vma, but also return a pointer to the previous VMA in *pprev.
|
||||
*/
|
||||
|
|
@ -2759,7 +2701,7 @@ detach_vmas_to_be_unmapped(struct mm_struct *mm, struct vm_area_struct *vma,
|
|||
insertion_point = (prev ? &prev->vm_next : &mm->mmap);
|
||||
vma->vm_prev = NULL;
|
||||
do {
|
||||
vma_rb_erase(vma, mm);
|
||||
vma_rb_erase(vma, &mm->mm_rb);
|
||||
mm->map_count--;
|
||||
tail_vma = vma;
|
||||
vma = vma->vm_next;
|
||||
|
|
|
|||
Loading…
Reference in a new issue