1
2#ifndef _LINUX_SWAP_H
3#define _LINUX_SWAP_H
4
5#include <linux/spinlock.h>
6#include <linux/linkage.h>
7#include <linux/mmzone.h>
8#include <linux/list.h>
9#include <linux/memcontrol.h>
10#include <linux/sched.h>
11#include <linux/node.h>
12#include <linux/fs.h>
13#include <linux/pagemap.h>
14#include <linux/atomic.h>
15#include <linux/page-flags.h>
16#include <uapi/linux/mempolicy.h>
17#include <asm/page.h>
18
19struct notifier_block;
20
21struct bio;
22
23struct pagevec;
24
25#define SWAP_FLAG_PREFER 0x8000
26#define SWAP_FLAG_PRIO_MASK 0x7fff
27#define SWAP_FLAG_DISCARD 0x10000
28#define SWAP_FLAG_DISCARD_ONCE 0x20000
29#define SWAP_FLAG_DISCARD_PAGES 0x40000
30
31#define SWAP_FLAGS_VALID (SWAP_FLAG_PRIO_MASK | SWAP_FLAG_PREFER | \
32 SWAP_FLAG_DISCARD | SWAP_FLAG_DISCARD_ONCE | \
33 SWAP_FLAG_DISCARD_PAGES)
34#define SWAP_BATCH 64
35
36static inline int current_is_kswapd(void)
37{
38 return current->flags & PF_KSWAPD;
39}
40
41
42
43
44
45
46
47
48
49#define MAX_SWAPFILES_SHIFT 5
50
51
52
53
54
55
56
57
58
59
60
61
62#define SWP_PTE_MARKER_NUM 1
63#define SWP_PTE_MARKER (MAX_SWAPFILES + SWP_HWPOISON_NUM + \
64 SWP_MIGRATION_NUM + SWP_DEVICE_NUM)
65
66
67
68
69
70
71
72
73
74
75
76
77
78#ifdef CONFIG_DEVICE_PRIVATE
79#define SWP_DEVICE_NUM 3
80#define SWP_DEVICE_WRITE (MAX_SWAPFILES+SWP_HWPOISON_NUM+SWP_MIGRATION_NUM)
81#define SWP_DEVICE_READ (MAX_SWAPFILES+SWP_HWPOISON_NUM+SWP_MIGRATION_NUM+1)
82#define SWP_DEVICE_EXCLUSIVE (MAX_SWAPFILES+SWP_HWPOISON_NUM+SWP_MIGRATION_NUM+2)
83#else
84#define SWP_DEVICE_NUM 0
85#endif
86
87
88
89
90
91
92
93
94
95
96#ifdef CONFIG_MIGRATION
97#define SWP_MIGRATION_NUM 3
98#define SWP_MIGRATION_READ (MAX_SWAPFILES + SWP_HWPOISON_NUM)
99#define SWP_MIGRATION_READ_EXCLUSIVE (MAX_SWAPFILES + SWP_HWPOISON_NUM + 1)
100#define SWP_MIGRATION_WRITE (MAX_SWAPFILES + SWP_HWPOISON_NUM + 2)
101#else
102#define SWP_MIGRATION_NUM 0
103#endif
104
105
106
107
108#ifdef CONFIG_MEMORY_FAILURE
109#define SWP_HWPOISON_NUM 1
110#define SWP_HWPOISON MAX_SWAPFILES
111#else
112#define SWP_HWPOISON_NUM 0
113#endif
114
115#define MAX_SWAPFILES \
116 ((1 << MAX_SWAPFILES_SHIFT) - SWP_DEVICE_NUM - \
117 SWP_MIGRATION_NUM - SWP_HWPOISON_NUM - \
118 SWP_PTE_MARKER_NUM)
119
120
121
122
123
124
125
126
127
128
129
130
131
132union swap_header {
133 struct {
134 char reserved[PAGE_SIZE - 10];
135 char magic[10];
136 } magic;
137 struct {
138 char bootbits[1024];
139 __u32 version;
140 __u32 last_page;
141 __u32 nr_badpages;
142 unsigned char sws_uuid[16];
143 unsigned char sws_volume[16];
144 __u32 padding[117];
145 __u32 badpages[1];
146 } info;
147};
148
149
150
151
152
153struct reclaim_state {
154
155 unsigned long reclaimed;
156#ifdef CONFIG_LRU_GEN
157
158 struct lru_gen_mm_walk *mm_walk;
159#endif
160};
161
162
163
164
165
166
167
168
169
170static inline void mm_account_reclaimed_pages(unsigned long pages)
171{
172 if (current->reclaim_state)
173 current->reclaim_state->reclaimed += pages;
174}
175
176#ifdef __KERNEL__
177
178struct address_space;
179struct sysinfo;
180struct writeback_control;
181struct zone;
182
183
184
185
186
187
188
189
190
191struct swap_extent {
192 struct rb_node rb_node;
193 pgoff_t start_page;
194 pgoff_t nr_pages;
195 sector_t start_block;
196};
197
198
199
200
201#define MAX_SWAP_BADPAGES \
202 ((offsetof(union swap_header, magic.magic) - \
203 offsetof(union swap_header, info.badpages)) / sizeof(int))
204
205enum {
206 SWP_USED = (1 << 0),
207 SWP_WRITEOK = (1 << 1),
208 SWP_DISCARDABLE = (1 << 2),
209 SWP_DISCARDING = (1 << 3),
210 SWP_SOLIDSTATE = (1 << 4),
211 SWP_CONTINUED = (1 << 5),
212 SWP_BLKDEV = (1 << 6),
213 SWP_ACTIVATED = (1 << 7),
214 SWP_FS_OPS = (1 << 8),
215 SWP_AREA_DISCARD = (1 << 9),
216 SWP_PAGE_DISCARD = (1 << 10),
217 SWP_STABLE_WRITES = (1 << 11),
218 SWP_SYNCHRONOUS_IO = (1 << 12),
219
220};
221
222#define SWAP_CLUSTER_MAX 32UL
223#define SWAP_CLUSTER_MAX_SKIPPED (SWAP_CLUSTER_MAX << 10)
224#define COMPACT_CLUSTER_MAX SWAP_CLUSTER_MAX
225
226
227#define SWAP_HAS_CACHE 0x40
228#define COUNT_CONTINUED 0x80
229
230
231#define SWAP_MAP_MAX 0x3e
232#define SWAP_MAP_BAD 0x3f
233#define SWAP_MAP_SHMEM 0xbf
234
235
236#define SWAP_CONT_MAX 0x7f
237
238
239
240
241
242
243
244
245
246
247struct swap_cluster_info {
248 spinlock_t lock;
249
250
251
252
253 u16 count;
254 u8 flags;
255 u8 order;
256 struct list_head list;
257};
258
259
260enum swap_cluster_flags {
261 CLUSTER_FLAG_NONE = 0,
262 CLUSTER_FLAG_FREE,
263 CLUSTER_FLAG_NONFULL,
264 CLUSTER_FLAG_FRAG,
265
266 CLUSTER_FLAG_USABLE = CLUSTER_FLAG_FRAG,
267 CLUSTER_FLAG_FULL,
268 CLUSTER_FLAG_DISCARD,
269 CLUSTER_FLAG_MAX,
270};
271
272
273
274
275
276
277
278#define SWAP_ENTRY_INVALID 0
279
280#ifdef CONFIG_THP_SWAP
281#define SWAP_NR_ORDERS (PMD_ORDER + 1)
282#else
283#define SWAP_NR_ORDERS 1
284#endif
285
286
287
288
289
290struct swap_sequential_cluster {
291 unsigned int next[SWAP_NR_ORDERS];
292};
293
294
295
296
297struct swap_info_struct {
298 struct percpu_ref users;
299 unsigned long flags;
300 signed short prio;
301 struct plist_node list;
302 signed char type;
303 unsigned int max;
304 unsigned char *swap_map;
305 unsigned long *zeromap;
306 struct swap_cluster_info *cluster_info;
307 struct list_head free_clusters;
308 struct list_head full_clusters;
309 struct list_head nonfull_clusters[SWAP_NR_ORDERS];
310
311 struct list_head frag_clusters[SWAP_NR_ORDERS];
312
313 atomic_long_t frag_cluster_nr[SWAP_NR_ORDERS];
314 unsigned int pages;
315 atomic_long_t inuse_pages;
316 struct swap_sequential_cluster *global_cluster;
317 spinlock_t global_cluster_lock;
318 struct rb_root swap_extent_root;
319 struct block_device *bdev;
320 struct file *swap_file;
321 struct completion comp;
322 spinlock_t lock;
323
324
325
326
327
328
329
330
331
332
333
334
335 spinlock_t cont_lock;
336
337
338
339 struct work_struct discard_work;
340 struct work_struct reclaim_work;
341 struct list_head discard_clusters;
342 struct plist_node avail_lists[];
343
344
345
346
347
348
349
350
351
352};
353
354static inline swp_entry_t page_swap_entry(struct page *page)
355{
356 struct folio *folio = page_folio(page);
357 swp_entry_t entry = folio->swap;
358
359 entry.val += folio_page_idx(folio, page);
360 return entry;
361}
362
363
364bool workingset_test_recent(void *shadow, bool file, bool *workingset,
365 bool flush);
366void workingset_age_nonresident(struct lruvec *lruvec, unsigned long nr_pages);
367void *workingset_eviction(struct folio *folio, struct mem_cgroup *target_memcg);
368void workingset_refault(struct folio *folio, void *shadow);
369void workingset_activation(struct folio *folio);
370
371
372extern unsigned long totalreserve_pages;
373
374
375#define nr_free_pages() global_zone_page_state(NR_FREE_PAGES)
376
377
378
379void lru_note_cost_unlock_irq(struct lruvec *lruvec, bool file,
380 unsigned int nr_io, unsigned int nr_rotated)
381 __releases(lruvec->lru_lock);
382void lru_note_cost_refault(struct folio *);
383void folio_add_lru(struct folio *);
384void folio_add_lru_vma(struct folio *, struct vm_area_struct *);
385void mark_page_accessed(struct page *);
386void folio_mark_accessed(struct folio *);
387
388static inline bool folio_may_be_lru_cached(struct folio *folio)
389{
390
391
392
393
394
395 return !folio_test_large(folio);
396}
397
398extern atomic_t lru_disable_count;
399
400static inline bool lru_cache_disabled(void)
401{
402 return atomic_read(&lru_disable_count);
403}
404
405static inline void lru_cache_enable(void)
406{
407 atomic_dec(&lru_disable_count);
408}
409
410extern void lru_cache_disable(void);
411extern void lru_add_drain(void);
412extern void lru_add_drain_cpu(int cpu);
413extern void lru_add_drain_cpu_zone(struct zone *zone);
414extern void lru_add_drain_all(void);
415void folio_deactivate(struct folio *folio);
416void folio_mark_lazyfree(struct folio *folio);
417extern void swap_setup(void);
418
419
420extern unsigned long zone_reclaimable_pages(struct zone *zone);
421extern unsigned long try_to_free_pages(struct zonelist *zonelist, int order,
422 gfp_t gfp_mask, nodemask_t *mask);
423
424#define MEMCG_RECLAIM_MAY_SWAP (1 << 1)
425#define MEMCG_RECLAIM_PROACTIVE (1 << 2)
426#define MIN_SWAPPINESS 0
427#define MAX_SWAPPINESS 200
428
429
430#define SWAPPINESS_ANON_ONLY (MAX_SWAPPINESS + 1)
431
432extern unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *memcg,
433 unsigned long nr_pages,
434 gfp_t gfp_mask,
435 unsigned int reclaim_options,
436 int *swappiness);
437extern unsigned long mem_cgroup_shrink_node(struct mem_cgroup *mem,
438 gfp_t gfp_mask, bool noswap,
439 pg_data_t *pgdat,
440 unsigned long *nr_scanned);
441extern unsigned long shrink_all_memory(unsigned long nr_pages);
442extern int vm_swappiness;
443long remove_mapping(struct address_space *mapping, struct folio *folio);
444
445#if defined(CONFIG_SYSFS) && defined(CONFIG_NUMA)
446extern int reclaim_register_node(struct node *node);
447extern void reclaim_unregister_node(struct node *node);
448
449#else
450
451static inline int reclaim_register_node(struct node *node)
452{
453 return 0;
454}
455
456static inline void reclaim_unregister_node(struct node *node)
457{
458}
459#endif
460
461#ifdef CONFIG_NUMA
462extern int sysctl_min_unmapped_ratio;
463extern int sysctl_min_slab_ratio;
464#endif
465
466void check_move_unevictable_folios(struct folio_batch *fbatch);
467
468extern void __meminit kswapd_run(int nid);
469extern void __meminit kswapd_stop(int nid);
470
471#ifdef CONFIG_SWAP
472
473int add_swap_extent(struct swap_info_struct *sis, unsigned long start_page,
474 unsigned long nr_pages, sector_t start_block);
475int generic_swapfile_activate(struct swap_info_struct *, struct file *,
476 sector_t *);
477
478static inline unsigned long total_swapcache_pages(void)
479{
480 return global_node_page_state(NR_SWAPCACHE);
481}
482
483void free_swap_cache(struct folio *folio);
484void free_folio_and_swap_cache(struct folio *folio);
485void free_pages_and_swap_cache(struct encoded_page **, int);
486
487extern atomic_long_t nr_swap_pages;
488extern long total_swap_pages;
489extern atomic_t nr_rotate_swap;
490
491
492static inline bool vm_swap_full(void)
493{
494 return atomic_long_read(&nr_swap_pages) * 2 < total_swap_pages;
495}
496
497static inline long get_nr_swap_pages(void)
498{
499 return atomic_long_read(&nr_swap_pages);
500}
501
502extern void si_swapinfo(struct sysinfo *);
503int folio_alloc_swap(struct folio *folio, gfp_t gfp_mask);
504bool folio_free_swap(struct folio *folio);
505void put_swap_folio(struct folio *folio, swp_entry_t entry);
506extern swp_entry_t get_swap_page_of_type(int);
507extern int add_swap_count_continuation(swp_entry_t, gfp_t);
508extern void swap_shmem_alloc(swp_entry_t, int);
509extern int swap_duplicate(swp_entry_t);
510extern int swapcache_prepare(swp_entry_t entry, int nr);
511extern void swap_free_nr(swp_entry_t entry, int nr_pages);
512extern void free_swap_and_cache_nr(swp_entry_t entry, int nr);
513int swap_type_of(dev_t device, sector_t offset);
514int find_first_swap(dev_t *device);
515extern unsigned int count_swap_pages(int, int);
516extern sector_t swapdev_block(int, pgoff_t);
517extern int __swap_count(swp_entry_t entry);
518extern bool swap_entry_swapped(struct swap_info_struct *si, swp_entry_t entry);
519extern int swp_swapcount(swp_entry_t entry);
520struct swap_info_struct *swp_swap_info(swp_entry_t entry);
521struct backing_dev_info;
522extern int init_swap_address_space(unsigned int type, unsigned long nr_pages);
523extern void exit_swap_address_space(unsigned int type);
524extern struct swap_info_struct *get_swap_device(swp_entry_t entry);
525sector_t swap_folio_sector(struct folio *folio);
526
527static inline void put_swap_device(struct swap_info_struct *si)
528{
529 percpu_ref_put(&si->users);
530}
531
532#else
533static inline struct swap_info_struct *swp_swap_info(swp_entry_t entry)
534{
535 return NULL;
536}
537
538static inline struct swap_info_struct *get_swap_device(swp_entry_t entry)
539{
540 return NULL;
541}
542
543static inline void put_swap_device(struct swap_info_struct *si)
544{
545}
546
547#define get_nr_swap_pages() 0L
548#define total_swap_pages 0L
549#define total_swapcache_pages() 0UL
550#define vm_swap_full() 0
551
552#define si_swapinfo(val) \
553 do { (val)->freeswap = (val)->totalswap = 0; } while (0)
554#define free_folio_and_swap_cache(folio) \
555 folio_put(folio)
556#define free_pages_and_swap_cache(pages, nr) \
557 release_pages((pages), (nr));
558
559static inline void free_swap_and_cache_nr(swp_entry_t entry, int nr)
560{
561}
562
563static inline void free_swap_cache(struct folio *folio)
564{
565}
566
567static inline int add_swap_count_continuation(swp_entry_t swp, gfp_t gfp_mask)
568{
569 return 0;
570}
571
572static inline void swap_shmem_alloc(swp_entry_t swp, int nr)
573{
574}
575
576static inline int swap_duplicate(swp_entry_t swp)
577{
578 return 0;
579}
580
581static inline int swapcache_prepare(swp_entry_t swp, int nr)
582{
583 return 0;
584}
585
586static inline void swap_free_nr(swp_entry_t entry, int nr_pages)
587{
588}
589
590static inline void put_swap_folio(struct folio *folio, swp_entry_t swp)
591{
592}
593
594static inline int __swap_count(swp_entry_t entry)
595{
596 return 0;
597}
598
599static inline bool swap_entry_swapped(struct swap_info_struct *si, swp_entry_t entry)
600{
601 return false;
602}
603
604static inline int swp_swapcount(swp_entry_t entry)
605{
606 return 0;
607}
608
609static inline int folio_alloc_swap(struct folio *folio, gfp_t gfp_mask)
610{
611 return -EINVAL;
612}
613
614static inline bool folio_free_swap(struct folio *folio)
615{
616 return false;
617}
618
619static inline int add_swap_extent(struct swap_info_struct *sis,
620 unsigned long start_page,
621 unsigned long nr_pages, sector_t start_block)
622{
623 return -EINVAL;
624}
625#endif
626
627static inline void free_swap_and_cache(swp_entry_t entry)
628{
629 free_swap_and_cache_nr(entry, 1);
630}
631
632static inline void swap_free(swp_entry_t entry)
633{
634 swap_free_nr(entry, 1);
635}
636
637#ifdef CONFIG_MEMCG
638static inline int mem_cgroup_swappiness(struct mem_cgroup *memcg)
639{
640
641 if (cgroup_subsys_on_dfl(memory_cgrp_subsys))
642 return READ_ONCE(vm_swappiness);
643
644
645 if (mem_cgroup_disabled() || mem_cgroup_is_root(memcg))
646 return READ_ONCE(vm_swappiness);
647
648 return READ_ONCE(memcg->swappiness);
649}
650#else
651static inline int mem_cgroup_swappiness(struct mem_cgroup *mem)
652{
653 return READ_ONCE(vm_swappiness);
654}
655#endif
656
657#if defined(CONFIG_SWAP) && defined(CONFIG_MEMCG) && defined(CONFIG_BLK_CGROUP)
658void __folio_throttle_swaprate(struct folio *folio, gfp_t gfp);
659static inline void folio_throttle_swaprate(struct folio *folio, gfp_t gfp)
660{
661 if (mem_cgroup_disabled())
662 return;
663 __folio_throttle_swaprate(folio, gfp);
664}
665#else
666static inline void folio_throttle_swaprate(struct folio *folio, gfp_t gfp)
667{
668}
669#endif
670
671#if defined(CONFIG_MEMCG) && defined(CONFIG_SWAP)
672int __mem_cgroup_try_charge_swap(struct folio *folio, swp_entry_t entry);
673static inline int mem_cgroup_try_charge_swap(struct folio *folio,
674 swp_entry_t entry)
675{
676 if (mem_cgroup_disabled())
677 return 0;
678 return __mem_cgroup_try_charge_swap(folio, entry);
679}
680
681extern void __mem_cgroup_uncharge_swap(swp_entry_t entry, unsigned int nr_pages);
682static inline void mem_cgroup_uncharge_swap(swp_entry_t entry, unsigned int nr_pages)
683{
684 if (mem_cgroup_disabled())
685 return;
686 __mem_cgroup_uncharge_swap(entry, nr_pages);
687}
688
689extern long mem_cgroup_get_nr_swap_pages(struct mem_cgroup *memcg);
690extern bool mem_cgroup_swap_full(struct folio *folio);
691#else
692static inline int mem_cgroup_try_charge_swap(struct folio *folio,
693 swp_entry_t entry)
694{
695 return 0;
696}
697
698static inline void mem_cgroup_uncharge_swap(swp_entry_t entry,
699 unsigned int nr_pages)
700{
701}
702
703static inline long mem_cgroup_get_nr_swap_pages(struct mem_cgroup *memcg)
704{
705 return get_nr_swap_pages();
706}
707
708static inline bool mem_cgroup_swap_full(struct folio *folio)
709{
710 return vm_swap_full();
711}
712#endif
713
714#endif
715#endif
716