162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef _MM_SWAP_H
362306a36Sopenharmony_ci#define _MM_SWAP_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#ifdef CONFIG_SWAP
662306a36Sopenharmony_ci#include <linux/blk_types.h> /* for bio_end_io_t */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci/* linux/mm/page_io.c */
962306a36Sopenharmony_ciint sio_pool_init(void);
1062306a36Sopenharmony_cistruct swap_iocb;
1162306a36Sopenharmony_civoid swap_readpage(struct page *page, bool do_poll, struct swap_iocb **plug);
1262306a36Sopenharmony_civoid __swap_read_unplug(struct swap_iocb *plug);
1362306a36Sopenharmony_cistatic inline void swap_read_unplug(struct swap_iocb *plug)
1462306a36Sopenharmony_ci{
1562306a36Sopenharmony_ci	if (unlikely(plug))
1662306a36Sopenharmony_ci		__swap_read_unplug(plug);
1762306a36Sopenharmony_ci}
1862306a36Sopenharmony_civoid swap_write_unplug(struct swap_iocb *sio);
1962306a36Sopenharmony_ciint swap_writepage(struct page *page, struct writeback_control *wbc);
2062306a36Sopenharmony_civoid __swap_writepage(struct page *page, struct writeback_control *wbc);
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci/* linux/mm/swap_state.c */
2362306a36Sopenharmony_ci/* One swap address space for each 64M swap space */
2462306a36Sopenharmony_ci#define SWAP_ADDRESS_SPACE_SHIFT	14
2562306a36Sopenharmony_ci#define SWAP_ADDRESS_SPACE_PAGES	(1 << SWAP_ADDRESS_SPACE_SHIFT)
2662306a36Sopenharmony_ciextern struct address_space *swapper_spaces[];
2762306a36Sopenharmony_ci#define swap_address_space(entry)			    \
2862306a36Sopenharmony_ci	(&swapper_spaces[swp_type(entry)][swp_offset(entry) \
2962306a36Sopenharmony_ci		>> SWAP_ADDRESS_SPACE_SHIFT])
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_civoid show_swap_cache_info(void);
3262306a36Sopenharmony_cibool add_to_swap(struct folio *folio);
3362306a36Sopenharmony_civoid *get_shadow_from_swap_cache(swp_entry_t entry);
3462306a36Sopenharmony_ciint add_to_swap_cache(struct folio *folio, swp_entry_t entry,
3562306a36Sopenharmony_ci		      gfp_t gfp, void **shadowp);
3662306a36Sopenharmony_civoid __delete_from_swap_cache(struct folio *folio,
3762306a36Sopenharmony_ci			      swp_entry_t entry, void *shadow);
3862306a36Sopenharmony_civoid delete_from_swap_cache(struct folio *folio);
3962306a36Sopenharmony_civoid clear_shadow_from_swap_cache(int type, unsigned long begin,
4062306a36Sopenharmony_ci				  unsigned long end);
4162306a36Sopenharmony_civoid swapcache_clear(struct swap_info_struct *si, swp_entry_t entry);
4262306a36Sopenharmony_cistruct folio *swap_cache_get_folio(swp_entry_t entry,
4362306a36Sopenharmony_ci		struct vm_area_struct *vma, unsigned long addr);
4462306a36Sopenharmony_cistruct folio *filemap_get_incore_folio(struct address_space *mapping,
4562306a36Sopenharmony_ci		pgoff_t index);
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_cistruct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask,
4862306a36Sopenharmony_ci				   struct vm_area_struct *vma,
4962306a36Sopenharmony_ci				   unsigned long addr,
5062306a36Sopenharmony_ci				   struct swap_iocb **plug);
5162306a36Sopenharmony_cistruct page *__read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask,
5262306a36Sopenharmony_ci				     struct vm_area_struct *vma,
5362306a36Sopenharmony_ci				     unsigned long addr,
5462306a36Sopenharmony_ci				     bool *new_page_allocated);
5562306a36Sopenharmony_cistruct page *swap_cluster_readahead(swp_entry_t entry, gfp_t flag,
5662306a36Sopenharmony_ci				    struct vm_fault *vmf);
5762306a36Sopenharmony_cistruct page *swapin_readahead(swp_entry_t entry, gfp_t flag,
5862306a36Sopenharmony_ci			      struct vm_fault *vmf);
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cistatic inline unsigned int folio_swap_flags(struct folio *folio)
6162306a36Sopenharmony_ci{
6262306a36Sopenharmony_ci	return page_swap_info(&folio->page)->flags;
6362306a36Sopenharmony_ci}
6462306a36Sopenharmony_ci#else /* CONFIG_SWAP */
6562306a36Sopenharmony_cistruct swap_iocb;
6662306a36Sopenharmony_cistatic inline void swap_readpage(struct page *page, bool do_poll,
6762306a36Sopenharmony_ci		struct swap_iocb **plug)
6862306a36Sopenharmony_ci{
6962306a36Sopenharmony_ci}
7062306a36Sopenharmony_cistatic inline void swap_write_unplug(struct swap_iocb *sio)
7162306a36Sopenharmony_ci{
7262306a36Sopenharmony_ci}
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_cistatic inline struct address_space *swap_address_space(swp_entry_t entry)
7562306a36Sopenharmony_ci{
7662306a36Sopenharmony_ci	return NULL;
7762306a36Sopenharmony_ci}
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_cistatic inline void show_swap_cache_info(void)
8062306a36Sopenharmony_ci{
8162306a36Sopenharmony_ci}
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_cistatic inline struct page *swap_cluster_readahead(swp_entry_t entry,
8462306a36Sopenharmony_ci				gfp_t gfp_mask, struct vm_fault *vmf)
8562306a36Sopenharmony_ci{
8662306a36Sopenharmony_ci	return NULL;
8762306a36Sopenharmony_ci}
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_cistatic inline struct page *swapin_readahead(swp_entry_t swp, gfp_t gfp_mask,
9062306a36Sopenharmony_ci			struct vm_fault *vmf)
9162306a36Sopenharmony_ci{
9262306a36Sopenharmony_ci	return NULL;
9362306a36Sopenharmony_ci}
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_cistatic inline int swap_writepage(struct page *p, struct writeback_control *wbc)
9662306a36Sopenharmony_ci{
9762306a36Sopenharmony_ci	return 0;
9862306a36Sopenharmony_ci}
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_cistatic inline void swapcache_clear(struct swap_info_struct *si, swp_entry_t entry)
10162306a36Sopenharmony_ci{
10262306a36Sopenharmony_ci}
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_cistatic inline struct folio *swap_cache_get_folio(swp_entry_t entry,
10562306a36Sopenharmony_ci		struct vm_area_struct *vma, unsigned long addr)
10662306a36Sopenharmony_ci{
10762306a36Sopenharmony_ci	return NULL;
10862306a36Sopenharmony_ci}
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_cistatic inline
11162306a36Sopenharmony_cistruct folio *filemap_get_incore_folio(struct address_space *mapping,
11262306a36Sopenharmony_ci		pgoff_t index)
11362306a36Sopenharmony_ci{
11462306a36Sopenharmony_ci	return filemap_get_folio(mapping, index);
11562306a36Sopenharmony_ci}
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_cistatic inline bool add_to_swap(struct folio *folio)
11862306a36Sopenharmony_ci{
11962306a36Sopenharmony_ci	return false;
12062306a36Sopenharmony_ci}
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_cistatic inline void *get_shadow_from_swap_cache(swp_entry_t entry)
12362306a36Sopenharmony_ci{
12462306a36Sopenharmony_ci	return NULL;
12562306a36Sopenharmony_ci}
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_cistatic inline int add_to_swap_cache(struct folio *folio, swp_entry_t entry,
12862306a36Sopenharmony_ci					gfp_t gfp_mask, void **shadowp)
12962306a36Sopenharmony_ci{
13062306a36Sopenharmony_ci	return -1;
13162306a36Sopenharmony_ci}
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_cistatic inline void __delete_from_swap_cache(struct folio *folio,
13462306a36Sopenharmony_ci					swp_entry_t entry, void *shadow)
13562306a36Sopenharmony_ci{
13662306a36Sopenharmony_ci}
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_cistatic inline void delete_from_swap_cache(struct folio *folio)
13962306a36Sopenharmony_ci{
14062306a36Sopenharmony_ci}
14162306a36Sopenharmony_ci
14262306a36Sopenharmony_cistatic inline void clear_shadow_from_swap_cache(int type, unsigned long begin,
14362306a36Sopenharmony_ci				unsigned long end)
14462306a36Sopenharmony_ci{
14562306a36Sopenharmony_ci}
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_cistatic inline unsigned int folio_swap_flags(struct folio *folio)
14862306a36Sopenharmony_ci{
14962306a36Sopenharmony_ci	return 0;
15062306a36Sopenharmony_ci}
15162306a36Sopenharmony_ci#endif /* CONFIG_SWAP */
15262306a36Sopenharmony_ci#endif /* _MM_SWAP_H */
153