1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
#ifndef _LINUX_SWAPCTL_H
#define _LINUX_SWAPCTL_H
#include <asm/page.h>
#include <linux/fs.h>
/* Swap tuning control */
typedef struct swap_control_v6
{
unsigned int sc_max_page_age;
unsigned int sc_page_advance;
unsigned int sc_page_decline;
unsigned int sc_page_initial_age;
unsigned int sc_age_cluster_fract;
unsigned int sc_age_cluster_min;
unsigned int sc_pageout_weight;
unsigned int sc_bufferout_weight;
} swap_control_v6;
typedef struct swap_control_v6 swap_control_t;
extern swap_control_t swap_control;
typedef struct swapstat_v1
{
unsigned int wakeups;
unsigned int pages_reclaimed;
unsigned int pages_shm;
unsigned int pages_mmap;
unsigned int pages_swap;
} swapstat_v1;
typedef swapstat_v1 swapstat_t;
extern swapstat_t swapstats;
typedef struct buffer_mem_v1
{
unsigned int min_percent;
unsigned int borrow_percent;
unsigned int max_percent;
} buffer_mem_v1;
typedef buffer_mem_v1 buffer_mem_t;
extern buffer_mem_t buffer_mem;
extern buffer_mem_t page_cache;
typedef struct freepages_v1
{
unsigned int min;
unsigned int low;
unsigned int high;
} freepages_v1;
typedef freepages_v1 freepages_t;
extern freepages_t freepages;
typedef struct pager_daemon_v1
{
unsigned int tries_base;
unsigned int tries_min;
unsigned int swap_cluster;
} pager_daemon_v1;
typedef pager_daemon_v1 pager_daemon_t;
extern pager_daemon_t pager_daemon;
#define SC_VERSION 1
#define SC_MAX_VERSION 1
#ifdef __KERNEL__
/* Define the maximum (least urgent) priority for the page reclaim code */
#define RCL_MAXPRI 6
/* We use an extra priority in the swap accounting code to represent
failure to free a resource at any priority */
#define RCL_FAILURE (RCL_MAXPRI + 1)
#define AGE_CLUSTER_FRACT (swap_control.sc_age_cluster_fract)
#define AGE_CLUSTER_MIN (swap_control.sc_age_cluster_min)
#define PAGEOUT_WEIGHT (swap_control.sc_pageout_weight)
#define BUFFEROUT_WEIGHT (swap_control.sc_bufferout_weight)
/* Page aging (see mm/swap.c) */
#define MAX_PAGE_AGE (swap_control.sc_max_page_age)
#define PAGE_ADVANCE (swap_control.sc_page_advance)
#define PAGE_DECLINE (swap_control.sc_page_decline)
#define PAGE_INITIAL_AGE (swap_control.sc_page_initial_age)
/* Given a resource of N units (pages or buffers etc), we only try to
* age and reclaim AGE_CLUSTER_FRACT per 1024 resources each time we
* scan the resource list. */
static inline int AGE_CLUSTER_SIZE(int resources)
{
unsigned int n = (resources * AGE_CLUSTER_FRACT) >> 10;
if (n < AGE_CLUSTER_MIN)
return AGE_CLUSTER_MIN;
else
return n;
}
static inline void touch_page(struct page *page)
{
if (page->age < (MAX_PAGE_AGE - PAGE_ADVANCE))
page->age += PAGE_ADVANCE;
else
page->age = MAX_PAGE_AGE;
}
static inline void age_page(struct page *page)
{
if (page->age > PAGE_DECLINE)
page->age -= PAGE_DECLINE;
else
page->age = 0;
}
static inline int age_of(unsigned long addr)
{
return mem_map[MAP_NR(addr)].age;
}
static inline void set_page_new(unsigned long addr)
{
mem_map[MAP_NR(addr)].age = PAGE_INITIAL_AGE;
}
#endif /* __KERNEL */
#endif /* _LINUX_SWAPCTL_H */
|