亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? swap.c

?? linux 1.0 源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* *  linux/mm/swap.c * *  Copyright (C) 1991, 1992  Linus Torvalds *//* * This file should contain most things doing the swapping from/to disk. * Started 18.12.91 */#include <linux/mm.h>#include <linux/sched.h>#include <linux/head.h>#include <linux/kernel.h>#include <linux/kernel_stat.h>#include <linux/errno.h>#include <linux/string.h>#include <linux/stat.h>#include <asm/system.h> /* for cli()/sti() */#include <asm/bitops.h>#define MAX_SWAPFILES 8#define SWP_USED	1#define SWP_WRITEOK	3#define SWP_TYPE(entry) (((entry) & 0xfe) >> 1)#define SWP_OFFSET(entry) ((entry) >> PAGE_SHIFT)#define SWP_ENTRY(type,offset) (((type) << 1) | ((offset) << PAGE_SHIFT))static int nr_swapfiles = 0;static struct wait_queue * lock_queue = NULL;static struct swap_info_struct {	unsigned long flags;	struct inode * swap_file;	unsigned int swap_device;	unsigned char * swap_map;	unsigned char * swap_lockmap;	int pages;	int lowest_bit;	int highest_bit;	unsigned long max;} swap_info[MAX_SWAPFILES];extern unsigned long free_page_list;extern int shm_swap (int);/* * The following are used to make sure we don't thrash too much... * NOTE!! NR_LAST_FREE_PAGES must be a power of 2... */#define NR_LAST_FREE_PAGES 32static unsigned long last_free_pages[NR_LAST_FREE_PAGES] = {0,};void rw_swap_page(int rw, unsigned long entry, char * buf){	unsigned long type, offset;	struct swap_info_struct * p;	type = SWP_TYPE(entry);	if (type >= nr_swapfiles) {		printk("Internal error: bad swap-device\n");		return;	}	p = &swap_info[type];	offset = SWP_OFFSET(entry);	if (offset >= p->max) {		printk("rw_swap_page: weirdness\n");		return;	}	if (!(p->flags & SWP_USED)) {		printk("Trying to swap to unused swap-device\n");		return;	}	while (set_bit(offset,p->swap_lockmap))		sleep_on(&lock_queue);	if (rw == READ)		kstat.pswpin++;	else		kstat.pswpout++;	if (p->swap_device) {		ll_rw_page(rw,p->swap_device,offset,buf);	} else if (p->swap_file) {		unsigned int zones[8];		unsigned int block;		int i, j;		block = offset << (12 - p->swap_file->i_sb->s_blocksize_bits);		for (i=0, j=0; j< PAGE_SIZE ; i++, j +=p->swap_file->i_sb->s_blocksize)			if (!(zones[i] = bmap(p->swap_file,block++))) {				printk("rw_swap_page: bad swap file\n");				return;			}		ll_rw_swap_file(rw,p->swap_file->i_dev, zones, i,buf);	} else		printk("re_swap_page: no swap file or device\n");	if (offset && !clear_bit(offset,p->swap_lockmap))		printk("rw_swap_page: lock already cleared\n");	wake_up(&lock_queue);}unsigned int get_swap_page(void){	struct swap_info_struct * p;	unsigned int offset, type;	p = swap_info;	for (type = 0 ; type < nr_swapfiles ; type++,p++) {		if ((p->flags & SWP_WRITEOK) != SWP_WRITEOK)			continue;		for (offset = p->lowest_bit; offset <= p->highest_bit ; offset++) {			if (p->swap_map[offset])				continue;			p->swap_map[offset] = 1;			nr_swap_pages--;			if (offset == p->highest_bit)				p->highest_bit--;			p->lowest_bit = offset;			return SWP_ENTRY(type,offset);		}	}	return 0;}unsigned long swap_duplicate(unsigned long entry){	struct swap_info_struct * p;	unsigned long offset, type;	if (!entry)		return 0;	offset = SWP_OFFSET(entry);	type = SWP_TYPE(entry);	if (type == SHM_SWP_TYPE)		return entry;	if (type >= nr_swapfiles) {		printk("Trying to duplicate nonexistent swap-page\n");		return 0;	}	p = type + swap_info;	if (offset >= p->max) {		printk("swap_free: weirdness\n");		return 0;	}	if (!p->swap_map[offset]) {		printk("swap_duplicate: trying to duplicate unused page\n");		return 0;	}	p->swap_map[offset]++;	return entry;}void swap_free(unsigned long entry){	struct swap_info_struct * p;	unsigned long offset, type;	if (!entry)		return;	type = SWP_TYPE(entry);	if (type == SHM_SWP_TYPE)		return;	if (type >= nr_swapfiles) {		printk("Trying to free nonexistent swap-page\n");		return;	}	p = & swap_info[type];	offset = SWP_OFFSET(entry);	if (offset >= p->max) {		printk("swap_free: weirdness\n");		return;	}	if (!(p->flags & SWP_USED)) {		printk("Trying to free swap from unused swap-device\n");		return;	}	while (set_bit(offset,p->swap_lockmap))		sleep_on(&lock_queue);	if (offset < p->lowest_bit)		p->lowest_bit = offset;	if (offset > p->highest_bit)		p->highest_bit = offset;	if (!p->swap_map[offset])		printk("swap_free: swap-space map bad (entry %08lx)\n",entry);	else		if (!--p->swap_map[offset])			nr_swap_pages++;	if (!clear_bit(offset,p->swap_lockmap))		printk("swap_free: lock already cleared\n");	wake_up(&lock_queue);}void swap_in(unsigned long *table_ptr){	unsigned long entry;	unsigned long page;	entry = *table_ptr;	if (PAGE_PRESENT & entry) {		printk("trying to swap in present page\n");		return;	}	if (!entry) {		printk("No swap page in swap_in\n");		return;	}	if (SWP_TYPE(entry) == SHM_SWP_TYPE) {		shm_no_page ((unsigned long *) table_ptr);		return;	}	if (!(page = get_free_page(GFP_KERNEL))) {		oom(current);		page = BAD_PAGE;	} else			read_swap_page(entry, (char *) page);	if (*table_ptr != entry) {		free_page(page);		return;	}	*table_ptr = page | (PAGE_DIRTY | PAGE_PRIVATE);	swap_free(entry);}static inline int try_to_swap_out(unsigned long * table_ptr){	int i;	unsigned long page;	unsigned long entry;	page = *table_ptr;	if (!(PAGE_PRESENT & page))		return 0;	if (page >= high_memory)		return 0;	if (mem_map[MAP_NR(page)] & MAP_PAGE_RESERVED)		return 0;	if (PAGE_ACCESSED & page) {		*table_ptr &= ~PAGE_ACCESSED;		return 0;	}	for (i = 0; i < NR_LAST_FREE_PAGES; i++)		if (last_free_pages[i] == (page & PAGE_MASK))			return 0;	if (PAGE_DIRTY & page) {		page &= PAGE_MASK;		if (mem_map[MAP_NR(page)] != 1)			return 0;		if (!(entry = get_swap_page()))			return 0;		*table_ptr = entry;		invalidate();		write_swap_page(entry, (char *) page);		free_page(page);		return 1;	}	page &= PAGE_MASK;	*table_ptr = 0;	invalidate();	free_page(page);	return 1 + mem_map[MAP_NR(page)];}/* * sys_idle() does nothing much: it just searches for likely candidates for * swapping out or forgetting about. This speeds up the search when we * actually have to swap. */asmlinkage int sys_idle(void){	need_resched = 1;	return 0;}/* * A new implementation of swap_out().  We do not swap complete processes, * but only a small number of blocks, before we continue with the next * process.  The number of blocks actually swapped is determined on the * number of page faults, that this process actually had in the last time, * so we won't swap heavily used processes all the time ... * * Note: the priority argument is a hint on much CPU to waste with the *       swap block search, not a hint, of how much blocks to swap with *       each process. * * (C) 1993 Kai Petzke, wpp@marie.physik.tu-berlin.de */#ifdef NEW_SWAP/* * These are the miminum and maximum number of pages to swap from one process, * before proceeding to the next: */#define SWAP_MIN	4#define SWAP_MAX	32/* * The actual number of pages to swap is determined as: * SWAP_RATIO / (number of recent major page faults) */#define SWAP_RATIO	128static int swap_out(unsigned int priority){    static int swap_task;    int table;    int page;    long pg_table;    int loop;    int counter = NR_TASKS * 2 >> priority;    struct task_struct *p;    counter = NR_TASKS * 2 >> priority;    for(; counter >= 0; counter--, swap_task++) {	/*	 * Check that swap_task is suitable for swapping.  If not, look for	 * the next suitable process.	 */	loop = 0;	while(1) {	    if(swap_task >= NR_TASKS) {		swap_task = 1;		if(loop)		    /* all processes are unswappable or already swapped out */		    return 0;		loop = 1;	    }	    p = task[swap_task];	    if(p && p->swappable && p->rss)		break;	    swap_task++;	}	/*	 * Determine the number of pages to swap from this process.	 */	if(! p -> swap_cnt) {	    p->dec_flt = (p->dec_flt * 3) / 4 + p->maj_flt - p->old_maj_flt;	    p->old_maj_flt = p->maj_flt;	    if(p->dec_flt >= SWAP_RATIO / SWAP_MIN) {		p->dec_flt = SWAP_RATIO / SWAP_MIN;		p->swap_cnt = SWAP_MIN;	    } else if(p->dec_flt <= SWAP_RATIO / SWAP_MAX)		p->swap_cnt = SWAP_MAX;	    else		p->swap_cnt = SWAP_RATIO / p->dec_flt;	}	/*	 * Go through process' page directory.	 */	for(table = p->swap_table; table < 1024; table++) {	    pg_table = ((unsigned long *) p->tss.cr3)[table];	    if(pg_table >= high_memory)		    continue;	    if(mem_map[MAP_NR(pg_table)] & MAP_PAGE_RESERVED)		    continue;	    if(!(PAGE_PRESENT & pg_table)) {		    printk("swap_out: bad page-table at pg_dir[%d]: %08lx\n",			    table, pg_table);		    ((unsigned long *) p->tss.cr3)[table] = 0;		    continue;	    }	    pg_table &= 0xfffff000;	    /*	     * Go through this page table.	     */	    for(page = p->swap_page; page < 1024; page++) {		switch(try_to_swap_out(page + (unsigned long *) pg_table)) {		    case 0:			break;		    case 1:			p->rss--;			/* continue with the following page the next time */			p->swap_table = table;			p->swap_page  = page + 1;			if((--p->swap_cnt) == 0)			    swap_task++;			return 1;		    default:			p->rss--;			break;		}	    }	    p->swap_page = 0;	}	/*	 * Finish work with this process, if we reached the end of the page	 * directory.  Mark restart from the beginning the next time.	 */	p->swap_table = 0;    }    return 0;}#else /* old swapping procedure *//* * Go through the page tables, searching for a user page that * we can swap out. *  * We now check that the process is swappable (normally only 'init' * is un-swappable), allowing high-priority processes which cannot be * swapped out (things like user-level device drivers (Not implemented)). */static int swap_out(unsigned int priority){	static int swap_task = 1;	static int swap_table = 0;	static int swap_page = 0;	int counter = NR_TASKS*8;	int pg_table;	struct task_struct * p;	counter >>= priority;check_task:	if (counter-- < 0)		return 0;	if (swap_task >= NR_TASKS) {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美三级韩国三级日本一级| 国产成人精品在线看| 亚洲欧洲另类国产综合| 久久久青草青青国产亚洲免观| 欧美一区二区网站| 91精品国产综合久久久蜜臀粉嫩 | 91激情五月电影| 99久久精品免费观看| 色综合视频一区二区三区高清| 91麻豆6部合集magnet| 91高清在线观看| 欧美疯狂做受xxxx富婆| 精品国产sm最大网站| 日韩精品一区二区在线观看| 久久久av毛片精品| 亚洲欧洲av在线| 亚洲成人av福利| 精品午夜久久福利影院| 成人aa视频在线观看| 在线视频综合导航| 欧美一级专区免费大片| 国产视频一区在线播放| 17c精品麻豆一区二区免费| 亚洲图片欧美视频| 狠狠色狠狠色综合系列| 波多野结衣91| 欧美一区二区三区四区高清| 欧美成人在线直播| 自拍偷自拍亚洲精品播放| 午夜精品久久久久久久99水蜜桃 | 成人av在线播放网址| 欧美亚洲高清一区| 国产欧美一区二区三区在线看蜜臀 | 欧美丝袜自拍制服另类| 欧美精品一区二区久久婷婷| 中文字幕一区二区三区不卡| 丝袜脚交一区二区| 97se亚洲国产综合自在线| 制服丝袜亚洲色图| 自拍偷在线精品自拍偷无码专区| 日本欧美一区二区三区乱码| 成人免费不卡视频| 久久一区二区三区国产精品| 亚洲一二三区不卡| 成人avav影音| 久久蜜臀精品av| 奇米影视在线99精品| 91一区一区三区| 国产午夜精品一区二区三区视频 | 亚洲国产成人自拍| 天天综合天天做天天综合| 99久久99久久免费精品蜜臀| 精品精品欲导航| 亚洲一区二区五区| 色呦呦日韩精品| 国产精品毛片久久久久久| 精品一区二区三区影院在线午夜 | 制服丝袜激情欧洲亚洲| 一区二区三区丝袜| 成人网页在线观看| 久久久亚洲精品石原莉奈| 美女www一区二区| 欧美一区二区三区电影| 亚洲福利视频三区| 欧洲色大大久久| 夜夜嗨av一区二区三区中文字幕| 成人性视频免费网站| 精品对白一区国产伦| 精品写真视频在线观看| 日韩欧美国产一区在线观看| 日本不卡一二三| 日韩视频一区二区| 免播放器亚洲一区| 日韩免费观看高清完整版| 日韩成人免费看| 日韩一区二区在线观看视频播放| 性做久久久久久免费观看| 欧美巨大另类极品videosbest | 欧美自拍丝袜亚洲| 亚洲自拍都市欧美小说| 欧美亚男人的天堂| 日韩精品亚洲一区二区三区免费| 欧美日韩国产首页| 奇米影视在线99精品| 久久众筹精品私拍模特| 成人午夜伦理影院| 又紧又大又爽精品一区二区| 欧日韩精品视频| 免费成人av在线| 久久综合成人精品亚洲另类欧美 | 欧美精品v国产精品v日韩精品| 日韩一区精品字幕| 精品国产一区二区三区久久影院| 精品一区中文字幕| 亚洲欧洲成人自拍| 欧美探花视频资源| 国产综合成人久久大片91| 亚洲国产精品黑人久久久| 在线视频你懂得一区二区三区| 亚洲电影视频在线| 国产欧美一区二区精品忘忧草| 91污片在线观看| 天堂蜜桃91精品| 国产精品全国免费观看高清| 欧美日韩久久一区| 国产精品 欧美精品| 曰韩精品一区二区| 精品国产1区二区| 色播五月激情综合网| 精东粉嫩av免费一区二区三区| 亚洲色大成网站www久久九九| 欧美伦理影视网| 岛国av在线一区| 日韩电影一区二区三区四区| 中文字幕国产精品一区二区| 欧美一区二区三区电影| 99久久国产综合色|国产精品| 欧美aaa在线| 亚洲已满18点击进入久久| 久久久久久久久久久99999| 色婷婷综合在线| 成人少妇影院yyyy| 麻豆传媒一区二区三区| 亚洲自拍偷拍图区| 国产精品国产自产拍在线| 精品人在线二区三区| 欧美女孩性生活视频| www.久久久久久久久| 国产一区二区三区高清播放| 亚欧色一区w666天堂| 一区二区三区中文字幕精品精品| 久久久精品天堂| 日韩精品一区二| 欧美高清hd18日本| 欧美天堂一区二区三区| 91丨porny丨国产入口| 国产suv一区二区三区88区| 精品影视av免费| 精品制服美女久久| 伦理电影国产精品| 久久精品国产精品亚洲精品| 天堂av在线一区| 午夜精品久久久| 午夜精品久久久久久久99樱桃| 亚洲精品日韩专区silk| 成人免费在线视频| 成人免费在线视频| 亚洲素人一区二区| 亚洲另类一区二区| 一区二区三区在线免费播放 | 日韩成人精品在线观看| 亚洲高清免费在线| 视频精品一区二区| 日韩激情一二三区| 蜜桃传媒麻豆第一区在线观看| 亚洲18色成人| 免费人成网站在线观看欧美高清| 亚洲成人av中文| 日韩国产精品大片| 狠狠色综合日日| 国产69精品久久777的优势| 99久久精品99国产精品| 在线精品国精品国产尤物884a| 欧美午夜电影在线播放| 欧美一区二区三区不卡| 久久亚洲二区三区| 中文字幕在线一区二区三区| 日韩美女啊v在线免费观看| 亚洲一级二级在线| 六月丁香综合在线视频| 国产成人精品综合在线观看| 99精品久久99久久久久| 欧美性做爰猛烈叫床潮| 欧美成人伊人久久综合网| 国产女人aaa级久久久级| 亚洲男女毛片无遮挡| 三级欧美韩日大片在线看| 国产精品一线二线三线精华| av电影一区二区| 欧美精品高清视频| 久久久精品欧美丰满| 夜夜嗨av一区二区三区| 久色婷婷小香蕉久久| av成人免费在线| 日韩一区二区三区av| 中文av字幕一区| 青青草精品视频| 91免费国产在线观看| 日韩一区国产二区欧美三区| 亚洲欧洲日韩综合一区二区| 日本91福利区| 91免费视频大全| 久久久高清一区二区三区| 亚洲一区二三区| 国产suv一区二区三区88区| 欧美精品aⅴ在线视频| 中文字幕日韩精品一区| 麻豆精品久久精品色综合| 色94色欧美sute亚洲线路一ni| 精品黑人一区二区三区久久|