Import 2.1.36
[davej-history.git] / mm / swap.c
blob7b6a0eb49f14dbbe1d3f4a8ba5b0ffe3df224724
1 /*
2 * linux/mm/swap.c
4 * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds
5 */
7 /*
8 * This file should contain most things doing the swapping from/to disk.
9 * Started 18.12.91
11 * Swap aging added 23.2.95, Stephen Tweedie.
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>
27 #include <asm/dma.h>
28 #include <asm/system.h> /* for cli()/sti() */
29 #include <asm/uaccess.h> /* for copy_to/from_user */
30 #include <asm/bitops.h>
31 #include <asm/pgtable.h>
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.
39 * Keep these three variables contiguous for sysctl(2).
41 int min_free_pages = 48;
42 int free_pages_low = 72;
43 int free_pages_high = 96;
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 atomic_t nr_async_pages = ATOMIC_INIT(0);
50 * Constants for the page aging mechanism: the maximum age (actually,
51 * the maximum "youthfulness"); the quanta by which pages rejuvenate
52 * and age; and the initial age for new pages.
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 */
65 swapstat_t swapstats = {0};
67 /* General swap control */
69 /* Parse the kernel command line "swap=" option at load time: */
70 void swap_setup(char *str, int *ints)
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
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];
89 /* Parse the kernel command line "buff=" option at load time: */
90 void buff_setup(char *str, int *ints)
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
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];