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

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

?? deadline-iosched.c

?? Linux Kernel 2.6.9 for OMAP1710
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* *  linux/drivers/block/deadline-iosched.c * *  Deadline i/o scheduler. * *  Copyright (C) 2002 Jens Axboe <axboe@suse.de> */#include <linux/kernel.h>#include <linux/fs.h>#include <linux/blkdev.h>#include <linux/elevator.h>#include <linux/bio.h>#include <linux/config.h>#include <linux/module.h>#include <linux/slab.h>#include <linux/init.h>#include <linux/compiler.h>#include <linux/hash.h>#include <linux/rbtree.h>/* * See Documentation/deadline-iosched.txt */static int read_expire = HZ / 2;  /* max time before a read is submitted. */static int write_expire = 5 * HZ; /* ditto for writes, these limits are SOFT! */static int writes_starved = 2;    /* max times reads can starve a write */static int fifo_batch = 16;       /* # of sequential requests treated as one				     by the above parameters. For throughput. */static const int deadline_hash_shift = 5;#define DL_HASH_BLOCK(sec)	((sec) >> 3)#define DL_HASH_FN(sec)		(hash_long(DL_HASH_BLOCK((sec)), deadline_hash_shift))#define DL_HASH_ENTRIES		(1 << deadline_hash_shift)#define rq_hash_key(rq)		((rq)->sector + (rq)->nr_sectors)#define list_entry_hash(ptr)	list_entry((ptr), struct deadline_rq, hash)#define ON_HASH(drq)		(drq)->on_hashstruct deadline_data {	/*	 * run time data	 */	/*	 * requests (deadline_rq s) are present on both sort_list and fifo_list	 */	struct rb_root sort_list[2];		struct list_head fifo_list[2];		/*	 * next in sort order. read, write or both are NULL	 */	struct deadline_rq *next_drq[2];	struct list_head *dispatch;	/* driver dispatch queue */	struct list_head *hash;		/* request hash */	unsigned int batching;		/* number of sequential requests made */	sector_t last_sector;		/* head position */	unsigned int starved;		/* times reads have starved writes */	/*	 * settings that change how the i/o scheduler behaves	 */	int fifo_expire[2];	int fifo_batch;	int writes_starved;	int front_merges;	mempool_t *drq_pool;};/* * pre-request data. */struct deadline_rq {	/*	 * rbtree index, key is the starting offset	 */	struct rb_node rb_node;	sector_t rb_key;	struct request *request;	/*	 * request hash, key is the ending offset (for back merge lookup)	 */	struct list_head hash;	char on_hash;	/*	 * expire fifo	 */	struct list_head fifo;	unsigned long expires;};static void deadline_move_request(struct deadline_data *dd, struct deadline_rq *drq);static kmem_cache_t *drq_pool;#define RQ_DATA(rq)	((struct deadline_rq *) (rq)->elevator_private)/* * the back merge hash support functions */static inline void __deadline_del_drq_hash(struct deadline_rq *drq){	drq->on_hash = 0;	list_del_init(&drq->hash);}static inline void deadline_del_drq_hash(struct deadline_rq *drq){	if (ON_HASH(drq))		__deadline_del_drq_hash(drq);}static voiddeadline_remove_merge_hints(request_queue_t *q, struct deadline_rq *drq){	deadline_del_drq_hash(drq);	if (q->last_merge == drq->request)		q->last_merge = NULL;}static inline voiddeadline_add_drq_hash(struct deadline_data *dd, struct deadline_rq *drq){	struct request *rq = drq->request;	BUG_ON(ON_HASH(drq));	drq->on_hash = 1;	list_add(&drq->hash, &dd->hash[DL_HASH_FN(rq_hash_key(rq))]);}/* * move hot entry to front of chain */static inline voiddeadline_hot_drq_hash(struct deadline_data *dd, struct deadline_rq *drq){	struct request *rq = drq->request;	struct list_head *head = &dd->hash[DL_HASH_FN(rq_hash_key(rq))];	if (ON_HASH(drq) && drq->hash.prev != head) {		list_del(&drq->hash);		list_add(&drq->hash, head);	}}static struct request *deadline_find_drq_hash(struct deadline_data *dd, sector_t offset){	struct list_head *hash_list = &dd->hash[DL_HASH_FN(offset)];	struct list_head *entry, *next = hash_list->next;	while ((entry = next) != hash_list) {		struct deadline_rq *drq = list_entry_hash(entry);		struct request *__rq = drq->request;		next = entry->next;				BUG_ON(!ON_HASH(drq));		if (!rq_mergeable(__rq)) {			__deadline_del_drq_hash(drq);			continue;		}		if (rq_hash_key(__rq) == offset)			return __rq;	}	return NULL;}/* * rb tree support functions */#define RB_NONE		(2)#define RB_EMPTY(root)	((root)->rb_node == NULL)#define ON_RB(node)	((node)->rb_color != RB_NONE)#define RB_CLEAR(node)	((node)->rb_color = RB_NONE)#define rb_entry_drq(node)	rb_entry((node), struct deadline_rq, rb_node)#define DRQ_RB_ROOT(dd, drq)	(&(dd)->sort_list[rq_data_dir((drq)->request)])#define rq_rb_key(rq)		(rq)->sectorstatic struct deadline_rq *__deadline_add_drq_rb(struct deadline_data *dd, struct deadline_rq *drq){	struct rb_node **p = &DRQ_RB_ROOT(dd, drq)->rb_node;	struct rb_node *parent = NULL;	struct deadline_rq *__drq;	while (*p) {		parent = *p;		__drq = rb_entry_drq(parent);		if (drq->rb_key < __drq->rb_key)			p = &(*p)->rb_left;		else if (drq->rb_key > __drq->rb_key)			p = &(*p)->rb_right;		else			return __drq;	}	rb_link_node(&drq->rb_node, parent, p);	return NULL;}static voiddeadline_add_drq_rb(struct deadline_data *dd, struct deadline_rq *drq){	struct deadline_rq *__alias;	drq->rb_key = rq_rb_key(drq->request);retry:	__alias = __deadline_add_drq_rb(dd, drq);	if (!__alias) {		rb_insert_color(&drq->rb_node, DRQ_RB_ROOT(dd, drq));		return;	}	deadline_move_request(dd, __alias);	goto retry;}static inline voiddeadline_del_drq_rb(struct deadline_data *dd, struct deadline_rq *drq){	const int data_dir = rq_data_dir(drq->request);	if (dd->next_drq[data_dir] == drq) {		struct rb_node *rbnext = rb_next(&drq->rb_node);		dd->next_drq[data_dir] = NULL;		if (rbnext)			dd->next_drq[data_dir] = rb_entry_drq(rbnext);	}	if (ON_RB(&drq->rb_node)) {		rb_erase(&drq->rb_node, DRQ_RB_ROOT(dd, drq));		RB_CLEAR(&drq->rb_node);	}}static struct request *deadline_find_drq_rb(struct deadline_data *dd, sector_t sector, int data_dir){	struct rb_node *n = dd->sort_list[data_dir].rb_node;	struct deadline_rq *drq;	while (n) {		drq = rb_entry_drq(n);		if (sector < drq->rb_key)			n = n->rb_left;		else if (sector > drq->rb_key)			n = n->rb_right;		else			return drq->request;	}	return NULL;}/* * deadline_find_first_drq finds the first (lowest sector numbered) request * for the specified data_dir. Used to sweep back to the start of the disk * (1-way elevator) after we process the last (highest sector) request. */static struct deadline_rq *deadline_find_first_drq(struct deadline_data *dd, int data_dir){	struct rb_node *n = dd->sort_list[data_dir].rb_node;	for (;;) {		if (n->rb_left == NULL)			return rb_entry_drq(n);				n = n->rb_left;	}}/* * add drq to rbtree and fifo */static inline voiddeadline_add_request(struct request_queue *q, struct request *rq){	struct deadline_data *dd = q->elevator.elevator_data;	struct deadline_rq *drq = RQ_DATA(rq);	const int data_dir = rq_data_dir(drq->request);	deadline_add_drq_rb(dd, drq);	/*	 * set expire time (only used for reads) and add to fifo list	 */	drq->expires = jiffies + dd->fifo_expire[data_dir];	list_add_tail(&drq->fifo, &dd->fifo_list[data_dir]);	if (rq_mergeable(rq)) {		deadline_add_drq_hash(dd, drq);		if (!q->last_merge)			q->last_merge = rq;	}}/* * remove rq from rbtree, fifo, and hash */static void deadline_remove_request(request_queue_t *q, struct request *rq){	struct deadline_rq *drq = RQ_DATA(rq);	if (drq) {		struct deadline_data *dd = q->elevator.elevator_data;		list_del_init(&drq->fifo);		deadline_remove_merge_hints(q, drq);		deadline_del_drq_rb(dd, drq);	}}static intdeadline_merge(request_queue_t *q, struct request **req, struct bio *bio){	struct deadline_data *dd = q->elevator.elevator_data;	struct request *__rq;	int ret;	/*	 * try last_merge to avoid going to hash	 */	ret = elv_try_last_merge(q, bio);	if (ret != ELEVATOR_NO_MERGE) {		__rq = q->last_merge;		goto out_insert;	}	/*	 * see if the merge hash can satisfy a back merge	 */	__rq = deadline_find_drq_hash(dd, bio->bi_sector);	if (__rq) {		BUG_ON(__rq->sector + __rq->nr_sectors != bio->bi_sector);		if (elv_rq_merge_ok(__rq, bio)) {			ret = ELEVATOR_BACK_MERGE;			goto out;		}	}	/*	 * check for front merge	 */	if (dd->front_merges) {		sector_t rb_key = bio->bi_sector + bio_sectors(bio);		__rq = deadline_find_drq_rb(dd, rb_key, bio_data_dir(bio));		if (__rq) {			BUG_ON(rb_key != rq_rb_key(__rq));			if (elv_rq_merge_ok(__rq, bio)) {				ret = ELEVATOR_FRONT_MERGE;				goto out;			}		}	}	return ELEVATOR_NO_MERGE;out:	q->last_merge = __rq;out_insert:	if (ret)		deadline_hot_drq_hash(dd, RQ_DATA(__rq));	*req = __rq;	return ret;}static void deadline_merged_request(request_queue_t *q, struct request *req){	struct deadline_data *dd = q->elevator.elevator_data;	struct deadline_rq *drq = RQ_DATA(req);	/*	 * hash always needs to be repositioned, key is end sector	 */	deadline_del_drq_hash(drq);	deadline_add_drq_hash(dd, drq);	/*	 * if the merge was a front merge, we need to reposition request	 */	if (rq_rb_key(req) != drq->rb_key) {		deadline_del_drq_rb(dd, drq);		deadline_add_drq_rb(dd, drq);	}	q->last_merge = req;}static voiddeadline_merged_requests(request_queue_t *q, struct request *req,			 struct request *next){	struct deadline_data *dd = q->elevator.elevator_data;	struct deadline_rq *drq = RQ_DATA(req);	struct deadline_rq *dnext = RQ_DATA(next);	BUG_ON(!drq);	BUG_ON(!dnext);	/*	 * reposition drq (this is the merged request) in hash, and in rbtree	 * in case of a front merge	 */	deadline_del_drq_hash(drq);	deadline_add_drq_hash(dd, drq);	if (rq_rb_key(req) != drq->rb_key) {		deadline_del_drq_rb(dd, drq);		deadline_add_drq_rb(dd, drq);	}	/*	 * if dnext expires before drq, assign its expire time to drq	 * and move into dnext position (dnext will be deleted) in fifo	 */	if (!list_empty(&drq->fifo) && !list_empty(&dnext->fifo)) {		if (time_before(dnext->expires, drq->expires)) {			list_move(&drq->fifo, &dnext->fifo);			drq->expires = dnext->expires;		}	}	/*	 * kill knowledge of next, this one is a goner	 */	deadline_remove_request(q, next);}/* * move request from sort list to dispatch queue. */static inline voiddeadline_move_to_dispatch(struct deadline_data *dd, struct deadline_rq *drq){	request_queue_t *q = drq->request->q;	deadline_remove_request(q, drq->request);	list_add_tail(&drq->request->queuelist, dd->dispatch);}/* * move an entry to dispatch queue */static voiddeadline_move_request(struct deadline_data *dd, struct deadline_rq *drq){	const int data_dir = rq_data_dir(drq->request);	struct rb_node *rbnext = rb_next(&drq->rb_node);	dd->next_drq[READ] = NULL;	dd->next_drq[WRITE] = NULL;	if (rbnext)		dd->next_drq[data_dir] = rb_entry_drq(rbnext);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色哟哟欧美精品| 精品一区二区三区久久| 91色婷婷久久久久合中文| 国产精品大尺度| 波波电影院一区二区三区| 中文字幕中文字幕中文字幕亚洲无线| 成人av动漫网站| 一级特黄大欧美久久久| 欧美在线色视频| 蜜臀av亚洲一区中文字幕| 欧美成人性福生活免费看| 国产裸体歌舞团一区二区| 国产精品天美传媒| 91福利视频网站| 日韩精品国产精品| 国产校园另类小说区| av中文字幕在线不卡| 亚洲综合男人的天堂| 在线播放91灌醉迷j高跟美女| 久久超碰97中文字幕| 欧美高清在线视频| 欧美做爰猛烈大尺度电影无法无天| 三级一区在线视频先锋| 国产午夜精品一区二区三区视频| 91免费观看视频在线| 日韩精品福利网| 中文字幕一区三区| 91麻豆精品国产91久久久更新时间| 国产综合色在线| 一区二区三区四区中文字幕| 91精选在线观看| 91美女在线观看| 久久99精品久久久久久国产越南| 欧美国产日产图区| 91精品免费在线| 精品国产在天天线2019| 99久久综合狠狠综合久久| 偷拍一区二区三区| 国产精品免费久久| 欧美一区二区三区公司| 99re热这里只有精品视频| 久久国产尿小便嘘嘘| 亚洲久草在线视频| 国产日韩精品一区| 91精品欧美久久久久久动漫| 成人av在线电影| 国产在线一区二区综合免费视频| 亚洲三级小视频| 日本一区二区三区免费乱视频| 欧美日韩亚洲综合在线| 99久久久精品| 国产成人综合精品三级| 日韩经典中文字幕一区| 亚洲日本欧美天堂| 久久精品水蜜桃av综合天堂| 欧美一级在线免费| 欧美视频精品在线观看| 国产一区激情在线| 亚洲国产日韩a在线播放性色| 欧美一区二区啪啪| 欧美性淫爽ww久久久久无| 福利一区福利二区| 国产精品亚洲一区二区三区妖精 | 久久不见久久见中文字幕免费| 亚洲黄色性网站| 亚洲四区在线观看| 中文字幕第一页久久| 久久精品亚洲精品国产欧美kt∨| 日韩午夜激情av| 日韩精品一区二区三区四区视频| 欧美三级乱人伦电影| 欧美亚洲国产一区二区三区| 色94色欧美sute亚洲13| 一本大道久久精品懂色aⅴ| 不卡在线观看av| a美女胸又www黄视频久久| 岛国精品在线观看| 成人午夜私人影院| 99久久国产综合精品女不卡| 国产成人av影院| 国产福利视频一区二区三区| 国产毛片精品一区| 国产a久久麻豆| 不卡一卡二卡三乱码免费网站| 国产高清精品网站| 不卡欧美aaaaa| 91色在线porny| 欧美视频一区在线观看| 欧美日韩电影一区| 日韩欧美在线一区二区三区| 欧美不卡视频一区| 国产视频一区在线观看| 国产精品不卡在线| 亚洲va在线va天堂| 日本不卡一区二区| 国产成人日日夜夜| 91在线观看免费视频| 欧美午夜精品一区二区三区| 91精品国产日韩91久久久久久| 欧美大片在线观看| 国产精品欧美久久久久无广告 | 国产三级精品三级| 国产精品盗摄一区二区三区| 亚洲精品日日夜夜| 麻豆成人综合网| 成人免费视频视频| 欧美三级中文字| 久久毛片高清国产| 亚洲另类中文字| 麻豆精品视频在线观看视频| 国产精品一区在线| 色屁屁一区二区| 日韩视频一区二区在线观看| 亚洲国产精品av| 五月天亚洲精品| 国产精品亚洲а∨天堂免在线| 99久久99久久精品免费看蜜桃| 欧美性受xxxx| 国产性色一区二区| 亚洲成人黄色小说| 丁香五精品蜜臀久久久久99网站| 在线观看视频一区二区| 久久日韩粉嫩一区二区三区| 一区二区三区日韩精品| 精品一区二区免费视频| 一本到不卡免费一区二区| 欧美精品一区二区在线观看| 亚洲黄色在线视频| 国产a视频精品免费观看| 欧美精品久久久久久久多人混战 | 国产精品天天看| 欧美最新大片在线看| 26uuu另类欧美亚洲曰本| 亚洲综合激情小说| 国产精品白丝av| 欧美一区二区三区爱爱| 亚洲六月丁香色婷婷综合久久 | 夜夜嗨av一区二区三区中文字幕| 国产一区二区久久| 91精品欧美福利在线观看| 亚洲少妇最新在线视频| 国产精品一二一区| 日韩欧美国产高清| 亚洲va国产天堂va久久en| 97久久精品人人澡人人爽| 精品播放一区二区| 免费成人在线视频观看| 欧美三级电影网站| 亚洲色大成网站www久久九九| 国产最新精品精品你懂的| 91精品国产欧美一区二区成人 | 欧美视频在线一区| 亚洲日穴在线视频| 国产91精品在线观看| 日韩免费看的电影| 奇米影视在线99精品| 欧美日韩精品一区二区天天拍小说| 国产精品伦理一区二区| 国产aⅴ综合色| 久久久久久久久岛国免费| 蜜桃久久av一区| 日韩午夜中文字幕| 毛片av一区二区| 日韩一级完整毛片| 六月丁香婷婷色狠狠久久| 欧美一区三区四区| 奇米亚洲午夜久久精品| 欧美一二三四区在线| 蜜臀a∨国产成人精品| 91精品国产麻豆国产自产在线| 亚洲国产综合色| 欧美男女性生活在线直播观看| 亚洲国产成人tv| 51精品国自产在线| 奇米精品一区二区三区在线观看| 69成人精品免费视频| 蜜臀精品一区二区三区在线观看| 91精品国产色综合久久ai换脸| 日本麻豆一区二区三区视频| 日韩欧美高清dvd碟片| 国内精品第一页| 国产欧美日韩在线| 99re热视频这里只精品| 亚洲一区在线视频| 91精品国产品国语在线不卡| 另类小说综合欧美亚洲| 久久嫩草精品久久久精品一| 粉嫩嫩av羞羞动漫久久久| 亚洲色欲色欲www在线观看| 91成人免费网站| 人人精品人人爱| 国产蜜臀av在线一区二区三区| 成人黄色国产精品网站大全在线免费观看 | 欧美酷刑日本凌虐凌虐| 免费人成网站在线观看欧美高清| 日韩精品一区二区三区四区视频| 国产成人免费视频网站| 亚洲激情在线播放| 日韩区在线观看| www.成人在线|