ANDROID: vendor_hook: Add hook to not be stuck ro rmap lock in kswapd or direct_reclaim
Add hooks to support trylock in rmaplock when reclaiming in kswapd or direct_reclaim, in order to avoid wait lock for a long time. - android_vh_handle_failed_page_trylock - android_vh_page_trylock_set - android_vh_page_trylock_clear - android_vh_page_trylock_get_result - android_vh_do_page_trylock Bug: 240003372 Signed-off-by: Peifeng Li <lipeifeng@oppo.com> Change-Id: I0f605b35ae41f15b3ca7bc72cd5f003175c318a5
This commit is contained in:
20
mm/rmap.c
20
mm/rmap.c
@@ -525,6 +525,7 @@ struct anon_vma *page_lock_anon_vma_read(struct page *page)
|
||||
struct anon_vma *anon_vma = NULL;
|
||||
struct anon_vma *root_anon_vma;
|
||||
unsigned long anon_mapping;
|
||||
bool success = false;
|
||||
|
||||
rcu_read_lock();
|
||||
anon_mapping = (unsigned long)READ_ONCE(page->mapping);
|
||||
@@ -547,7 +548,11 @@ struct anon_vma *page_lock_anon_vma_read(struct page *page)
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
|
||||
trace_android_vh_do_page_trylock(page, NULL, NULL, &success);
|
||||
if (success) {
|
||||
anon_vma = NULL;
|
||||
goto out;
|
||||
}
|
||||
/* trylock failed, we got to sleep */
|
||||
if (!atomic_inc_not_zero(&anon_vma->refcount)) {
|
||||
anon_vma = NULL;
|
||||
@@ -1981,6 +1986,7 @@ static void rmap_walk_file(struct page *page, struct rmap_walk_control *rwc,
|
||||
struct address_space *mapping = page_mapping(page);
|
||||
pgoff_t pgoff_start, pgoff_end;
|
||||
struct vm_area_struct *vma;
|
||||
bool got_lock = false, success = false;
|
||||
|
||||
/*
|
||||
* The page lock not only makes sure that page->mapping cannot
|
||||
@@ -1995,8 +2001,16 @@ static void rmap_walk_file(struct page *page, struct rmap_walk_control *rwc,
|
||||
|
||||
pgoff_start = page_to_pgoff(page);
|
||||
pgoff_end = pgoff_start + thp_nr_pages(page) - 1;
|
||||
if (!locked)
|
||||
i_mmap_lock_read(mapping);
|
||||
if (!locked) {
|
||||
trace_android_vh_do_page_trylock(page,
|
||||
&mapping->i_mmap_rwsem, &got_lock, &success);
|
||||
if (success) {
|
||||
if (!got_lock)
|
||||
return;
|
||||
} else {
|
||||
i_mmap_lock_read(mapping);
|
||||
}
|
||||
}
|
||||
vma_interval_tree_foreach(vma, &mapping->i_mmap,
|
||||
pgoff_start, pgoff_end) {
|
||||
unsigned long address = vma_address(page, vma);
|
||||
|
Reference in New Issue
Block a user