4 * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds
8 * This file should contain most things doing the swapping from/to disk.
11 * Swap aging added 23.2.95, Stephen Tweedie.
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>
24 #include <linux/swapctl.h>
25 #include <linux/pagemap.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] = {
83 for (i
=0; i
< ints
[0] && i
< 8; i
++) {
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] = {
101 for (i
=0; i
< ints
[0] && i
< 6; i
++) {
103 *(buff_vars
[i
]) = ints
[i
+1];