mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 03:27:44 -04:00
SHM_LOCKED pages are unevictable
Shmem segments locked into memory via shmctl(SHM_LOCKED) should not be kept on the normal LRU, since scanning them is a waste of time and might throw off kswapd's balancing algorithms. Place them on the unevictable LRU list instead. Use the AS_UNEVICTABLE flag to mark address_space of SHM_LOCKed shared memory regions as unevictable. Then these pages will be culled off the normal LRU lists during vmscan. Add new wrapper function to clear the mapping's unevictable state when/if shared memory segment is munlocked. Add 'scan_mapping_unevictable_page()' to mm/vmscan.c to scan all pages in the shmem segment's mapping [struct address_space] for evictability now that they're no longer locked. If so, move them to the appropriate zone lru list. Changes depend on [CONFIG_]UNEVICTABLE_LRU. [[email protected]: revert shm change] Signed-off-by: Lee Schermerhorn <[email protected]> Signed-off-by: Rik van Riel <[email protected]> Signed-off-by: Kosaki Motohiro <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
ba9ddf4939
commit
89e004ea55
6 changed files with 112 additions and 5 deletions
|
|
@ -1477,12 +1477,16 @@ int shmem_lock(struct file *file, int lock, struct user_struct *user)
|
|||
if (!user_shm_lock(inode->i_size, user))
|
||||
goto out_nomem;
|
||||
info->flags |= VM_LOCKED;
|
||||
mapping_set_unevictable(file->f_mapping);
|
||||
}
|
||||
if (!lock && (info->flags & VM_LOCKED) && user) {
|
||||
user_shm_unlock(inode->i_size, user);
|
||||
info->flags &= ~VM_LOCKED;
|
||||
mapping_clear_unevictable(file->f_mapping);
|
||||
scan_mapping_unevictable_pages(file->f_mapping);
|
||||
}
|
||||
retval = 0;
|
||||
|
||||
out_nomem:
|
||||
spin_unlock(&info->lock);
|
||||
return retval;
|
||||
|
|
|
|||
Loading…
Reference in a new issue