Skomentowany kod źródłowy funkcji zajmujących się kontrolą
wieku ramek.
#ifndef _LINUX_SWAPCTL_H
#define _LINUX_SWAPCTL_H
#include <asm/page.h>
#include <linux/fs.h>
/* Swap tuning control */
/* First, enumerate the different reclaim policies */
enum RCL_POLICY {RCL_ROUND_ROBIN, RCL_BUFF_FIRST, RCL_PERSIST};
typedef struct swap_control_v5
{
int sc_max_page_age;
int sc_page_advance;
int sc_page_decline;
int sc_page_initial_age;
int sc_max_buff_age;
int sc_buff_advance;
int sc_buff_decline;
int sc_buff_initial_age;
int sc_age_cluster_fract;
int sc_age_cluster_min;
int sc_pageout_weight;
int sc_bufferout_weight;
int sc_buffer_grace;
int sc_nr_buffs_to_free;
int sc_nr_pages_to_free;
enum RCL_POLICY sc_policy;
} swap_control_v5;
typedef struct swap_control_v5 swap_control_t;
extern swap_control_t swap_control;
typedef struct kswapd_control_v1
{
int maxpages;
int pages_buff;
int pages_shm;
int pages_mmap;
int pages_swap;
} kswapd_control_v1;
typedef kswapd_control_v1 kswapd_control_t;
extern kswapd_control_t kswapd_ctl;
typedef struct swapstat_v1
{
int wakeups;
int pages_reclaimed;
int pages_shm;
int pages_mmap;
int pages_swap;
} swapstat_v1;
typedef swapstat_v1 swapstat_t;
extern swapstat_t swapstats;
/* Zmienne decydujące przy jakiej ilości wolnych ramek
* jak bardzo system będzie się starał zwalniać zajęte ramki */
extern int min_free_pages, free_pages_low, free_pages_high;
#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 RCL_POLICY (swap_control.sc_policy)
#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)
#define NR_BUFFS_TO_FREE (swap_control.sc_nr_buffs_to_free)
#define NR_PAGES_TO_FREE (swap_control.sc_nr_pages_to_free)
#define BUFFERMEM_GRACE (swap_control.sc_buffer_grace)
/* 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)
#define MAX_BUFF_AGE (swap_control.sc_max_buff_age)
#define BUFF_ADVANCE (swap_control.sc_buff_advance)
#define BUFF_DECLINE (swap_control.sc_buff_decline)
#define BUFF_INITIAL_AGE (swap_control.sc_buff_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)
{
int n = (resources * AGE_CLUSTER_FRACT) >> 10;
if (n < AGE_CLUSTER_MIN)
return AGE_CLUSTER_MIN;
else
return n;
}
/* Funkcja odmładzająca ramkę.
* Zmniejsza wiek ramki (zwiększa wartość pola page->age) o wartość stałej
* PAGE_ADVANCE. Wiek nigdy nie przekracza stałej MAX_PAGE_AGE.
* Parametr page - odmładzana ramka */
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;
}
/* Funkcja postarzająca ramkę.
* Zmniejsza wartość pola page->age o stałą PAGE_DECLINE
* Parametr page - odmładzana ramka */
static inline void age_page(struct page *page)
{
if (page->age > PAGE_DECLINE)
page->age -= PAGE_DECLINE;
else
page->age = 0;
}
/* Funkcja zwraca wiek ramki o adresie: addr */
static inline int age_of(unsigned long addr)
{
return mem_map[MAP_NR(addr)].age;
}
/* Funkcja inicjująca wiek ramki o adresie:addr na stałą PAGE_INITIAL_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 */
Autor : Radosław Rudzki