⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 page_io.c

📁 最新最稳定的Linux内存管理模块源代码
💻 C
字号:
/* *  linux/mm/page_io.c * *  Copyright (C) 1991, 1992, 1993, 1994  Linus Torvalds * *  Swap reorganised 29.12.95,  *  Asynchronous swapping added 30.12.95. Stephen Tweedie *  Removed race in async swapping. 14.4.1996. Bruno Haible *  Add swap of shared pages through the page cache. 20.2.1998. Stephen Tweedie *  Always use brw_page, life becomes simpler. 12 May 1998 Eric Biederman */#include <linux/mm.h>#include <linux/kernel_stat.h>#include <linux/pagemap.h>#include <linux/swap.h>#include <linux/bio.h>#include <linux/swapops.h>#include <linux/writeback.h>#include <asm/pgtable.h>static struct bio *get_swap_bio(gfp_t gfp_flags, pgoff_t index,				struct page *page, bio_end_io_t end_io){	struct bio *bio;	bio = bio_alloc(gfp_flags, 1);	if (bio) {		struct swap_info_struct *sis;		swp_entry_t entry = { .val = index, };		sis = get_swap_info_struct(swp_type(entry));		bio->bi_sector = map_swap_page(sis, swp_offset(entry)) *					(PAGE_SIZE >> 9);		bio->bi_bdev = sis->bdev;		bio->bi_io_vec[0].bv_page = page;		bio->bi_io_vec[0].bv_len = PAGE_SIZE;		bio->bi_io_vec[0].bv_offset = 0;		bio->bi_vcnt = 1;		bio->bi_idx = 0;		bio->bi_size = PAGE_SIZE;		bio->bi_end_io = end_io;	}	return bio;}static void end_swap_bio_write(struct bio *bio, int err){	const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);	struct page *page = bio->bi_io_vec[0].bv_page;	if (!uptodate) {		SetPageError(page);		/*		 * We failed to write the page out to swap-space.		 * Re-dirty the page in order to avoid it being reclaimed.		 * Also print a dire warning that things will go BAD (tm)		 * very quickly.		 *		 * Also clear PG_reclaim to avoid rotate_reclaimable_page()		 */		set_page_dirty(page);		printk(KERN_ALERT "Write-error on swap-device (%u:%u:%Lu)\n",				imajor(bio->bi_bdev->bd_inode),				iminor(bio->bi_bdev->bd_inode),				(unsigned long long)bio->bi_sector);		ClearPageReclaim(page);	}	end_page_writeback(page);	bio_put(bio);}void end_swap_bio_read(struct bio *bio, int err){	const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);	struct page *page = bio->bi_io_vec[0].bv_page;	if (!uptodate) {		SetPageError(page);		ClearPageUptodate(page);		printk(KERN_ALERT "Read-error on swap-device (%u:%u:%Lu)\n",				imajor(bio->bi_bdev->bd_inode),				iminor(bio->bi_bdev->bd_inode),				(unsigned long long)bio->bi_sector);	} else {		SetPageUptodate(page);	}	unlock_page(page);	bio_put(bio);}/* * We may have stale swap cache pages in memory: notice * them here and get rid of the unnecessary final write. */int swap_writepage(struct page *page, struct writeback_control *wbc){	struct bio *bio;	int ret = 0, rw = WRITE;	if (try_to_free_swap(page)) {		unlock_page(page);		goto out;	}	bio = get_swap_bio(GFP_NOIO, page_private(page), page,				end_swap_bio_write);	if (bio == NULL) {		set_page_dirty(page);		unlock_page(page);		ret = -ENOMEM;		goto out;	}	if (wbc->sync_mode == WB_SYNC_ALL)		rw |= (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_UNPLUG);	count_vm_event(PSWPOUT);	set_page_writeback(page);	unlock_page(page);	submit_bio(rw, bio);out:	return ret;}int swap_readpage(struct file *file, struct page *page){	struct bio *bio;	int ret = 0;	VM_BUG_ON(!PageLocked(page));	VM_BUG_ON(PageUptodate(page));	bio = get_swap_bio(GFP_KERNEL, page_private(page), page,				end_swap_bio_read);	if (bio == NULL) {		unlock_page(page);		ret = -ENOMEM;		goto out;	}	count_vm_event(PSWPIN);	submit_bio(READ, bio);out:	return ret;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -