Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

zswap: make zswap_load() take a folio

Only convert a few easy parts of this function to use the folio passed in;
convert back to struct page for the majority of it. Removes three hidden
calls to compound_head().

Link: https://lkml.kernel.org/r/20230715042343.434588-6-willy@infradead.org
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Domenico Cerasuolo <cerasuolodomenico@gmail.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Nhat Pham <nphamcs@gmail.com>
Cc: Vitaly Wool <vitaly.wool@konsulko.com>
Cc: Yosry Ahmed <yosryahmed@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

Matthew Wilcox (Oracle) and committed by
Andrew Morton
ca54f6d8 fbcec6a3

+8 -7
+2 -2
include/linux/zswap.h
··· 11 11 #ifdef CONFIG_ZSWAP 12 12 13 13 bool zswap_store(struct folio *folio); 14 - bool zswap_load(struct page *page); 14 + bool zswap_load(struct folio *folio); 15 15 void zswap_invalidate(int type, pgoff_t offset); 16 16 void zswap_swapon(int type); 17 17 void zswap_swapoff(int type); ··· 23 23 return false; 24 24 } 25 25 26 - static inline bool zswap_load(struct page *page) 26 + static inline bool zswap_load(struct folio *folio) 27 27 { 28 28 return false; 29 29 }
+1 -1
mm/page_io.c
··· 513 513 } 514 514 delayacct_swapin_start(); 515 515 516 - if (zswap_load(page)) { 516 + if (zswap_load(folio)) { 517 517 folio_mark_uptodate(folio); 518 518 folio_unlock(folio); 519 519 } else if (data_race(sis->flags & SWP_FS_OPS)) {
+5 -4
mm/zswap.c
··· 1405 1405 goto reject; 1406 1406 } 1407 1407 1408 - bool zswap_load(struct page *page) 1408 + bool zswap_load(struct folio *folio) 1409 1409 { 1410 - swp_entry_t swp = { .val = page_private(page), }; 1410 + swp_entry_t swp = folio_swap_entry(folio); 1411 1411 int type = swp_type(swp); 1412 1412 pgoff_t offset = swp_offset(swp); 1413 + struct page *page = &folio->page; 1413 1414 struct zswap_tree *tree = zswap_trees[type]; 1414 1415 struct zswap_entry *entry; 1415 1416 struct scatterlist input, output; ··· 1420 1419 unsigned int dlen; 1421 1420 bool ret; 1422 1421 1423 - VM_WARN_ON_ONCE(!PageLocked(page)); 1422 + VM_WARN_ON_ONCE(!folio_test_locked(folio)); 1424 1423 1425 1424 /* find */ 1426 1425 spin_lock(&tree->lock); ··· 1482 1481 spin_lock(&tree->lock); 1483 1482 if (ret && zswap_exclusive_loads_enabled) { 1484 1483 zswap_invalidate_entry(tree, entry); 1485 - SetPageDirty(page); 1484 + folio_mark_dirty(folio); 1486 1485 } else if (entry->length) { 1487 1486 spin_lock(&entry->pool->lru_lock); 1488 1487 list_move(&entry->lru, &entry->pool->lru);