forked from Minki/linux
mm/shmem: use a folio in shmem_unused_huge_shrink
When calling split_huge_page() we usually have to find the precise page, but that's not necessary here because we only need to unlock and put the folio afterwards. Saves 231 bytes of text (20% of this function). Link: https://lkml.kernel.org/r/20220504182857.4013401-17-willy@infradead.org Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
c28a0e9695
commit
0562457186
23
mm/shmem.c
23
mm/shmem.c
@ -554,7 +554,7 @@ static unsigned long shmem_unused_huge_shrink(struct shmem_sb_info *sbinfo,
|
||||
LIST_HEAD(to_remove);
|
||||
struct inode *inode;
|
||||
struct shmem_inode_info *info;
|
||||
struct page *page;
|
||||
struct folio *folio;
|
||||
unsigned long batch = sc ? sc->nr_to_scan : 128;
|
||||
int split = 0;
|
||||
|
||||
@ -598,6 +598,7 @@ next:
|
||||
|
||||
list_for_each_safe(pos, next, &list) {
|
||||
int ret;
|
||||
pgoff_t index;
|
||||
|
||||
info = list_entry(pos, struct shmem_inode_info, shrinklist);
|
||||
inode = &info->vfs_inode;
|
||||
@ -605,14 +606,14 @@ next:
|
||||
if (nr_to_split && split >= nr_to_split)
|
||||
goto move_back;
|
||||
|
||||
page = find_get_page(inode->i_mapping,
|
||||
(inode->i_size & HPAGE_PMD_MASK) >> PAGE_SHIFT);
|
||||
if (!page)
|
||||
index = (inode->i_size & HPAGE_PMD_MASK) >> PAGE_SHIFT;
|
||||
folio = filemap_get_folio(inode->i_mapping, index);
|
||||
if (!folio)
|
||||
goto drop;
|
||||
|
||||
/* No huge page at the end of the file: nothing to split */
|
||||
if (!PageTransHuge(page)) {
|
||||
put_page(page);
|
||||
if (!folio_test_large(folio)) {
|
||||
folio_put(folio);
|
||||
goto drop;
|
||||
}
|
||||
|
||||
@ -623,14 +624,14 @@ next:
|
||||
* Waiting for the lock may lead to deadlock in the
|
||||
* reclaim path.
|
||||
*/
|
||||
if (!trylock_page(page)) {
|
||||
put_page(page);
|
||||
if (!folio_trylock(folio)) {
|
||||
folio_put(folio);
|
||||
goto move_back;
|
||||
}
|
||||
|
||||
ret = split_huge_page(page);
|
||||
unlock_page(page);
|
||||
put_page(page);
|
||||
ret = split_huge_page(&folio->page);
|
||||
folio_unlock(folio);
|
||||
folio_put(folio);
|
||||
|
||||
/* If split failed move the inode on the list back to shrinklist */
|
||||
if (ret)
|
||||
|
Loading…
Reference in New Issue
Block a user