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

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

?? bounce.c

?? 最新最穩定的Linux內存管理模塊源代碼
?? C
字號:
/* bounce buffer handling for block devices * * - Split from highmem.c */#include <linux/mm.h>#include <linux/module.h>#include <linux/swap.h>#include <linux/bio.h>#include <linux/pagemap.h>#include <linux/mempool.h>#include <linux/blkdev.h>#include <linux/init.h>#include <linux/hash.h>#include <linux/highmem.h>#include <linux/blktrace_api.h>#include <trace/block.h>#include <asm/tlbflush.h>#define POOL_SIZE	64#define ISA_POOL_SIZE	16static mempool_t *page_pool, *isa_page_pool;DEFINE_TRACE(block_bio_bounce);#ifdef CONFIG_HIGHMEMstatic __init int init_emergency_pool(void){	struct sysinfo i;	si_meminfo(&i);	si_swapinfo(&i);	if (!i.totalhigh)		return 0;	page_pool = mempool_create_page_pool(POOL_SIZE, 0);	BUG_ON(!page_pool);	printk("highmem bounce pool size: %d pages\n", POOL_SIZE);	return 0;}__initcall(init_emergency_pool);/* * highmem version, map in to vec */static void bounce_copy_vec(struct bio_vec *to, unsigned char *vfrom){	unsigned long flags;	unsigned char *vto;	local_irq_save(flags);	vto = kmap_atomic(to->bv_page, KM_BOUNCE_READ);	memcpy(vto + to->bv_offset, vfrom, to->bv_len);	kunmap_atomic(vto, KM_BOUNCE_READ);	local_irq_restore(flags);}#else /* CONFIG_HIGHMEM */#define bounce_copy_vec(to, vfrom)	\	memcpy(page_address((to)->bv_page) + (to)->bv_offset, vfrom, (to)->bv_len)#endif /* CONFIG_HIGHMEM *//* * allocate pages in the DMA region for the ISA pool */static void *mempool_alloc_pages_isa(gfp_t gfp_mask, void *data){	return mempool_alloc_pages(gfp_mask | GFP_DMA, data);}/* * gets called "every" time someone init's a queue with BLK_BOUNCE_ISA * as the max address, so check if the pool has already been created. */int init_emergency_isa_pool(void){	if (isa_page_pool)		return 0;	isa_page_pool = mempool_create(ISA_POOL_SIZE, mempool_alloc_pages_isa,				       mempool_free_pages, (void *) 0);	BUG_ON(!isa_page_pool);	printk("isa bounce pool size: %d pages\n", ISA_POOL_SIZE);	return 0;}/* * Simple bounce buffer support for highmem pages. Depending on the * queue gfp mask set, *to may or may not be a highmem page. kmap it * always, it will do the Right Thing */static void copy_to_high_bio_irq(struct bio *to, struct bio *from){	unsigned char *vfrom;	struct bio_vec *tovec, *fromvec;	int i;	__bio_for_each_segment(tovec, to, i, 0) {		fromvec = from->bi_io_vec + i;		/*		 * not bounced		 */		if (tovec->bv_page == fromvec->bv_page)			continue;		/*		 * fromvec->bv_offset and fromvec->bv_len might have been		 * modified by the block layer, so use the original copy,		 * bounce_copy_vec already uses tovec->bv_len		 */		vfrom = page_address(fromvec->bv_page) + tovec->bv_offset;		flush_dcache_page(tovec->bv_page);		bounce_copy_vec(tovec, vfrom);	}}static void bounce_end_io(struct bio *bio, mempool_t *pool, int err){	struct bio *bio_orig = bio->bi_private;	struct bio_vec *bvec, *org_vec;	int i;	if (test_bit(BIO_EOPNOTSUPP, &bio->bi_flags))		set_bit(BIO_EOPNOTSUPP, &bio_orig->bi_flags);	/*	 * free up bounce indirect pages used	 */	__bio_for_each_segment(bvec, bio, i, 0) {		org_vec = bio_orig->bi_io_vec + i;		if (bvec->bv_page == org_vec->bv_page)			continue;		dec_zone_page_state(bvec->bv_page, NR_BOUNCE);		mempool_free(bvec->bv_page, pool);	}	bio_endio(bio_orig, err);	bio_put(bio);}static void bounce_end_io_write(struct bio *bio, int err){	bounce_end_io(bio, page_pool, err);}static void bounce_end_io_write_isa(struct bio *bio, int err){	bounce_end_io(bio, isa_page_pool, err);}static void __bounce_end_io_read(struct bio *bio, mempool_t *pool, int err){	struct bio *bio_orig = bio->bi_private;	if (test_bit(BIO_UPTODATE, &bio->bi_flags))		copy_to_high_bio_irq(bio_orig, bio);	bounce_end_io(bio, pool, err);}static void bounce_end_io_read(struct bio *bio, int err){	__bounce_end_io_read(bio, page_pool, err);}static void bounce_end_io_read_isa(struct bio *bio, int err){	__bounce_end_io_read(bio, isa_page_pool, err);}static void __blk_queue_bounce(struct request_queue *q, struct bio **bio_orig,			       mempool_t *pool){	struct page *page;	struct bio *bio = NULL;	int i, rw = bio_data_dir(*bio_orig);	struct bio_vec *to, *from;	bio_for_each_segment(from, *bio_orig, i) {		page = from->bv_page;		/*		 * is destination page below bounce pfn?		 */		if (page_to_pfn(page) <= q->bounce_pfn)			continue;		/*		 * irk, bounce it		 */		if (!bio) {			unsigned int cnt = (*bio_orig)->bi_vcnt;			bio = bio_alloc(GFP_NOIO, cnt);			memset(bio->bi_io_vec, 0, cnt * sizeof(struct bio_vec));		}					to = bio->bi_io_vec + i;		to->bv_page = mempool_alloc(pool, q->bounce_gfp);		to->bv_len = from->bv_len;		to->bv_offset = from->bv_offset;		inc_zone_page_state(to->bv_page, NR_BOUNCE);		if (rw == WRITE) {			char *vto, *vfrom;			flush_dcache_page(from->bv_page);			vto = page_address(to->bv_page) + to->bv_offset;			vfrom = kmap(from->bv_page) + from->bv_offset;			memcpy(vto, vfrom, to->bv_len);			kunmap(from->bv_page);		}	}	/*	 * no pages bounced	 */	if (!bio)		return;	trace_block_bio_bounce(q, *bio_orig);	/*	 * at least one page was bounced, fill in possible non-highmem	 * pages	 */	__bio_for_each_segment(from, *bio_orig, i, 0) {		to = bio_iovec_idx(bio, i);		if (!to->bv_page) {			to->bv_page = from->bv_page;			to->bv_len = from->bv_len;			to->bv_offset = from->bv_offset;		}	}	bio->bi_bdev = (*bio_orig)->bi_bdev;	bio->bi_flags |= (1 << BIO_BOUNCED);	bio->bi_sector = (*bio_orig)->bi_sector;	bio->bi_rw = (*bio_orig)->bi_rw;	bio->bi_vcnt = (*bio_orig)->bi_vcnt;	bio->bi_idx = (*bio_orig)->bi_idx;	bio->bi_size = (*bio_orig)->bi_size;	if (pool == page_pool) {		bio->bi_end_io = bounce_end_io_write;		if (rw == READ)			bio->bi_end_io = bounce_end_io_read;	} else {		bio->bi_end_io = bounce_end_io_write_isa;		if (rw == READ)			bio->bi_end_io = bounce_end_io_read_isa;	}	bio->bi_private = *bio_orig;	*bio_orig = bio;}void blk_queue_bounce(struct request_queue *q, struct bio **bio_orig){	mempool_t *pool;	/*	 * Data-less bio, nothing to bounce	 */	if (!bio_has_data(*bio_orig))		return;	/*	 * for non-isa bounce case, just check if the bounce pfn is equal	 * to or bigger than the highest pfn in the system -- in that case,	 * don't waste time iterating over bio segments	 */	if (!(q->bounce_gfp & GFP_DMA)) {		if (q->bounce_pfn >= blk_max_pfn)			return;		pool = page_pool;	} else {		BUG_ON(!isa_page_pool);		pool = isa_page_pool;	}	/*	 * slow path	 */	__blk_queue_bounce(q, bio_orig, pool);}EXPORT_SYMBOL(blk_queue_bounce);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品乱码久久久久久| av一二三不卡影片| 亚洲图片欧美色图| 国产精品国产自产拍高清av王其 | av网站一区二区三区| 国产成人精品综合在线观看| 成人免费视频视频在线观看免费 | 国产精品久久久一区麻豆最新章节| 在线看日本不卡| 91麻豆精品国产91久久久| 在线观看不卡一区| 91啦中文在线观看| 一本久久a久久免费精品不卡| 欧美系列一区二区| 日本韩国一区二区三区| 欧美一二三区在线| 精品一区二区影视| 国内成人精品2018免费看| 成人av一区二区三区| 91麻豆文化传媒在线观看| 欧美午夜影院一区| 精品国产乱码久久久久久久| 国产欧美一区二区三区在线看蜜臀| 国产精品久久久久久久久晋中| 樱桃视频在线观看一区| 最新成人av在线| 亚洲福利一二三区| 成人视屏免费看| 欧美一区二区三区在线看| 亚洲天天做日日做天天谢日日欢 | 亚洲制服丝袜一区| 精品日韩一区二区三区| 久久久99精品免费观看不卡| 一区二区在线观看不卡| 精品制服美女久久| 欧美日免费三级在线| 日韩一区有码在线| 99精品视频在线播放观看| 久久女同性恋中文字幕| 成人欧美一区二区三区| 麻豆一区二区三区| 日本丰满少妇一区二区三区| 国产精品色哟哟| 狠狠色2019综合网| 精品福利二区三区| 国模娜娜一区二区三区| 精品免费日韩av| 国产精品自在欧美一区| 精品国产污网站| 狠狠狠色丁香婷婷综合激情 | 欧美精品第一页| 五月天激情小说综合| 色欧美88888久久久久久影院| 亚洲国产精品精华液ab| 99视频在线精品| 一区二区三区日本| 在线不卡a资源高清| 日韩电影免费在线看| 欧美理论电影在线| 蜜桃一区二区三区四区| 国产亚洲精品中文字幕| 97久久超碰国产精品| 婷婷国产在线综合| 国产午夜久久久久| 欧美三区在线视频| 国产精品一区二区久久不卡 | 亚洲欧美色图小说| 欧美做爰猛烈大尺度电影无法无天| 亚洲电影激情视频网站| 91麻豆精品国产91久久久久久| 午夜国产精品一区| 亚洲精品在线免费观看视频| 成人高清在线视频| 国产成人自拍高清视频在线免费播放| 国产欧美一区二区三区沐欲| 欧美制服丝袜第一页| 国产麻豆精品在线| 日本亚洲免费观看| 中文字幕一区二区三区乱码在线| 欧美日韩dvd在线观看| 成人网在线播放| 国产成人在线视频免费播放| 肉肉av福利一精品导航| 一区二区理论电影在线观看| 亚洲图片另类小说| 亚洲国产电影在线观看| 日韩精品中午字幕| 日韩美女主播在线视频一区二区三区 | 国产无一区二区| 久久久亚洲精品一区二区三区| 欧美日韩色一区| 欧美午夜精品久久久| 91麻豆文化传媒在线观看| 成人三级在线视频| 成人黄色免费短视频| 蜜臀久久久99精品久久久久久| 亚洲自拍偷拍av| 韩国v欧美v日本v亚洲v| 日韩国产精品久久| 美腿丝袜亚洲三区| 日韩成人精品视频| 免费视频一区二区| 老司机一区二区| 国产成人8x视频一区二区| 一本一道久久a久久精品| 欧美视频完全免费看| 欧美精品久久一区二区三区| 国产免费观看久久| 一区二区三区鲁丝不卡| 青青草国产成人av片免费| 国产精品正在播放| a级精品国产片在线观看| 欧美卡1卡2卡| 国产欧美日韩在线视频| 亚洲综合激情另类小说区| 捆绑紧缚一区二区三区视频| 欧美综合欧美视频| 久久综合狠狠综合| 天天综合天天做天天综合| 色婷婷久久一区二区三区麻豆| 日韩欧美亚洲国产另类| 亚洲国产一二三| 久久99久久精品欧美| 色拍拍在线精品视频8848| 国产亚洲人成网站| 麻豆成人av在线| 欧美自拍偷拍午夜视频| 亚洲国产精品成人久久综合一区| 久久精品噜噜噜成人av农村| 欧美三级午夜理伦三级中视频| 亚洲免费在线观看| 日本福利一区二区| 亚洲免费av观看| 国产99精品国产| 欧美大胆一级视频| 日本不卡视频在线观看| 欧美日韩在线精品一区二区三区激情| 国产精品卡一卡二卡三| 不卡的av电影在线观看| 精品国产三级a在线观看| 久久国产剧场电影| 欧美va亚洲va在线观看蝴蝶网| 日韩精品乱码av一区二区| 7777精品伊人久久久大香线蕉的| 日韩av一级电影| 欧美日韩亚洲综合一区| 成人黄色电影在线| 一区二区在线免费| 在线播放日韩导航| 国产一区欧美一区| 亚洲精品成人精品456| 色综合天天性综合| 午夜a成v人精品| 91麻豆精品国产91久久久资源速度 | 欧美色大人视频| 国内外成人在线视频| 亚洲天堂精品视频| 欧美成人性战久久| 99在线热播精品免费| 老司机精品视频一区二区三区| 亚洲人123区| 国产午夜精品一区二区三区嫩草| 91精品福利视频| 国产ts人妖一区二区| 亚洲成在线观看| 欧美国产日韩在线观看| xf在线a精品一区二区视频网站| 一本久道久久综合中文字幕| 久久综合综合久久综合| 亚洲高清中文字幕| 国产精品久久久久精k8| 国产三级欧美三级日产三级99| 日韩视频在线永久播放| 99视频超级精品| 高清国产一区二区| 国产一区二区三区免费| 免费日韩伦理电影| 91一区二区在线| 亚洲国产综合色| 亚洲国产人成综合网站| 亚洲成人在线网站| 亚洲精品国产一区二区精华液| 国产欧美一区二区精品久导航| 精品国产乱码久久久久久免费| 欧美一级欧美三级在线观看| 91欧美一区二区| 欧美日韩mp4| 久久看人人爽人人| 国产精品第四页| 一区二区三区欧美久久| 中文字幕一区二| 国产精品久久久久一区 | 亚洲柠檬福利资源导航| 五月综合激情日本mⅴ| 麻豆免费精品视频| 国产 日韩 欧美大片| 欧美影院精品一区| 日韩欧美在线123| 国产校园另类小说区| 亚洲国产三级在线|