Blame view

include/linux/page-flags.h 10.4 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
  /*
   * Macros for manipulating and testing page->flags
   */
  
  #ifndef PAGE_FLAGS_H
  #define PAGE_FLAGS_H
f886ed443   Andrew Morton   [PATCH] PG_uncach...
7
  #include <linux/types.h>
6d7779538   Christoph Lameter   mm: optimize comp...
8
  #include <linux/mm_types.h>
f886ed443   Andrew Morton   [PATCH] PG_uncach...
9

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
10
11
12
13
14
15
  /*
   * 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)...
   *
da6052f7b   Nick Piggin   [PATCH] update so...
16
17
18
   * The PG_private bitflag is set on pagecache pages if they contain filesystem
   * specific data (which is normally at page->private). It can be used by
   * private allocations for its own usage.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
19
   *
da6052f7b   Nick Piggin   [PATCH] update so...
20
21
22
23
24
25
26
27
28
   * During initiation of disk I/O, PG_locked is set. This bit is set before I/O
   * and cleared when writeback _starts_ or when read _completes_. PG_writeback
   * is set before writeback starts and cleared when it finishes.
   *
   * PG_locked also pins a page in pagecache, and blocks truncation of the file
   * while it is held.
   *
   * page_waitqueue(page) is a wait queue of all tasks waiting for the page
   * to become unlocked.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
29
30
31
32
   *
   * 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.
   *
da6052f7b   Nick Piggin   [PATCH] update so...
33
34
   * PG_referenced, PG_reclaim are used for page reclaim for anonymous and
   * file-backed pagecache (see mm/vmscan.c).
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35
36
37
38
39
40
41
42
43
44
45
   *
   * 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...
da6052f7b   Nick Piggin   [PATCH] update so...
46
47
48
49
   *
   * PG_buddy is set to indicate that the page is free and in the buddy system
   * (see mm/page_alloc.c).
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
50
51
52
53
   */
  
  /*
   * Don't use the *_dontuse flags.  Use the macros.  Otherwise you'll break
91fc8ab3c   Andy Whitcroft   [PATCH] page flag...
54
55
56
57
58
59
60
61
62
63
64
65
66
67
   * locked- and dirty-page accounting.
   *
   * The page flags field is split into two parts, the main flags area
   * which extends from the low bits upwards, and the fields area which
   * extends from the high bits downwards.
   *
   *  | FIELD | ... | FLAGS |
   *  N-1     ^             0
   *          (N-FLAGS_RESERVED)
   *
   * The fields area is reserved for fields mapping zone, node and SPARSEMEM
   * section.  The boundry between these two areas is defined by
   * FLAGS_RESERVED which defines the width of the fields section
   * (see linux/mmzone.h).  New flags must _not_ overlap with this area.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
68
69
70
71
72
73
74
75
76
77
   */
  #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) */
5409bae07   Nick Piggin   [PATCH] Rename PG...
78
  #define PG_owner_priv_1		 8	/* Owner use. If pagecache, fs may use*/
cbe37d093   Badari Pulavarty   [PATCH] mm: remov...
79
80
  #define PG_arch_1		 9
  #define PG_reserved		10
da6052f7b   Nick Piggin   [PATCH] update so...
81
  #define PG_private		11	/* If pagecache, has fs-private data */
cbe37d093   Badari Pulavarty   [PATCH] mm: remov...
82
83
  
  #define PG_writeback		12	/* Page is under writeback */
cbe37d093   Badari Pulavarty   [PATCH] mm: remov...
84
85
86
87
88
  #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 */
676165a8a   Nick Piggin   [PATCH] Fix buddy...
89
  #define PG_buddy		19	/* Page is free, on buddy lists */
fe3cba17c   Fengguang Wu   mm: share PG_read...
90
91
  /* PG_readahead is only used for file reads; PG_reclaim is only for writes */
  #define PG_readahead		PG_reclaim /* Reminder to do async read-ahead */
5409bae07   Nick Piggin   [PATCH] Rename PG...
92
93
  /* PG_owner_priv_1 users should have descriptive aliases */
  #define PG_checked		PG_owner_priv_1 /* Used by some filesystems */
c85b04c37   Jeremy Fitzhardinge   xen: add pinned p...
94
  #define PG_pinned		PG_owner_priv_1	/* Xen pinned pagetable */
f886ed443   Andrew Morton   [PATCH] PG_uncach...
95
96
97
98
99
100
101
102
103
104
105
  
  #if (BITS_PER_LONG > 32)
  /*
   * 64-bit-only flags build down from bit 31
   *
   * 32 bit  -------------------------------| FIELDS |       FLAGS         |
   * 64 bit  |           FIELDS             | ??????         FLAGS         |
   *         63                            32                              0
   */
  #define PG_uncached		31	/* Page has been mapped as uncached */
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
106
107
  
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
   * 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)
f6ac2354d   Christoph Lameter   [PATCH] zoned vm ...
131
  #ifdef CONFIG_S390
2dcea57ae   Heiko Carstens   [PATCH] convert s...
132
133
134
  static inline void SetPageUptodate(struct page *page)
  {
  	if (!test_and_set_bit(PG_uptodate, &page->flags))
6c210482a   Martin Schwidefsky   [S390] split page...
135
  		page_clear_dirty(page);
2dcea57ae   Heiko Carstens   [PATCH] convert s...
136
  }
f6ac2354d   Christoph Lameter   [PATCH] zoned vm ...
137
  #else
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
138
139
140
141
142
143
144
145
  #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)
