1014bb1deSNeilBrown /* SPDX-License-Identifier: GPL-2.0 */ 2014bb1deSNeilBrown #ifndef _MM_SWAP_H 3014bb1deSNeilBrown #define _MM_SWAP_H 4014bb1deSNeilBrown 5ddc1a5cbSHugh Dickins struct mempolicy; 6ddc1a5cbSHugh Dickins 7014bb1deSNeilBrown #ifdef CONFIG_SWAP 8014bb1deSNeilBrown #include <linux/blk_types.h> /* for bio_end_io_t */ 9014bb1deSNeilBrown 10014bb1deSNeilBrown /* linux/mm/page_io.c */ 11e1209d3aSNeilBrown int sio_pool_init(void); 125169b844SNeilBrown struct swap_iocb; 13a8c1408fSChristoph Hellwig void swap_readpage(struct page *page, bool do_poll, struct swap_iocb **plug); 145169b844SNeilBrown void __swap_read_unplug(struct swap_iocb *plug); 155169b844SNeilBrown static inline void swap_read_unplug(struct swap_iocb *plug) 165169b844SNeilBrown { 175169b844SNeilBrown if (unlikely(plug)) 185169b844SNeilBrown __swap_read_unplug(plug); 195169b844SNeilBrown } 202282679fSNeilBrown void swap_write_unplug(struct swap_iocb *sio); 21014bb1deSNeilBrown int swap_writepage(struct page *page, struct writeback_control *wbc); 22e3e2762bSChristoph Hellwig void __swap_writepage(struct page *page, struct writeback_control *wbc); 23014bb1deSNeilBrown 24014bb1deSNeilBrown /* linux/mm/swap_state.c */ 25014bb1deSNeilBrown /* One swap address space for each 64M swap space */ 26014bb1deSNeilBrown #define SWAP_ADDRESS_SPACE_SHIFT 14 27014bb1deSNeilBrown #define SWAP_ADDRESS_SPACE_PAGES (1 << SWAP_ADDRESS_SPACE_SHIFT) 28014bb1deSNeilBrown extern struct address_space *swapper_spaces[]; 29014bb1deSNeilBrown #define swap_address_space(entry) \ 30014bb1deSNeilBrown (&swapper_spaces[swp_type(entry)][swp_offset(entry) \ 31014bb1deSNeilBrown >> SWAP_ADDRESS_SPACE_SHIFT]) 32014bb1deSNeilBrown 33014bb1deSNeilBrown void show_swap_cache_info(void); 3409c02e56SMatthew Wilcox (Oracle) bool add_to_swap(struct folio *folio); 35014bb1deSNeilBrown void *get_shadow_from_swap_cache(swp_entry_t entry); 36a4c366f0SMatthew Wilcox (Oracle) int add_to_swap_cache(struct folio *folio, swp_entry_t entry, 37014bb1deSNeilBrown gfp_t gfp, void **shadowp); 38ceff9d33SMatthew Wilcox (Oracle) void __delete_from_swap_cache(struct folio *folio, 39014bb1deSNeilBrown swp_entry_t entry, void *shadow); 4075fa68a5SMatthew Wilcox (Oracle) void delete_from_swap_cache(struct folio *folio); 41014bb1deSNeilBrown void clear_shadow_from_swap_cache(int type, unsigned long begin, 42014bb1deSNeilBrown unsigned long end); 43c9edc242SMatthew Wilcox (Oracle) struct folio *swap_cache_get_folio(swp_entry_t entry, 44c9edc242SMatthew Wilcox (Oracle) struct vm_area_struct *vma, unsigned long addr); 45524984ffSMatthew Wilcox (Oracle) struct folio *filemap_get_incore_folio(struct address_space *mapping, 46524984ffSMatthew Wilcox (Oracle) pgoff_t index); 47014bb1deSNeilBrown 48014bb1deSNeilBrown struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask, 49014bb1deSNeilBrown struct vm_area_struct *vma, 50014bb1deSNeilBrown unsigned long addr, 515169b844SNeilBrown struct swap_iocb **plug); 52*96c7b0b4SMatthew Wilcox (Oracle) struct folio *__read_swap_cache_async(swp_entry_t entry, gfp_t gfp_flags, 53*96c7b0b4SMatthew Wilcox (Oracle) struct mempolicy *mpol, pgoff_t ilx, bool *new_page_allocated, 54a65b0e76SDomenico Cerasuolo bool skip_if_exists); 55014bb1deSNeilBrown struct page *swap_cluster_readahead(swp_entry_t entry, gfp_t flag, 56ddc1a5cbSHugh Dickins struct mempolicy *mpol, pgoff_t ilx); 57014bb1deSNeilBrown struct page *swapin_readahead(swp_entry_t entry, gfp_t flag, 58014bb1deSNeilBrown struct vm_fault *vmf); 59014bb1deSNeilBrown 60b98c359fSMatthew Wilcox (Oracle) static inline unsigned int folio_swap_flags(struct folio *folio) 61d791ea67SNeilBrown { 62b98c359fSMatthew Wilcox (Oracle) return page_swap_info(&folio->page)->flags; 63d791ea67SNeilBrown } 64014bb1deSNeilBrown #else /* CONFIG_SWAP */ 655169b844SNeilBrown struct swap_iocb; 66a8c1408fSChristoph Hellwig static inline void swap_readpage(struct page *page, bool do_poll, 675169b844SNeilBrown struct swap_iocb **plug) 68014bb1deSNeilBrown { 69014bb1deSNeilBrown } 702282679fSNeilBrown static inline void swap_write_unplug(struct swap_iocb *sio) 712282679fSNeilBrown { 722282679fSNeilBrown } 73014bb1deSNeilBrown 74014bb1deSNeilBrown static inline struct address_space *swap_address_space(swp_entry_t entry) 75014bb1deSNeilBrown { 76014bb1deSNeilBrown return NULL; 77014bb1deSNeilBrown } 78014bb1deSNeilBrown 79014bb1deSNeilBrown static inline void show_swap_cache_info(void) 80014bb1deSNeilBrown { 81014bb1deSNeilBrown } 82014bb1deSNeilBrown 83014bb1deSNeilBrown static inline struct page *swap_cluster_readahead(swp_entry_t entry, 84ddc1a5cbSHugh Dickins gfp_t gfp_mask, struct mempolicy *mpol, pgoff_t ilx) 85014bb1deSNeilBrown { 86014bb1deSNeilBrown return NULL; 87014bb1deSNeilBrown } 88014bb1deSNeilBrown 89014bb1deSNeilBrown static inline struct page *swapin_readahead(swp_entry_t swp, gfp_t gfp_mask, 90014bb1deSNeilBrown struct vm_fault *vmf) 91014bb1deSNeilBrown { 92014bb1deSNeilBrown return NULL; 93014bb1deSNeilBrown } 94014bb1deSNeilBrown 95014bb1deSNeilBrown static inline int swap_writepage(struct page *p, struct writeback_control *wbc) 96014bb1deSNeilBrown { 97014bb1deSNeilBrown return 0; 98014bb1deSNeilBrown } 99014bb1deSNeilBrown 100c9edc242SMatthew Wilcox (Oracle) static inline struct folio *swap_cache_get_folio(swp_entry_t entry, 101c9edc242SMatthew Wilcox (Oracle) struct vm_area_struct *vma, unsigned long addr) 102c9edc242SMatthew Wilcox (Oracle) { 103c9edc242SMatthew Wilcox (Oracle) return NULL; 104c9edc242SMatthew Wilcox (Oracle) } 105c9edc242SMatthew Wilcox (Oracle) 106014bb1deSNeilBrown static inline 107524984ffSMatthew Wilcox (Oracle) struct folio *filemap_get_incore_folio(struct address_space *mapping, 108524984ffSMatthew Wilcox (Oracle) pgoff_t index) 109014bb1deSNeilBrown { 110524984ffSMatthew Wilcox (Oracle) return filemap_get_folio(mapping, index); 111014bb1deSNeilBrown } 112014bb1deSNeilBrown 11309c02e56SMatthew Wilcox (Oracle) static inline bool add_to_swap(struct folio *folio) 114014bb1deSNeilBrown { 11509c02e56SMatthew Wilcox (Oracle) return false; 116014bb1deSNeilBrown } 117014bb1deSNeilBrown 118014bb1deSNeilBrown static inline void *get_shadow_from_swap_cache(swp_entry_t entry) 119014bb1deSNeilBrown { 120014bb1deSNeilBrown return NULL; 121014bb1deSNeilBrown } 122014bb1deSNeilBrown 123a4c366f0SMatthew Wilcox (Oracle) static inline int add_to_swap_cache(struct folio *folio, swp_entry_t entry, 124014bb1deSNeilBrown gfp_t gfp_mask, void **shadowp) 125014bb1deSNeilBrown { 126014bb1deSNeilBrown return -1; 127014bb1deSNeilBrown } 128014bb1deSNeilBrown 129ceff9d33SMatthew Wilcox (Oracle) static inline void __delete_from_swap_cache(struct folio *folio, 130014bb1deSNeilBrown swp_entry_t entry, void *shadow) 131014bb1deSNeilBrown { 132014bb1deSNeilBrown } 133014bb1deSNeilBrown 13475fa68a5SMatthew Wilcox (Oracle) static inline void delete_from_swap_cache(struct folio *folio) 135014bb1deSNeilBrown { 136014bb1deSNeilBrown } 137014bb1deSNeilBrown 138014bb1deSNeilBrown static inline void clear_shadow_from_swap_cache(int type, unsigned long begin, 139014bb1deSNeilBrown unsigned long end) 140014bb1deSNeilBrown { 141014bb1deSNeilBrown } 142014bb1deSNeilBrown 143b98c359fSMatthew Wilcox (Oracle) static inline unsigned int folio_swap_flags(struct folio *folio) 144d791ea67SNeilBrown { 145d791ea67SNeilBrown return 0; 146d791ea67SNeilBrown } 147014bb1deSNeilBrown #endif /* CONFIG_SWAP */ 148014bb1deSNeilBrown #endif /* _MM_SWAP_H */ 149