page-flags.h
来自「此工具是arm-linux-GCC交叉编译工具(cross-3.4.4)」· C头文件 代码 · 共 327 行
H
327 行
/* * Macros for manipulating and testing page->flags */#ifndef PAGE_FLAGS_H#define PAGE_FLAGS_H#include <linux/percpu.h>#include <linux/cache.h>#include <asm/pgtable.h>/* * Various page->flags bits: * * PG_reserved is set for special pages, which can never be swapped out. Some * of them might not even exist (eg empty_bad_page)... * * The PG_private bitflag is set if page->private contains a valid value. * * During disk I/O, PG_locked is used. This bit is set before I/O and * reset when I/O completes. page_waitqueue(page) is a wait queue of all tasks * waiting for the I/O on this page to complete. * * PG_uptodate tells whether the page's contents is valid. When a read * completes, the page becomes uptodate, unless a disk I/O error happened. * * For choosing which pages to swap out, inode pages carry a PG_referenced bit, * which is set any time the system accesses that page through the (mapping, * index) hash table. This referenced bit, together with the referenced bit * in the page tables, is used to manipulate page->age and move the page across * the active, inactive_dirty and inactive_clean lists. * * Note that the referenced bit, the page->lru list_head and the active, * inactive_dirty and inactive_clean lists are protected by the * zone->lru_lock, and *NOT* by the usual PG_locked bit! * * PG_error is set to indicate that an I/O error occurred on this page. * * PG_arch_1 is an architecture specific page state bit. The generic code * guarantees that this bit is cleared for a page when it first is entered into * the page cache. * * PG_highmem pages are not permanently mapped into the kernel virtual address * space, they need to be kmapped separately for doing IO on the pages. The * struct page (these bits with information) are always mapped into kernel * address space... *//* * Don't use the *_dontuse flags. Use the macros. Otherwise you'll break * locked- and dirty-page accounting. The top eight bits of page->flags are * used for page->zone, so putting flag bits there doesn't work. */#define PG_locked 0 /* Page is locked. Don't touch. */#define PG_error 1#define PG_referenced 2#define PG_uptodate 3#define PG_dirty 4#define PG_lru 5#define PG_active 6#define PG_slab 7 /* slab debug (Suparna wants this) */#define PG_checked 8 /* kill me in 2.5.<early>. */#define PG_arch_1 9#define PG_reserved 10#define PG_private 11 /* Has something at ->private */#define PG_writeback 12 /* Page is under writeback */#define PG_nosave 13 /* Used for system suspend/resume */#define PG_compound 14 /* Part of a compound page */#define PG_swapcache 15 /* Swap page: swp_entry_t in private */#define PG_mappedtodisk 16 /* Has blocks allocated on-disk */#define PG_reclaim 17 /* To be reclaimed asap */#define PG_nosave_free 18 /* Free, should not be written */#define PG_uncached 19 /* Page has been mapped as uncached *//* * Global page accounting. One instance per CPU. Only unsigned longs are * allowed. */struct page_state { unsigned long nr_dirty; /* Dirty writeable pages */ unsigned long nr_writeback; /* Pages under writeback */ unsigned long nr_unstable; /* NFS unstable pages */ unsigned long nr_page_table_pages;/* Pages used for pagetables */ unsigned long nr_mapped; /* mapped into pagetables */ unsigned long nr_slab; /* In slab */#define GET_PAGE_STATE_LAST nr_slab /* * The below are zeroed by get_page_state(). Use get_full_page_state() * to add up all these. */ unsigned long pgpgin; /* Disk reads */ unsigned long pgpgout; /* Disk writes */ unsigned long pswpin; /* swap reads */ unsigned long pswpout; /* swap writes */ unsigned long pgalloc_high; /* page allocations */ unsigned long pgalloc_normal; unsigned long pgalloc_dma; unsigned long pgfree; /* page freeings */ unsigned long pgactivate; /* pages moved inactive->active */ unsigned long pgdeactivate; /* pages moved active->inactive */ unsigned long pgfault; /* faults (major+minor) */ unsigned long pgmajfault; /* faults (major only) */ unsigned long pgrefill_high; /* inspected in refill_inactive_zone */ unsigned long pgrefill_normal; unsigned long pgrefill_dma; unsigned long pgsteal_high; /* total highmem pages reclaimed */ unsigned long pgsteal_normal; unsigned long pgsteal_dma; unsigned long pgscan_kswapd_high;/* total highmem pages scanned */ unsigned long pgscan_kswapd_normal; unsigned long pgscan_kswapd_dma; unsigned long pgscan_direct_high;/* total highmem pages scanned */ unsigned long pgscan_direct_normal; unsigned long pgscan_direct_dma; unsigned long pginodesteal; /* pages reclaimed via inode freeing */ unsigned long slabs_scanned; /* slab objects scanned */ unsigned long kswapd_steal; /* pages reclaimed by kswapd */ unsigned long kswapd_inodesteal;/* reclaimed via kswapd inode freeing */ unsigned long pageoutrun; /* kswapd's calls to page reclaim */ unsigned long allocstall; /* direct reclaim calls */ unsigned long pgrotated; /* pages rotated to tail of the LRU */ unsigned long nr_bounce; /* pages for bounce buffers */};extern void get_page_state(struct page_state *ret);extern void get_page_state_node(struct page_state *ret, int node);extern void get_full_page_state(struct page_state *ret);extern unsigned long __read_page_state(unsigned long offset);extern void __mod_page_state(unsigned long offset, unsigned long delta);#define read_page_state(member) \ __read_page_state(offsetof(struct page_state, member))#define mod_page_state(member, delta) \ __mod_page_state(offsetof(struct page_state, member), (delta))#define inc_page_state(member) mod_page_state(member, 1UL)#define dec_page_state(member) mod_page_state(member, 0UL - 1)#define add_page_state(member,delta) mod_page_state(member, (delta))#define sub_page_state(member,delta) mod_page_state(member, 0UL - (delta))#define mod_page_state_zone(zone, member, delta) \ do { \ unsigned offset; \ if (is_highmem(zone)) \ offset = offsetof(struct page_state, member##_high); \ else if (is_normal(zone)) \ offset = offsetof(struct page_state, member##_normal); \ else \ offset = offsetof(struct page_state, member##_dma); \ __mod_page_state(offset, (delta)); \ } while (0)/* * Manipulation of page state flags */#define PageLocked(page) \ test_bit(PG_locked, &(page)->flags)#define SetPageLocked(page) \ set_bit(PG_locked, &(page)->flags)#define TestSetPageLocked(page) \ test_and_set_bit(PG_locked, &(page)->flags)#define ClearPageLocked(page) \ clear_bit(PG_locked, &(page)->flags)#define TestClearPageLocked(page) \ test_and_clear_bit(PG_locked, &(page)->flags)#define PageError(page) test_bit(PG_error, &(page)->flags)#define SetPageError(page) set_bit(PG_error, &(page)->flags)#define ClearPageError(page) clear_bit(PG_error, &(page)->flags)#define PageReferenced(page) test_bit(PG_referenced, &(page)->flags)#define SetPageReferenced(page) set_bit(PG_referenced, &(page)->flags)#define ClearPageReferenced(page) clear_bit(PG_referenced, &(page)->flags)#define TestClearPageReferenced(page) test_and_clear_bit(PG_referenced, &(page)->flags)#define PageUptodate(page) test_bit(PG_uptodate, &(page)->flags)#ifndef SetPageUptodate#define SetPageUptodate(page) set_bit(PG_uptodate, &(page)->flags)#endif#define ClearPageUptodate(page) clear_bit(PG_uptodate, &(page)->flags)#define PageDirty(page) test_bit(PG_dirty, &(page)->flags)#define SetPageDirty(page) set_bit(PG_dirty, &(page)->flags)#define TestSetPageDirty(page) test_and_set_bit(PG_dirty, &(page)->flags)#define ClearPageDirty(page) clear_bit(PG_dirty, &(page)->flags)#define __ClearPageDirty(page) __clear_bit(PG_dirty, &(page)->flags)#define TestClearPageDirty(page) test_and_clear_bit(PG_dirty, &(page)->flags)#define SetPageLRU(page) set_bit(PG_lru, &(page)->flags)#define PageLRU(page) test_bit(PG_lru, &(page)->flags)#define TestSetPageLRU(page) test_and_set_bit(PG_lru, &(page)->flags)#define TestClearPageLRU(page) test_and_clear_bit(PG_lru, &(page)->flags)#define PageActive(page) test_bit(PG_active, &(page)->flags)#define SetPageActive(page) set_bit(PG_active, &(page)->flags)#define ClearPageActive(page) clear_bit(PG_active, &(page)->flags)#define TestClearPageActive(page) test_and_clear_bit(PG_active, &(page)->flags)#define TestSetPageActive(page) test_and_set_bit(PG_active, &(page)->flags)#define PageSlab(page) test_bit(PG_slab, &(page)->flags)#define SetPageSlab(page) set_bit(PG_slab, &(page)->flags)#define ClearPageSlab(page) clear_bit(PG_slab, &(page)->flags)#define TestClearPageSlab(page) test_and_clear_bit(PG_slab, &(page)->flags)#define TestSetPageSlab(page) test_and_set_bit(PG_slab, &(page)->flags)#ifdef CONFIG_HIGHMEM#define PageHighMem(page) is_highmem(page_zone(page))#else#define PageHighMem(page) 0 /* needed to optimize away at compile time */#endif#define PageChecked(page) test_bit(PG_checked, &(page)->flags)#define SetPageChecked(page) set_bit(PG_checked, &(page)->flags)#define ClearPageChecked(page) clear_bit(PG_checked, &(page)->flags)#define PageReserved(page) test_bit(PG_reserved, &(page)->flags)#define SetPageReserved(page) set_bit(PG_reserved, &(page)->flags)#define ClearPageReserved(page) clear_bit(PG_reserved, &(page)->flags)#define __ClearPageReserved(page) __clear_bit(PG_reserved, &(page)->flags)#define SetPagePrivate(page) set_bit(PG_private, &(page)->flags)#define ClearPagePrivate(page) clear_bit(PG_private, &(page)->flags)#define PagePrivate(page) test_bit(PG_private, &(page)->flags)#define __SetPagePrivate(page) __set_bit(PG_private, &(page)->flags)#define __ClearPagePrivate(page) __clear_bit(PG_private, &(page)->flags)#define PageWriteback(page) test_bit(PG_writeback, &(page)->flags)#define SetPageWriteback(page) \ do { \ if (!test_and_set_bit(PG_writeback, \ &(page)->flags)) \ inc_page_state(nr_writeback); \ } while (0)#define TestSetPageWriteback(page) \ ({ \ int ret; \ ret = test_and_set_bit(PG_writeback, \ &(page)->flags); \ if (!ret) \ inc_page_state(nr_writeback); \ ret; \ })#define ClearPageWriteback(page) \ do { \ if (test_and_clear_bit(PG_writeback, \ &(page)->flags)) \ dec_page_state(nr_writeback); \ } while (0)#define TestClearPageWriteback(page) \ ({ \ int ret; \ ret = test_and_clear_bit(PG_writeback, \ &(page)->flags); \ if (ret) \ dec_page_state(nr_writeback); \ ret; \ })#define PageNosave(page) test_bit(PG_nosave, &(page)->flags)#define SetPageNosave(page) set_bit(PG_nosave, &(page)->flags)#define TestSetPageNosave(page) test_and_set_bit(PG_nosave, &(page)->flags)#define ClearPageNosave(page) clear_bit(PG_nosave, &(page)->flags)#define TestClearPageNosave(page) test_and_clear_bit(PG_nosave, &(page)->flags)#define PageNosaveFree(page) test_bit(PG_nosave_free, &(page)->flags)#define SetPageNosaveFree(page) set_bit(PG_nosave_free, &(page)->flags)#define ClearPageNosaveFree(page) clear_bit(PG_nosave_free, &(page)->flags)#define PageMappedToDisk(page) test_bit(PG_mappedtodisk, &(page)->flags)#define SetPageMappedToDisk(page) set_bit(PG_mappedtodisk, &(page)->flags)#define ClearPageMappedToDisk(page) clear_bit(PG_mappedtodisk, &(page)->flags)#define PageReclaim(page) test_bit(PG_reclaim, &(page)->flags)#define SetPageReclaim(page) set_bit(PG_reclaim, &(page)->flags)#define ClearPageReclaim(page) clear_bit(PG_reclaim, &(page)->flags)#define TestClearPageReclaim(page) test_and_clear_bit(PG_reclaim, &(page)->flags)#ifdef CONFIG_HUGETLB_PAGE#define PageCompound(page) test_bit(PG_compound, &(page)->flags)#else#define PageCompound(page) 0#endif#define SetPageCompound(page) set_bit(PG_compound, &(page)->flags)#define ClearPageCompound(page) clear_bit(PG_compound, &(page)->flags)#ifdef CONFIG_SWAP#define PageSwapCache(page) test_bit(PG_swapcache, &(page)->flags)#define SetPageSwapCache(page) set_bit(PG_swapcache, &(page)->flags)#define ClearPageSwapCache(page) clear_bit(PG_swapcache, &(page)->flags)#else#define PageSwapCache(page) 0#endif#define PageUncached(page) test_bit(PG_uncached, &(page)->flags)#define SetPageUncached(page) set_bit(PG_uncached, &(page)->flags)#define ClearPageUncached(page) clear_bit(PG_uncached, &(page)->flags)struct page; /* forward declaration */int test_clear_page_dirty(struct page *page);int test_clear_page_writeback(struct page *page);int test_set_page_writeback(struct page *page);static inline void clear_page_dirty(struct page *page){ test_clear_page_dirty(page);}static inline void set_page_writeback(struct page *page){ test_set_page_writeback(page);}#endif /* PAGE_FLAGS_H */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?