1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _MM_SWAP_H 3 #define _MM_SWAP_H 4 5 #ifdef CONFIG_SWAP 6 #include <linux/blk_types.h> /* for bio_end_io_t */ 7 8 /* linux/mm/page_io.c */ 9 int sio_pool_init(void); 10 struct swap_iocb; 11 void swap_readpage(struct page *page, bool do_poll, struct swap_iocb **plug); 12 void __swap_read_unplug(struct swap_iocb *plug); 13 static inline void swap_read_unplug(struct swap_iocb *plug) 14 { 15 if (unlikely(plug)) 16 __swap_read_unplug(plug); 17 } 18 void swap_write_unplug(struct swap_iocb *sio); 19 int swap_writepage(struct page *page, struct writeback_control *wbc); 20 void __swap_writepage(struct page *page, struct writeback_control *wbc); 21 22 /* linux/mm/swap_state.c */ 23 /* One swap address space for each 64M swap space */ 24 #define SWAP_ADDRESS_SPACE_SHIFT 14 25 #define SWAP_ADDRESS_SPACE_PAGES (1 << SWAP_ADDRESS_SPACE_SHIFT) 26 extern struct address_space *swapper_spaces[]; 27 #define swap_address_space(entry) \ 28 (&swapper_spaces[swp_type(entry)][swp_offset(entry) \ 29 >> SWAP_ADDRESS_SPACE_SHIFT]) 30 31 void show_swap_cache_info(void); 32 bool add_to_swap(struct folio *folio); 33 void *get_shadow_from_swap_cache(swp_entry_t entry); 34 int add_to_swap_cache(struct folio *folio, swp_entry_t entry, 35 gfp_t gfp, void **shadowp); 36 void __delete_from_swap_cache(struct folio *folio, 37 swp_entry_t entry, void *shadow); 38 void delete_from_swap_cache(struct folio *folio); 39 void clear_shadow_from_swap_cache(int type, unsigned long begin, 40 unsigned long end); 41 struct folio *swap_cache_get_folio(swp_entry_t entry, 42 struct vm_area_struct *vma, unsigned long addr); 43 struct folio *filemap_get_incore_folio(struct address_space *mapping, 44 pgoff_t index); 45 46 struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask, 47 struct vm_area_struct *vma, 48 unsigned long addr, 49 struct swap_iocb **plug); 50 struct page *__read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask, 51 struct vm_area_struct *vma, 52 unsigned long addr, 53 bool *new_page_allocated); 54 struct page *swap_cluster_readahead(swp_entry_t entry, gfp_t flag, 55 struct vm_fault *vmf); 56 struct page *swapin_readahead(swp_entry_t entry, gfp_t flag, 57 struct vm_fault *vmf); 58 59 static inline unsigned int folio_swap_flags(struct folio *folio) 60 { 61 return page_swap_info(&folio->page)->flags; 62 } 63 #else /* CONFIG_SWAP */ 64 struct swap_iocb; 65 static inline void swap_readpage(struct page *page, bool do_poll, 66 struct swap_iocb **plug) 67 { 68 } 69 static inline void swap_write_unplug(struct swap_iocb *sio) 70 { 71 } 72 73 static inline struct address_space *swap_address_space(swp_entry_t entry) 74 { 75 return NULL; 76 } 77 78 static inline void show_swap_cache_info(void) 79 { 80 } 81 82 static inline struct page *swap_cluster_readahead(swp_entry_t entry, 83 gfp_t gfp_mask, struct vm_fault *vmf) 84 { 85 return NULL; 86 } 87 88 static inline struct page *swapin_readahead(swp_entry_t swp, gfp_t gfp_mask, 89 struct vm_fault *vmf) 90 { 91 return NULL; 92 } 93 94 static inline int swap_writepage(struct page *p, struct writeback_control *wbc) 95 { 96 return 0; 97 } 98 99 static inline struct folio *swap_cache_get_folio(swp_entry_t entry, 100 struct vm_area_struct *vma, unsigned long addr) 101 { 102 return NULL; 103 } 104 105 static inline 106 struct folio *filemap_get_incore_folio(struct address_space *mapping, 107 pgoff_t index) 108 { 109 return filemap_get_folio(mapping, index); 110 } 111 112 static inline bool add_to_swap(struct folio *folio) 113 { 114 return false; 115 } 116 117 static inline void *get_shadow_from_swap_cache(swp_entry_t entry) 118 { 119 return NULL; 120 } 121 122 static inline int add_to_swap_cache(struct folio *folio, swp_entry_t entry, 123 gfp_t gfp_mask, void **shadowp) 124 { 125 return -1; 126 } 127 128 static inline void __delete_from_swap_cache(struct folio *folio, 129 swp_entry_t entry, void *shadow) 130 { 131 } 132 133 static inline void delete_from_swap_cache(struct folio *folio) 134 { 135 } 136 137 static inline void clear_shadow_from_swap_cache(int type, unsigned long begin, 138 unsigned long end) 139 { 140 } 141 142 static inline unsigned int folio_swap_flags(struct folio *folio) 143 { 144 return 0; 145 } 146 #endif /* CONFIG_SWAP */ 147 #endif /* _MM_SWAP_H */ 148