ANDROID: mm: remove sequence counting when mmap_lock is not exclusively owned
In a number of cases vm_write_{begin|end} is called while mmap_lock is
not owned exclusively. This is unnecessary and can affect correctness of
the sequence counting protecting speculative page fault handlers. Remove
extra calls.
Bug: 257443051
Change-Id: I1278638a0794448e22fbdab5601212b3b2eaebdc
Signed-off-by: Suren Baghdasaryan <surenb@google.com>
This commit is contained in:
parent
5ed391bd8a
commit
bfdcf47ca3
3 changed files with 0 additions and 10 deletions
|
|
@ -506,11 +506,9 @@ static void madvise_cold_page_range(struct mmu_gather *tlb,
|
||||||
.tlb = tlb,
|
.tlb = tlb,
|
||||||
};
|
};
|
||||||
|
|
||||||
vm_write_begin(vma);
|
|
||||||
tlb_start_vma(tlb, vma);
|
tlb_start_vma(tlb, vma);
|
||||||
walk_page_range(vma->vm_mm, addr, end, &cold_walk_ops, &walk_private);
|
walk_page_range(vma->vm_mm, addr, end, &cold_walk_ops, &walk_private);
|
||||||
tlb_end_vma(tlb, vma);
|
tlb_end_vma(tlb, vma);
|
||||||
vm_write_end(vma);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static long madvise_cold(struct vm_area_struct *vma,
|
static long madvise_cold(struct vm_area_struct *vma,
|
||||||
|
|
@ -543,11 +541,9 @@ static void madvise_pageout_page_range(struct mmu_gather *tlb,
|
||||||
.can_pageout_file = can_pageout_file,
|
.can_pageout_file = can_pageout_file,
|
||||||
};
|
};
|
||||||
|
|
||||||
vm_write_begin(vma);
|
|
||||||
tlb_start_vma(tlb, vma);
|
tlb_start_vma(tlb, vma);
|
||||||
walk_page_range(vma->vm_mm, addr, end, &cold_walk_ops, &walk_private);
|
walk_page_range(vma->vm_mm, addr, end, &cold_walk_ops, &walk_private);
|
||||||
tlb_end_vma(tlb, vma);
|
tlb_end_vma(tlb, vma);
|
||||||
vm_write_end(vma);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool can_do_file_pageout(struct vm_area_struct *vma)
|
static inline bool can_do_file_pageout(struct vm_area_struct *vma)
|
||||||
|
|
@ -754,12 +750,10 @@ static int madvise_free_single_vma(struct vm_area_struct *vma,
|
||||||
update_hiwater_rss(mm);
|
update_hiwater_rss(mm);
|
||||||
|
|
||||||
mmu_notifier_invalidate_range_start(&range);
|
mmu_notifier_invalidate_range_start(&range);
|
||||||
vm_write_begin(vma);
|
|
||||||
tlb_start_vma(&tlb, vma);
|
tlb_start_vma(&tlb, vma);
|
||||||
walk_page_range(vma->vm_mm, range.start, range.end,
|
walk_page_range(vma->vm_mm, range.start, range.end,
|
||||||
&madvise_free_walk_ops, &tlb);
|
&madvise_free_walk_ops, &tlb);
|
||||||
tlb_end_vma(&tlb, vma);
|
tlb_end_vma(&tlb, vma);
|
||||||
vm_write_end(vma);
|
|
||||||
mmu_notifier_invalidate_range_end(&range);
|
mmu_notifier_invalidate_range_end(&range);
|
||||||
tlb_finish_mmu(&tlb, range.start, range.end);
|
tlb_finish_mmu(&tlb, range.start, range.end);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1495,7 +1495,6 @@ void unmap_page_range(struct mmu_gather *tlb,
|
||||||
unsigned long next;
|
unsigned long next;
|
||||||
|
|
||||||
BUG_ON(addr >= end);
|
BUG_ON(addr >= end);
|
||||||
vm_write_begin(vma);
|
|
||||||
tlb_start_vma(tlb, vma);
|
tlb_start_vma(tlb, vma);
|
||||||
pgd = pgd_offset(vma->vm_mm, addr);
|
pgd = pgd_offset(vma->vm_mm, addr);
|
||||||
do {
|
do {
|
||||||
|
|
@ -1505,7 +1504,6 @@ void unmap_page_range(struct mmu_gather *tlb,
|
||||||
next = zap_p4d_range(tlb, vma, pgd, addr, next, details);
|
next = zap_p4d_range(tlb, vma, pgd, addr, next, details);
|
||||||
} while (pgd++, addr = next, addr != end);
|
} while (pgd++, addr = next, addr != end);
|
||||||
tlb_end_vma(tlb, vma);
|
tlb_end_vma(tlb, vma);
|
||||||
vm_write_end(vma);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -657,11 +657,9 @@ unsigned long change_prot_numa(struct vm_area_struct *vma,
|
||||||
{
|
{
|
||||||
int nr_updated;
|
int nr_updated;
|
||||||
|
|
||||||
vm_write_begin(vma);
|
|
||||||
nr_updated = change_protection(vma, addr, end, PAGE_NONE, MM_CP_PROT_NUMA);
|
nr_updated = change_protection(vma, addr, end, PAGE_NONE, MM_CP_PROT_NUMA);
|
||||||
if (nr_updated)
|
if (nr_updated)
|
||||||
count_vm_numa_events(NUMA_PTE_UPDATES, nr_updated);
|
count_vm_numa_events(NUMA_PTE_UPDATES, nr_updated);
|
||||||
vm_write_end(vma);
|
|
||||||
|
|
||||||
return nr_updated;
|
return nr_updated;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue