1014bb1deSNeilBrown /* SPDX-License-Identifier: GPL-2.0 */ 2014bb1deSNeilBrown #ifndef _MM_SWAP_H 3014bb1deSNeilBrown #define _MM_SWAP_H 4014bb1deSNeilBrown 5014bb1deSNeilBrown #ifdef CONFIG_SWAP 6014bb1deSNeilBrown #include <linux/blk_types.h> /* for bio_end_io_t */ 7014bb1deSNeilBrown 8014bb1deSNeilBrown /* linux/mm/page_io.c */ 9e1209d3aSNeilBrown int sio_pool_init(void); 105169b844SNeilBrown struct swap_iocb; 115169b844SNeilBrown int swap_readpage(struct page *page, bool do_poll, 125169b844SNeilBrown struct swap_iocb **plug); 135169b844SNeilBrown void __swap_read_unplug(struct swap_iocb *plug); 145169b844SNeilBrown static inline void swap_read_unplug(struct swap_iocb *plug) 155169b844SNeilBrown { 165169b844SNeilBrown if (unlikely(plug)) 175169b844SNeilBrown __swap_read_unplug(plug); 185169b844SNeilBrown } 192282679fSNeilBrown void swap_write_unplug(struct swap_iocb *sio); 20014bb1deSNeilBrown int swap_writepage(struct page *page, struct writeback_control *wbc); 21cf1e3fe4SChristoph Hellwig int __swap_writepage(struct page *page, struct writeback_control *wbc); 22014bb1deSNeilBrown 23014bb1deSNeilBrown /* linux/mm/swap_state.c */ 24014bb1deSNeilBrown /* One swap address space for each 64M swap space */ 25014bb1deSNeilBrown #define SWAP_ADDRESS_SPACE_SHIFT 14 26014bb1deSNeilBrown #define SWAP_ADDRESS_SPACE_PAGES (1 << SWAP_ADDRESS_SPACE_SHIFT) 27014bb1deSNeilBrown extern struct address_space *swapper_spaces[]; 28014bb1deSNeilBrown #define swap_address_space(entry) \ 29014bb1deSNeilBrown (&swapper_spaces[swp_type(entry)][swp_offset(entry) \ 30014bb1deSNeilBrown >> SWAP_ADDRESS_SPACE_SHIFT]) 31014bb1deSNeilBrown 32014bb1deSNeilBrown void show_swap_cache_info(void); 3309c02e56SMatthew Wilcox (Oracle) bool add_to_swap(struct folio *folio); 34014bb1deSNeilBrown void *get_shadow_from_swap_cache(swp_entry_t entry); 35*a4c366f0SMatthew Wilcox (Oracle) int add_to_swap_cache(struct folio *folio, swp_entry_t entry, 36014bb1deSNeilBrown gfp_t gfp, void **shadowp); 37ceff9d33SMatthew Wilcox (Oracle) void __delete_from_swap_cache(struct folio *folio, 38014bb1deSNeilBrown swp_entry_t entry, void *shadow); 3975fa68a5SMatthew Wilcox (Oracle) void delete_from_swap_cache(struct folio *folio); 40014bb1deSNeilBrown void clear_shadow_from_swap_cache(int type, unsigned long begin, 41014bb1deSNeilBrown unsigned long end); 42014bb1deSNeilBrown struct page *lookup_swap_cache(swp_entry_t entry, 43014bb1deSNeilBrown struct vm_area_struct *vma, 44014bb1deSNeilBrown unsigned long addr); 45014bb1deSNeilBrown struct page *find_get_incore_page(struct address_space *mapping, pgoff_t index); 46014bb1deSNeilBrown 47014bb1deSNeilBrown struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask, 48014bb1deSNeilBrown struct vm_area_struct *vma, 49014bb1deSNeilBrown unsigned long addr, 505169b844SNeilBrown bool do_poll, 515169b844SNeilBrown struct swap_iocb **plug); 52014bb1deSNeilBrown struct page *__read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask, 53014bb1deSNeilBrown struct vm_area_struct *vma, 54014bb1deSNeilBrown unsigned long addr, 55014bb1deSNeilBrown bool *new_page_allocated); 56014bb1deSNeilBrown struct page *swap_cluster_readahead(swp_entry_t entry, gfp_t flag, 57014bb1deSNeilBrown struct vm_fault *vmf); 58014bb1deSNeilBrown struct page *swapin_readahead(swp_entry_t entry, gfp_t flag, 59014bb1deSNeilBrown struct vm_fault *vmf); 60014bb1deSNeilBrown 61b98c359fSMatthew Wilcox (Oracle) static inline unsigned int folio_swap_flags(struct folio *folio) 62d791ea67SNeilBrown { 63b98c359fSMatthew Wilcox (Oracle) return page_swap_info(&folio->page)->flags; 64d791ea67SNeilBrown } 65014bb1deSNeilBrown #else /* CONFIG_SWAP */ 665169b844SNeilBrown struct swap_iocb; 675169b844SNeilBrown static inline int swap_readpage(struct page *page, bool do_poll, 685169b844SNeilBrown struct swap_iocb **plug) 69014bb1deSNeilBrown { 70014bb1deSNeilBrown return 0; 71014bb1deSNeilBrown } 722282679fSNeilBrown static inline void swap_write_unplug(struct swap_iocb *sio) 732282679fSNeilBrown { 742282679fSNeilBrown } 75014bb1deSNeilBrown 76014bb1deSNeilBrown static inline struct address_space *swap_address_space(swp_entry_t entry) 77014bb1deSNeilBrown { 78014bb1deSNeilBrown return NULL; 79014bb1deSNeilBrown } 80014bb1deSNeilBrown 81014bb1deSNeilBrown static inline void show_swap_cache_info(void) 82014bb1deSNeilBrown { 83014bb1deSNeilBrown } 84014bb1deSNeilBrown 85014bb1deSNeilBrown static inline struct page *swap_cluster_readahead(swp_entry_t entry, 86014bb1deSNeilBrown gfp_t gfp_mask, struct vm_fault *vmf) 87014bb1deSNeilBrown { 88014bb1deSNeilBrown return NULL; 89014bb1deSNeilBrown } 90014bb1deSNeilBrown 91014bb1deSNeilBrown static inline struct page *swapin_readahead(swp_entry_t swp, gfp_t gfp_mask, 92014bb1deSNeilBrown struct vm_fault *vmf) 93014bb1deSNeilBrown { 94014bb1deSNeilBrown return NULL; 95014bb1deSNeilBrown } 96014bb1deSNeilBrown 97014bb1deSNeilBrown static inline int swap_writepage(struct page *p, struct writeback_control *wbc) 98014bb1deSNeilBrown { 99014bb1deSNeilBrown return 0; 100014bb1deSNeilBrown } 101014bb1deSNeilBrown 102014bb1deSNeilBrown static inline struct page *lookup_swap_cache(swp_entry_t swp, 103014bb1deSNeilBrown struct vm_area_struct *vma, 104014bb1deSNeilBrown unsigned long addr) 105014bb1deSNeilBrown { 106014bb1deSNeilBrown return NULL; 107014bb1deSNeilBrown } 108014bb1deSNeilBrown 109014bb1deSNeilBrown static inline 110014bb1deSNeilBrown struct page *find_get_incore_page(struct address_space *mapping, pgoff_t index) 111014bb1deSNeilBrown { 112014bb1deSNeilBrown return find_get_page(mapping, index); 113014bb1deSNeilBrown } 114014bb1deSNeilBrown 11509c02e56SMatthew Wilcox (Oracle) static inline bool add_to_swap(struct folio *folio) 116014bb1deSNeilBrown { 11709c02e56SMatthew Wilcox (Oracle) return false; 118014bb1deSNeilBrown } 119014bb1deSNeilBrown 120014bb1deSNeilBrown static inline void *get_shadow_from_swap_cache(swp_entry_t entry) 121014bb1deSNeilBrown { 122014bb1deSNeilBrown return NULL; 123014bb1deSNeilBrown } 124014bb1deSNeilBrown 125*a4c366f0SMatthew Wilcox (Oracle) static inline int add_to_swap_cache(struct folio *folio, swp_entry_t entry, 126014bb1deSNeilBrown gfp_t gfp_mask, void **shadowp) 127014bb1deSNeilBrown { 128014bb1deSNeilBrown return -1; 129014bb1deSNeilBrown } 130014bb1deSNeilBrown 131ceff9d33SMatthew Wilcox (Oracle) static inline void __delete_from_swap_cache(struct folio *folio, 132014bb1deSNeilBrown swp_entry_t entry, void *shadow) 133014bb1deSNeilBrown { 134014bb1deSNeilBrown } 135014bb1deSNeilBrown 13675fa68a5SMatthew Wilcox (Oracle) static inline void delete_from_swap_cache(struct folio *folio) 137014bb1deSNeilBrown { 138014bb1deSNeilBrown } 139014bb1deSNeilBrown 140014bb1deSNeilBrown static inline void clear_shadow_from_swap_cache(int type, unsigned long begin, 141014bb1deSNeilBrown unsigned long end) 142014bb1deSNeilBrown { 143014bb1deSNeilBrown } 144014bb1deSNeilBrown 145b98c359fSMatthew Wilcox (Oracle) static inline unsigned int folio_swap_flags(struct folio *folio) 146d791ea67SNeilBrown { 147d791ea67SNeilBrown return 0; 148d791ea67SNeilBrown } 149014bb1deSNeilBrown #endif /* CONFIG_SWAP */ 150014bb1deSNeilBrown #endif /* _MM_SWAP_H */ 151