1 /*
2 * linux/mm/swap.c
3 *
4 * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds
5 */
6
7 /*
8 * This file should contain most things doing the swapping from/to disk.
9 * Started 18.12.91
10 *
11 * Swap aging added 23.2.95, Stephen Tweedie.
12 */
13
14 #include <linux/mm.h>
15 #include <linux/sched.h>
16 #include <linux/head.h>
17 #include <linux/kernel.h>
18 #include <linux/kernel_stat.h>
19 #include <linux/errno.h>
20 #include <linux/string.h>
21 #include <linux/stat.h>
22 #include <linux/swap.h>
23 #include <linux/fs.h>
24 #include <linux/swapctl.h>
25 #include <linux/pagemap.h>
26
27 #include <asm/dma.h>
28 #include <asm/system.h> /* for cli()/sti() */
29 #include <asm/segment.h> /* for memcpy_to/fromfs */
30 #include <asm/bitops.h>
31 #include <asm/pgtable.h>
32
33 /*
34 * We identify three levels of free memory. We never let free mem
35 * fall below the min_free_pages except for atomic allocations. We
36 * start background swapping if we fall below free_pages_high free
37 * pages, and we begin intensive swapping below free_pages_low.
38 *
39 * Keep these three variables contiguous for sysctl(2).
40 */
41 int min_free_pages = 20;
42 int free_pages_low = 30;
43 int free_pages_high = 40;
44
45 /* We track the number of pages currently being asynchronously swapped
46 out, so that we don't try to swap TOO many pages out at once */
47 int nr_async_pages = 0;
48
49 /*
50 * Constants for the page aging mechanism: the maximum age (actually,
51 * the maximum "youthfulness"); the quanta by which pages rejuvinate
52 * and age; and the initial age for new pages.
53 */
54
55 swap_control_t swap_control = {
56 20, 3, 1, 3, /* Page aging */
57 10, 2, 2, 4, /* Buffer aging */
58 32, 4, /* Aging cluster */
59 8192, 8192, /* Pageout and bufferout weights */
60 -200, /* Buffer grace */
61 1, 1, /* Buffs/pages to free */
62 RCL_ROUND_ROBIN /* Balancing policy */
63 };
64
65 swapstat_t swapstats = {0};
66
67 /* General swap control */
68
69 /* Parse the kernel command line "swap=" option at load time: */
70 void swap_setup(char *str, int *ints)
/* ![[previous]](../icons/n_left.png)
![[next]](../icons/right.png)
![[first]](../icons/n_first.png)
![[last]](../icons/last.png)
![[top]](../icons/top.png)
![[bottom]](../icons/bottom.png)
![[index]](../icons/index.png)
*/
71 {
72 int * swap_vars[8] = {
73 &MAX_PAGE_AGE,
74 &PAGE_ADVANCE,
75 &PAGE_DECLINE,
76 &PAGE_INITIAL_AGE,
77 &AGE_CLUSTER_FRACT,
78 &AGE_CLUSTER_MIN,
79 &PAGEOUT_WEIGHT,
80 &BUFFEROUT_WEIGHT
81 };
82 int i;
83 for (i=0; i < ints[0] && i < 8; i++) {
84 if (ints[i+1])
85 *(swap_vars[i]) = ints[i+1];
86 }
87 }
88
89 /* Parse the kernel command line "buff=" option at load time: */
90 void buff_setup(char *str, int *ints)
/* ![[previous]](../icons/left.png)
![[next]](../icons/n_right.png)
![[first]](../icons/first.png)
![[last]](../icons/n_last.png)
![[top]](../icons/top.png)
![[bottom]](../icons/bottom.png)
![[index]](../icons/index.png)
*/
91 {
92 int * buff_vars[6] = {
93 &MAX_BUFF_AGE,
94 &BUFF_ADVANCE,
95 &BUFF_DECLINE,
96 &BUFF_INITIAL_AGE,
97 &BUFFEROUT_WEIGHT,
98 &BUFFERMEM_GRACE
99 };
100 int i;
101 for (i=0; i < ints[0] && i < 6; i++) {
102 if (ints[i+1])
103 *(buff_vars[i]) = ints[i+1];
104 }
105 }
106