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); 21014bb1deSNeilBrown void end_swap_bio_write(struct bio *bio); 22014bb1deSNeilBrown int __swap_writepage(struct page *page, struct writeback_control *wbc, 23014bb1deSNeilBrown bio_end_io_t end_write_func); 24014bb1deSNeilBrown 25014bb1deSNeilBrown /* linux/mm/swap_state.c */ 26014bb1deSNeilBrown /* One swap address space for each 64M swap space */ 27014bb1deSNeilBrown #define SWAP_ADDRESS_SPACE_SHIFT 14 28014bb1deSNeilBrown #define SWAP_ADDRESS_SPACE_PAGES (1 << SWAP_ADDRESS_SPACE_SHIFT) 29014bb1deSNeilBrown extern struct address_space *swapper_spaces[]; 30014bb1deSNeilBrown #define swap_address_space(entry) \ 31014bb1deSNeilBrown (&swapper_spaces[swp_type(entry)][swp_offset(entry) \ 32014bb1deSNeilBrown >> SWAP_ADDRESS_SPACE_SHIFT]) 33014bb1deSNeilBrown 34014bb1deSNeilBrown void show_swap_cache_info(void); 3509c02e56SMatthew Wilcox (Oracle) bool add_to_swap(struct folio *folio); 36014bb1deSNeilBrown void *get_shadow_from_swap_cache(swp_entry_t entry); 37014bb1deSNeilBrown int add_to_swap_cache(struct page *page, swp_entry_t entry, 38014bb1deSNeilBrown gfp_t gfp, void **shadowp); 39014bb1deSNeilBrown void __delete_from_swap_cache(struct page *page, 40014bb1deSNeilBrown swp_entry_t entry, void *shadow); 41014bb1deSNeilBrown void delete_from_swap_cache(struct page *page); 42014bb1deSNeilBrown void clear_shadow_from_swap_cache(int type, unsigned long begin, 43014bb1deSNeilBrown unsigned long end); 44014bb1deSNeilBrown void free_swap_cache(struct page *page); 45014bb1deSNeilBrown struct page *lookup_swap_cache(swp_entry_t entry, 46014bb1deSNeilBrown struct vm_area_struct *vma, 47014bb1deSNeilBrown unsigned long addr); 48014bb1deSNeilBrown struct page *find_get_incore_page(struct address_space *mapping, pgoff_t index); 49014bb1deSNeilBrown 50014bb1deSNeilBrown struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask, 51014bb1deSNeilBrown struct vm_area_struct *vma, 52014bb1deSNeilBrown unsigned long addr, 535169b844SNeilBrown bool do_poll, 545169b844SNeilBrown struct swap_iocb **plug); 55014bb1deSNeilBrown struct page *__read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask, 56014bb1deSNeilBrown struct vm_area_struct *vma, 57014bb1deSNeilBrown unsigned long addr, 58014bb1deSNeilBrown bool *new_page_allocated); 59014bb1deSNeilBrown struct page *swap_cluster_readahead(swp_entry_t entry, gfp_t flag, 60014bb1deSNeilBrown struct vm_fault *vmf); 61014bb1deSNeilBrown struct page *swapin_readahead(swp_entry_t entry, gfp_t flag, 62014bb1deSNeilBrown struct vm_fault *vmf); 63014bb1deSNeilBrown 64*b98c359fSMatthew Wilcox (Oracle) static inline unsigned int folio_swap_flags(struct folio *folio) 65d791ea67SNeilBrown { 66*b98c359fSMatthew Wilcox (Oracle) return page_swap_info(&folio->page)->flags; 67d791ea67SNeilBrown } 68014bb1deSNeilBrown #else /* CONFIG_SWAP */ 695169b844SNeilBrown struct swap_iocb; 705169b844SNeilBrown static inline int swap_readpage(struct page *page, bool do_poll, 715169b844SNeilBrown struct swap_iocb **plug) 72014bb1deSNeilBrown { 73014bb1deSNeilBrown return 0; 74014bb1deSNeilBrown } 752282679fSNeilBrown static inline void swap_write_unplug(struct swap_iocb *sio) 762282679fSNeilBrown { 772282679fSNeilBrown } 78014bb1deSNeilBrown 79014bb1deSNeilBrown static inline struct address_space *swap_address_space(swp_entry_t entry) 80014bb1deSNeilBrown { 81014bb1deSNeilBrown return NULL; 82014bb1deSNeilBrown } 83014bb1deSNeilBrown 84014bb1deSNeilBrown static inline void free_swap_cache(struct page *page) 85014bb1deSNeilBrown { 86014bb1deSNeilBrown } 87014bb1deSNeilBrown 88014bb1deSNeilBrown static inline void show_swap_cache_info(void) 89014bb1deSNeilBrown { 90014bb1deSNeilBrown } 91014bb1deSNeilBrown 92014bb1deSNeilBrown static inline struct page *swap_cluster_readahead(swp_entry_t entry, 93014bb1deSNeilBrown gfp_t gfp_mask, struct vm_fault *vmf) 94014bb1deSNeilBrown { 95014bb1deSNeilBrown return NULL; 96014bb1deSNeilBrown } 97014bb1deSNeilBrown 98014bb1deSNeilBrown static inline struct page *swapin_readahead(swp_entry_t swp, gfp_t gfp_mask, 99014bb1deSNeilBrown struct vm_fault *vmf) 100014bb1deSNeilBrown { 101014bb1deSNeilBrown return NULL; 102014bb1deSNeilBrown } 103014bb1deSNeilBrown 104014bb1deSNeilBrown static inline int swap_writepage(struct page *p, struct writeback_control *wbc) 105014bb1deSNeilBrown { 106014bb1deSNeilBrown return 0; 107014bb1deSNeilBrown } 108014bb1deSNeilBrown 109014bb1deSNeilBrown static inline struct page *lookup_swap_cache(swp_entry_t swp, 110014bb1deSNeilBrown struct vm_area_struct *vma, 111014bb1deSNeilBrown unsigned long addr) 112014bb1deSNeilBrown { 113014bb1deSNeilBrown return NULL; 114014bb1deSNeilBrown } 115014bb1deSNeilBrown 116014bb1deSNeilBrown static inline 117014bb1deSNeilBrown struct page *find_get_incore_page(struct address_space *mapping, pgoff_t index) 118014bb1deSNeilBrown { 119014bb1deSNeilBrown return find_get_page(mapping, index); 120014bb1deSNeilBrown } 121014bb1deSNeilBrown 12209c02e56SMatthew Wilcox (Oracle) static inline bool add_to_swap(struct folio *folio) 123014bb1deSNeilBrown { 12409c02e56SMatthew Wilcox (Oracle) return false; 125014bb1deSNeilBrown } 126014bb1deSNeilBrown 127014bb1deSNeilBrown static inline void *get_shadow_from_swap_cache(swp_entry_t entry) 128014bb1deSNeilBrown { 129014bb1deSNeilBrown return NULL; 130014bb1deSNeilBrown } 131014bb1deSNeilBrown 132014bb1deSNeilBrown static inline int add_to_swap_cache(struct page *page, swp_entry_t entry, 133014bb1deSNeilBrown gfp_t gfp_mask, void **shadowp) 134014bb1deSNeilBrown { 135014bb1deSNeilBrown return -1; 136014bb1deSNeilBrown } 137014bb1deSNeilBrown 138014bb1deSNeilBrown static inline void __delete_from_swap_cache(struct page *page, 139014bb1deSNeilBrown swp_entry_t entry, void *shadow) 140014bb1deSNeilBrown { 141014bb1deSNeilBrown } 142014bb1deSNeilBrown 143014bb1deSNeilBrown static inline void delete_from_swap_cache(struct page *page) 144014bb1deSNeilBrown { 145014bb1deSNeilBrown } 146014bb1deSNeilBrown 147014bb1deSNeilBrown static inline void clear_shadow_from_swap_cache(int type, unsigned long begin, 148014bb1deSNeilBrown unsigned long end) 149014bb1deSNeilBrown { 150014bb1deSNeilBrown } 151014bb1deSNeilBrown 152*b98c359fSMatthew Wilcox (Oracle) static inline unsigned int folio_swap_flags(struct folio *folio) 153d791ea67SNeilBrown { 154d791ea67SNeilBrown return 0; 155d791ea67SNeilBrown } 156014bb1deSNeilBrown #endif /* CONFIG_SWAP */ 157014bb1deSNeilBrown #endif /* _MM_SWAP_H */ 158