242e54686   Nick Piggin   [PATCH] mm: remov...
146
  #define __ClearPageDirty(page)	__clear_bit(PG_dirty, &(page)->flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
147
  #define TestClearPageDirty(page) test_and_clear_bit(PG_dirty, &(page)->flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
148
  #define PageLRU(page)		test_bit(PG_lru, &(page)->flags)
8d438f96d   Nick Piggin   [PATCH] mm: PageL...
149
150
  #define SetPageLRU(page)	set_bit(PG_lru, &(page)->flags)
  #define ClearPageLRU(page)	clear_bit(PG_lru, &(page)->flags)
674539115   Nick Piggin   [PATCH] mm: less ...
151
  #define __ClearPageLRU(page)	__clear_bit(PG_lru, &(page)->flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
152
153
154
155
  
  #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)
674539115   Nick Piggin   [PATCH] mm: less ...
156
  #define __ClearPageActive(page)	__clear_bit(PG_active, &(page)->flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
157
158
  
  #define PageSlab(page)		test_bit(PG_slab, &(page)->flags)
f205b2fe6   Nick Piggin   [PATCH] mm: slab ...
159
160
  #define __SetPageSlab(page)	__set_bit(PG_slab, &(page)->flags)
  #define __ClearPageSlab(page)	__clear_bit(PG_slab, &(page)->flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
161
162
  
  #ifdef CONFIG_HIGHMEM
cbe37d093   Badari Pulavarty   [PATCH] mm: remov...
163
  #define PageHighMem(page)	is_highmem(page_zone(page))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
164
165
166
167
168
169
170
  #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)
c85b04c37   Jeremy Fitzhardinge   xen: add pinned p...
171
172
173
  #define PagePinned(page)	test_bit(PG_pinned, &(page)->flags)
  #define SetPagePinned(page)	set_bit(PG_pinned, &(page)->flags)
  #define ClearPagePinned(page)	clear_bit(PG_pinned, &(page)->flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
174
175
176
177
178
179
180
181
182
183
  #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)
d688abf50   Andrew Morton   move page writeba...
184
185
186
187
  /*
   * Only test-and-set exist for PG_writeback.  The unconditional operators are
   * risky: they bypass page accounting.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
188
  #define PageWriteback(page)	test_bit(PG_writeback, &(page)->flags)
d688abf50   Andrew Morton   move page writeba...
189
190
191
192
  #define TestSetPageWriteback(page) test_and_set_bit(PG_writeback,	\
  							&(page)->flags)
  #define TestClearPageWriteback(page) test_and_clear_bit(PG_writeback,	\
  							&(page)->flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
193

676165a8a   Nick Piggin   [PATCH] Fix buddy...
194
195
196
  #define PageBuddy(page)		test_bit(PG_buddy, &(page)->flags)
  #define __SetPageBuddy(page)	__set_bit(PG_buddy, &(page)->flags)
  #define __ClearPageBuddy(page)	__clear_bit(PG_buddy, &(page)->flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
197
198
199
  #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)
d77c2d7cc   Fengguang Wu   readahead: introd...
200
201
202
203
  
  #define PageReadahead(page)	test_bit(PG_readahead, &(page)->flags)
  #define SetPageReadahead(page)	set_bit(PG_readahead, &(page)->flags)
  #define ClearPageReadahead(page) clear_bit(PG_readahead, &(page)->flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
204
205
206
207
208
  
  #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)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
209
  #define PageCompound(page)	test_bit(PG_compound, &(page)->flags)
5e9dace8d   Nick Piggin   [PATCH] mm: page_...
210
211
  #define __SetPageCompound(page)	__set_bit(PG_compound, &(page)->flags)
  #define __ClearPageCompound(page) __clear_bit(PG_compound, &(page)->flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
212

d85f33855   Christoph Lameter   Make page->privat...
213
  /*
6d7779538   Christoph Lameter   mm: optimize comp...
214
215
216
217
218
   * PG_reclaim is used in combination with PG_compound to mark the
   * head and tail of a compound page
   *
   * PG_compound & PG_reclaim	=> Tail page
   * PG_compound & ~PG_reclaim	=> Head page
d85f33855   Christoph Lameter   Make page->privat...
219
   */
6d7779538   Christoph Lameter   mm: optimize comp...
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
  
  #define PG_head_tail_mask ((1L << PG_compound) | (1L << PG_reclaim))
  
  #define PageTail(page)	((page->flags & PG_head_tail_mask) \
  				== PG_head_tail_mask)
  
  static inline void __SetPageTail(struct page *page)
  {
  	page->flags |= PG_head_tail_mask;
  }
  
  static inline void __ClearPageTail(struct page *page)
  {
  	page->flags &= ~PG_head_tail_mask;
  }
  
  #define PageHead(page)	((page->flags & PG_head_tail_mask) \
  				== (1L << PG_compound))
  #define __SetPageHead(page)	__SetPageCompound(page)
  #define __ClearPageHead(page)	__ClearPageCompound(page)
d85f33855   Christoph Lameter   Make page->privat...
240

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
241
242
243
244
245
246
247
248
249
250
251
252
253
  #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 */
fba2591bf   Linus Torvalds   VM: Remove "clear...
254
  extern void cancel_dirty_page(struct page *page, unsigned int account_size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
255
256
  int test_clear_page_writeback(struct page *page);
  int test_set_page_writeback(struct page *page);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
257
258
259
260
261
262
  static inline void set_page_writeback(struct page *page)
  {
  	test_set_page_writeback(page);
  }
  
  #endif	/* PAGE_FLAGS_H */