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

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

?? swap.c

?? linux 1.0 源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
		swap_task = 1;		goto check_task;	}	p = task[swap_task];	if (!p || !p->swappable) {		swap_task++;		goto check_task;	}check_dir:	if (swap_table >= PTRS_PER_PAGE) {		swap_table = 0;		swap_task++;		goto check_task;	}	pg_table = ((unsigned long *) p->tss.cr3)[swap_table];	if (pg_table >= high_memory || (mem_map[MAP_NR(pg_table)] & MAP_PAGE_RESERVED)) {		swap_table++;		goto check_dir;	}	if (!(PAGE_PRESENT & pg_table)) {		printk("bad page-table at pg_dir[%d]: %08x\n",			swap_table,pg_table);		((unsigned long *) p->tss.cr3)[swap_table] = 0;		swap_table++;		goto check_dir;	}	pg_table &= PAGE_MASK;check_table:	if (swap_page >= PTRS_PER_PAGE) {		swap_page = 0;		swap_table++;		goto check_dir;	}	switch (try_to_swap_out(swap_page + (unsigned long *) pg_table)) {		case 0: break;		case 1: p->rss--; return 1;		default: p->rss--;	}	swap_page++;	goto check_table;}#endifstatic int try_to_free_page(void){	int i=6;	while (i--) {		if (shrink_buffers(i))			return 1;		if (shm_swap(i))			return 1;		if (swap_out(i))			return 1;	}	return 0;}/* * Note that this must be atomic, or bad things will happen when * pages are requested in interrupts (as malloc can do). Thus the * cli/sti's. */static inline void add_mem_queue(unsigned long addr, unsigned long * queue){	addr &= PAGE_MASK;	*(unsigned long *) addr = *queue;	*queue = addr;}/* * Free_page() adds the page to the free lists. This is optimized for * fast normal cases (no error jumps taken normally). * * The way to optimize jumps for gcc-2.2.2 is to: *  - select the "normal" case and put it inside the if () { XXX } *  - no else-statements if you can avoid them * * With the above two rules, you get a straight-line execution path * for the normal case, giving better asm-code. */void free_page(unsigned long addr){	if (addr < high_memory) {		unsigned short * map = mem_map + MAP_NR(addr);		if (*map) {			if (!(*map & MAP_PAGE_RESERVED)) {				unsigned long flag;				save_flags(flag);				cli();				if (!--*map) {					if (nr_secondary_pages < MAX_SECONDARY_PAGES) {						add_mem_queue(addr,&secondary_page_list);						nr_secondary_pages++;						restore_flags(flag);						return;					}					add_mem_queue(addr,&free_page_list);					nr_free_pages++;				}				restore_flags(flag);			}			return;		}		printk("Trying to free free memory (%08lx): memory probabably corrupted\n",addr);		printk("PC = %08lx\n",*(((unsigned long *)&addr)-1));		return;	}}/* * This is one ugly macro, but it simplifies checking, and makes * this speed-critical place reasonably fast, especially as we have * to do things with the interrupt flag etc. * * Note that this #define is heavily optimized to give fast code * for the normal case - the if-statements are ordered so that gcc-2.2.2 * will make *no* jumps for the normal code. Don't touch unless you * know what you are doing. */#define REMOVE_FROM_MEM_QUEUE(queue,nr) \	cli(); \	if ((result = queue) != 0) { \		if (!(result & ~PAGE_MASK) && result < high_memory) { \			queue = *(unsigned long *) result; \			if (!mem_map[MAP_NR(result)]) { \				mem_map[MAP_NR(result)] = 1; \				nr--; \last_free_pages[index = (index + 1) & (NR_LAST_FREE_PAGES - 1)] = result; \				restore_flags(flag); \				return result; \			} \			printk("Free page %08lx has mem_map = %d\n", \				result,mem_map[MAP_NR(result)]); \		} else \			printk("Result = 0x%08lx - memory map destroyed\n", result); \		queue = 0; \		nr = 0; \	} else if (nr) { \		printk(#nr " is %d, but " #queue " is empty\n",nr); \		nr = 0; \	} \	restore_flags(flag)/* * Get physical address of first (actually last :-) free page, and mark it * used. If no free pages left, return 0. * * Note that this is one of the most heavily called functions in the kernel, * so it's a bit timing-critical (especially as we have to disable interrupts * in it). See the above macro which does most of the work, and which is * optimized for a fast normal path of execution. */unsigned long __get_free_page(int priority){	extern unsigned long intr_count;	unsigned long result, flag;	static unsigned long index = 0;	/* this routine can be called at interrupt time via	   malloc.  We want to make sure that the critical	   sections of code have interrupts disabled. -RAB	   Is this code reentrant? */	if (intr_count && priority != GFP_ATOMIC) {		printk("gfp called nonatomically from interrupt %08lx\n",			((unsigned long *)&priority)[-1]);		priority = GFP_ATOMIC;	}	save_flags(flag);repeat:	REMOVE_FROM_MEM_QUEUE(free_page_list,nr_free_pages);	if (priority == GFP_BUFFER)		return 0;	if (priority != GFP_ATOMIC)		if (try_to_free_page())			goto repeat;	REMOVE_FROM_MEM_QUEUE(secondary_page_list,nr_secondary_pages);	return 0;}/* * Trying to stop swapping from a file is fraught with races, so * we repeat quite a bit here when we have to pause. swapoff() * isn't exactly timing-critical, so who cares? */static int try_to_unuse(unsigned int type){	int nr, pgt, pg;	unsigned long page, *ppage;	unsigned long tmp = 0;	struct task_struct *p;	nr = 0;/* * When we have to sleep, we restart the whole algorithm from the same * task we stopped in. That at least rids us of all races. */repeat:	for (; nr < NR_TASKS ; nr++) {		p = task[nr];		if (!p)			continue;		for (pgt = 0 ; pgt < PTRS_PER_PAGE ; pgt++) {			ppage = pgt + ((unsigned long *) p->tss.cr3);			page = *ppage;			if (!page)				continue;			if (!(page & PAGE_PRESENT) || (page >= high_memory))				continue;			if (mem_map[MAP_NR(page)] & MAP_PAGE_RESERVED)				continue;			ppage = (unsigned long *) (page & PAGE_MASK);				for (pg = 0 ; pg < PTRS_PER_PAGE ; pg++,ppage++) {				page = *ppage;				if (!page)					continue;				if (page & PAGE_PRESENT)					continue;				if (SWP_TYPE(page) != type)					continue;				if (!tmp) {					if (!(tmp = __get_free_page(GFP_KERNEL)))						return -ENOMEM;					goto repeat;				}				read_swap_page(page, (char *) tmp);				if (*ppage == page) {					*ppage = tmp | (PAGE_DIRTY | PAGE_PRIVATE);					++p->rss;					swap_free(page);					tmp = 0;				}				goto repeat;			}		}	}	free_page(tmp);	return 0;}asmlinkage int sys_swapoff(const char * specialfile){	struct swap_info_struct * p;	struct inode * inode;	unsigned int type;	int i;	if (!suser())		return -EPERM;	i = namei(specialfile,&inode);	if (i)		return i;	p = swap_info;	for (type = 0 ; type < nr_swapfiles ; type++,p++) {		if ((p->flags & SWP_WRITEOK) != SWP_WRITEOK)			continue;		if (p->swap_file) {			if (p->swap_file == inode)				break;		} else {			if (!S_ISBLK(inode->i_mode))				continue;			if (p->swap_device == inode->i_rdev)				break;		}	}	iput(inode);	if (type >= nr_swapfiles)		return -EINVAL;	p->flags = SWP_USED;	i = try_to_unuse(type);	if (i) {		p->flags = SWP_WRITEOK;		return i;	}	nr_swap_pages -= p->pages;	iput(p->swap_file);	p->swap_file = NULL;	p->swap_device = 0;	vfree(p->swap_map);	p->swap_map = NULL;	free_page((long) p->swap_lockmap);	p->swap_lockmap = NULL;	p->flags = 0;	return 0;}/* * Written 01/25/92 by Simmule Turner, heavily changed by Linus. * * The swapon system call */asmlinkage int sys_swapon(const char * specialfile){	struct swap_info_struct * p;	struct inode * swap_inode;	unsigned int type;	int i,j;	int error;	if (!suser())		return -EPERM;	p = swap_info;	for (type = 0 ; type < nr_swapfiles ; type++,p++)		if (!(p->flags & SWP_USED))			break;	if (type >= MAX_SWAPFILES)		return -EPERM;	if (type >= nr_swapfiles)		nr_swapfiles = type+1;	p->flags = SWP_USED;	p->swap_file = NULL;	p->swap_device = 0;	p->swap_map = NULL;	p->swap_lockmap = NULL;	p->lowest_bit = 0;	p->highest_bit = 0;	p->max = 1;	error = namei(specialfile,&swap_inode);	if (error)		goto bad_swap;	error = -EBUSY;	if (swap_inode->i_count != 1)		goto bad_swap;	error = -EINVAL;	if (S_ISBLK(swap_inode->i_mode)) {		p->swap_device = swap_inode->i_rdev;		iput(swap_inode);		error = -ENODEV;		if (!p->swap_device)			goto bad_swap;		error = -EBUSY;		for (i = 0 ; i < nr_swapfiles ; i++) {			if (i == type)				continue;			if (p->swap_device == swap_info[i].swap_device)				goto bad_swap;		}	} else if (S_ISREG(swap_inode->i_mode))		p->swap_file = swap_inode;	else		goto bad_swap;	p->swap_lockmap = (unsigned char *) get_free_page(GFP_USER);	if (!p->swap_lockmap) {		printk("Unable to start swapping: out of memory :-)\n");		error = -ENOMEM;		goto bad_swap;	}	read_swap_page(SWP_ENTRY(type,0), (char *) p->swap_lockmap);	if (memcmp("SWAP-SPACE",p->swap_lockmap+4086,10)) {		printk("Unable to find swap-space signature\n");		error = -EINVAL;		goto bad_swap;	}	memset(p->swap_lockmap+PAGE_SIZE-10,0,10);	j = 0;	p->lowest_bit = 0;	p->highest_bit = 0;	for (i = 1 ; i < 8*PAGE_SIZE ; i++) {		if (test_bit(i,p->swap_lockmap)) {			if (!p->lowest_bit)				p->lowest_bit = i;			p->highest_bit = i;			p->max = i+1;			j++;		}	}	if (!j) {		printk("Empty swap-file\n");		error = -EINVAL;		goto bad_swap;	}	p->swap_map = (unsigned char *) vmalloc(p->max);	if (!p->swap_map) {		error = -ENOMEM;		goto bad_swap;	}	for (i = 1 ; i < p->max ; i++) {		if (test_bit(i,p->swap_lockmap))			p->swap_map[i] = 0;		else			p->swap_map[i] = 0x80;	}	p->swap_map[0] = 0x80;	memset(p->swap_lockmap,0,PAGE_SIZE);	p->flags = SWP_WRITEOK;	p->pages = j;	nr_swap_pages += j;	printk("Adding Swap: %dk swap-space\n",j<<2);	return 0;bad_swap:	free_page((long) p->swap_lockmap);	vfree(p->swap_map);	iput(p->swap_file);	p->swap_device = 0;	p->swap_file = NULL;	p->swap_map = NULL;	p->swap_lockmap = NULL;	p->flags = 0;	return error;}void si_swapinfo(struct sysinfo *val){	unsigned int i, j;	val->freeswap = val->totalswap = 0;	for (i = 0; i < nr_swapfiles; i++) {		if (!(swap_info[i].flags & SWP_USED))			continue;		for (j = 0; j < swap_info[i].max; ++j)			switch (swap_info[i].swap_map[j]) {				case 128:					continue;				case 0:					++val->freeswap;				default:					++val->totalswap;			}	}	val->freeswap <<= PAGE_SHIFT;	val->totalswap <<= PAGE_SHIFT;	return;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
不卡视频在线观看| 国产盗摄一区二区| 欧美精品久久久久久久多人混战| 日本在线不卡视频| 欧美一区二区免费| 国产一区二区精品久久91| 国产精品无人区| 在线亚洲欧美专区二区| 日韩成人免费电影| 欧美一区二区三区视频在线观看 | 亚州成人在线电影| 欧美男女性生活在线直播观看| 久久综合九色综合欧美亚洲| 国产成人免费在线视频| 亚洲精品高清视频在线观看| 777午夜精品免费视频| 国产乱一区二区| 一区二区三区视频在线看| 欧美日韩综合色| 国内精品自线一区二区三区视频| 欧美精品久久一区| 国产91在线观看丝袜| 亚洲美女视频在线| 日韩免费成人网| 懂色av一区二区三区蜜臀| 亚洲男帅同性gay1069| 91精品午夜视频| 成人白浆超碰人人人人| 视频一区视频二区在线观看| 久久久99免费| 欧美日韩国产另类不卡| 懂色av一区二区夜夜嗨| 日本成人在线一区| 亚洲人成网站色在线观看| 欧美成人精品3d动漫h| 色综合天天综合网国产成人综合天 | 欧美伊人久久久久久久久影院 | 成人午夜免费视频| 国产一区视频网站| 亚洲福利一区二区| 成人欧美一区二区三区白人| 日韩丝袜情趣美女图片| 91香蕉视频黄| 国产精品一区二区91| 性做久久久久久免费观看| 国产精品福利av| 久久综合一区二区| 欧美一区二区三区在线| 91福利社在线观看| 99热这里都是精品| 国产精品影视天天线| 日韩国产精品大片| 一区二区在线看| 亚洲欧洲美洲综合色网| 久久久噜噜噜久久人人看| 91精品中文字幕一区二区三区| 亚洲国产成人精品视频| 久久先锋影音av| 日韩一区二区在线观看视频播放| 精品一区二区三区香蕉蜜桃| 五月天激情小说综合| 一区二区视频在线看| 自拍偷在线精品自拍偷无码专区| 日本大香伊一区二区三区| 成人一区二区三区视频在线观看| 国产精品萝li| 国产三区在线成人av| 欧美精品色一区二区三区| 欧美日韩不卡一区| 欧美精品18+| 制服丝袜在线91| 欧美久久久久久久久久| 欧美精品亚洲二区| 91精品国产黑色紧身裤美女| 欧美另类一区二区三区| 欧美特级限制片免费在线观看| 日韩有码一区二区三区| 日韩av午夜在线观看| 亚洲国产一区视频| 婷婷久久综合九色综合绿巨人 | 美国十次了思思久久精品导航| 久久久亚洲国产美女国产盗摄 | 欧美一区二区三区思思人| 欧美日韩中文字幕一区二区| 欧美乱熟臀69xxxxxx| 555www色欧美视频| 欧美变态tickle挠乳网站| 精品久久五月天| www久久精品| 国产视频一区二区在线观看| 国产精品久久久99| 伊人开心综合网| 日韩av在线免费观看不卡| 麻豆成人久久精品二区三区小说| 中文字幕一区日韩精品欧美| 亚洲美女淫视频| 日日摸夜夜添夜夜添精品视频| 国产日产欧美一区二区视频| 中文在线资源观看网站视频免费不卡| 欧美视频一区二| 亚洲成人免费影院| 美国精品在线观看| 粉嫩av一区二区三区| 91免费视频大全| 日韩欧美电影在线| 久久久91精品国产一区二区精品 | 国模无码大尺度一区二区三区| 艳妇臀荡乳欲伦亚洲一区| 天天综合网天天综合色| 国产一区二区精品久久| 在线一区二区视频| 精品欧美久久久| 亚洲日本丝袜连裤袜办公室| 美女在线一区二区| 风间由美中文字幕在线看视频国产欧美| 日韩精品福利网| 成人黄色av电影| 69av一区二区三区| 国产精品久久久爽爽爽麻豆色哟哟| 日韩欧美在线1卡| 国产精品欧美久久久久无广告 | 一区在线播放视频| 日韩av中文在线观看| 成人小视频免费在线观看| 欧美日本一区二区在线观看| 国产欧美综合色| 丝袜a∨在线一区二区三区不卡 | 午夜欧美在线一二页| 国产成人综合网站| 日韩一区二区在线看片| 亚洲视频精选在线| 国产一区二区久久| 91.com视频| 亚洲丝袜制服诱惑| 国产又粗又猛又爽又黄91精品| 蜜臀精品久久久久久蜜臀| 99久久er热在这里只有精品66| 高清国产午夜精品久久久久久| 国产精品 日产精品 欧美精品| 国产老妇另类xxxxx| 制服丝袜中文字幕一区| 一区二区三区中文字幕| 粉嫩一区二区三区在线看| 日韩欧美一区二区久久婷婷| 性感美女极品91精品| 成人av资源站| 欧美激情一区二区| 韩国av一区二区| 欧美大片国产精品| 性做久久久久久免费观看| 91国偷自产一区二区开放时间| 在线不卡一区二区| 亚洲一区二区成人在线观看| 91麻豆国产精品久久| 国产精品久久久久影院亚瑟| 国产999精品久久| 欧美刺激脚交jootjob| 日韩国产欧美三级| 在线免费观看一区| 亚洲精品国产a| 色哟哟国产精品| 亚洲美女屁股眼交3| 99国产精品久久久| 亚洲精品v日韩精品| 一本久久综合亚洲鲁鲁五月天 | 国产精品一线二线三线| 欧美一卡二卡三卡| 麻豆91精品91久久久的内涵| 欧美精选一区二区| 色噜噜狠狠成人中文综合 | 美国三级日本三级久久99| 9191精品国产综合久久久久久| 欧美α欧美αv大片| 精品一区二区影视| 久久精品夜夜夜夜久久| 成人综合婷婷国产精品久久蜜臀 | 欧美在线影院一区二区| 亚洲一区在线观看视频| 欧美日韩国产免费一区二区| 日本午夜一区二区| 日韩精品在线一区| 国产成人亚洲精品青草天美| 国产精品短视频| 在线观看一区二区视频| 婷婷中文字幕综合| 欧美大片在线观看| 高清不卡一区二区| 一区二区三区在线观看视频| 欧美日韩激情一区| 激情文学综合丁香| 成人免费在线观看入口| 欧美日韩免费一区二区三区| 另类小说欧美激情| 亚洲国产精品激情在线观看| 97精品国产97久久久久久久久久久久| 欧美一级在线视频| 成人美女视频在线看| 亚洲一区在线观看免费观看电影高清 | 欧美日韩在线三级| 久久国产精品99精品国产|