OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [include/] [linux/] [page-flags.h] - Blame information for rev 82

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 * Macros for manipulating and testing page->flags
3
 */
4
 
5
#ifndef PAGE_FLAGS_H
6
#define PAGE_FLAGS_H
7
 
8
#include <linux/types.h>
9
#include <linux/mm_types.h>
10
 
11
/*
12
 * Various page->flags bits:
13
 *
14
 * PG_reserved is set for special pages, which can never be swapped out. Some
15
 * of them might not even exist (eg empty_bad_page)...
16
 *
17
 * The PG_private bitflag is set on pagecache pages if they contain filesystem
18
 * specific data (which is normally at page->private). It can be used by
19
 * private allocations for its own usage.
20
 *
21
 * During initiation of disk I/O, PG_locked is set. This bit is set before I/O
22
 * and cleared when writeback _starts_ or when read _completes_. PG_writeback
23
 * is set before writeback starts and cleared when it finishes.
24
 *
25
 * PG_locked also pins a page in pagecache, and blocks truncation of the file
26
 * while it is held.
27
 *
28
 * page_waitqueue(page) is a wait queue of all tasks waiting for the page
29
 * to become unlocked.
30
 *
31
 * PG_uptodate tells whether the page's contents is valid.  When a read
32
 * completes, the page becomes uptodate, unless a disk I/O error happened.
33
 *
34
 * PG_referenced, PG_reclaim are used for page reclaim for anonymous and
35
 * file-backed pagecache (see mm/vmscan.c).
36
 *
37
 * PG_error is set to indicate that an I/O error occurred on this page.
38
 *
39
 * PG_arch_1 is an architecture specific page state bit.  The generic code
40
 * guarantees that this bit is cleared for a page when it first is entered into
41
 * the page cache.
42
 *
43
 * PG_highmem pages are not permanently mapped into the kernel virtual address
44
 * space, they need to be kmapped separately for doing IO on the pages.  The
45
 * struct page (these bits with information) are always mapped into kernel
46
 * address space...
47
 *
48
 * PG_buddy is set to indicate that the page is free and in the buddy system
49
 * (see mm/page_alloc.c).
50
 *
51
 */
52
 
53
/*
54
 * Don't use the *_dontuse flags.  Use the macros.  Otherwise you'll break
55
 * locked- and dirty-page accounting.
56
 *
57
 * The page flags field is split into two parts, the main flags area
58
 * which extends from the low bits upwards, and the fields area which
59
 * extends from the high bits downwards.
60
 *
61
 *  | FIELD | ... | FLAGS |
62
 *  N-1     ^             0
63
 *          (N-FLAGS_RESERVED)
64
 *
65
 * The fields area is reserved for fields mapping zone, node and SPARSEMEM
66
 * section.  The boundry between these two areas is defined by
67
 * FLAGS_RESERVED which defines the width of the fields section
68
 * (see linux/mmzone.h).  New flags must _not_ overlap with this area.
69
 */
70
#define PG_locked                0      /* Page is locked. Don't touch. */
71
#define PG_error                 1
72
#define PG_referenced            2
73
#define PG_uptodate              3
74
 
75
#define PG_dirty                 4
76
#define PG_lru                   5
77
#define PG_active                6
78
#define PG_slab                  7      /* slab debug (Suparna wants this) */
79
 
80
#define PG_owner_priv_1          8      /* Owner use. If pagecache, fs may use*/
81
#define PG_arch_1                9
82
#define PG_reserved             10
83
#define PG_private              11      /* If pagecache, has fs-private data */
84
 
85
#define PG_writeback            12      /* Page is under writeback */
86
#define PG_compound             14      /* Part of a compound page */
87
#define PG_swapcache            15      /* Swap page: swp_entry_t in private */
88
 
89
#define PG_mappedtodisk         16      /* Has blocks allocated on-disk */
90
#define PG_reclaim              17      /* To be reclaimed asap */
91
#define PG_buddy                19      /* Page is free, on buddy lists */
92
 
93
/* PG_readahead is only used for file reads; PG_reclaim is only for writes */
94
#define PG_readahead            PG_reclaim /* Reminder to do async read-ahead */
95
 
96
/* PG_owner_priv_1 users should have descriptive aliases */
97
#define PG_checked              PG_owner_priv_1 /* Used by some filesystems */
98
#define PG_pinned               PG_owner_priv_1 /* Xen pinned pagetable */
99
 
100
#if (BITS_PER_LONG > 32)
101
/*
102
 * 64-bit-only flags build down from bit 31
103
 *
104
 * 32 bit  -------------------------------| FIELDS |       FLAGS         |
105
 * 64 bit  |           FIELDS             | ??????         FLAGS         |
106
 *         63                            32                              0
107
 */
108
#define PG_uncached             31      /* Page has been mapped as uncached */
109
#endif
110
 
111
/*
112
 * Manipulation of page state flags
113
 */
114
#define PageLocked(page)                \
115
                test_bit(PG_locked, &(page)->flags)
116
#define SetPageLocked(page)             \
117
                set_bit(PG_locked, &(page)->flags)
118
#define TestSetPageLocked(page)         \
119
                test_and_set_bit(PG_locked, &(page)->flags)
120
#define ClearPageLocked(page)           \
121
                clear_bit(PG_locked, &(page)->flags)
122
#define TestClearPageLocked(page)       \
123
                test_and_clear_bit(PG_locked, &(page)->flags)
124
 
125
#define PageError(page)         test_bit(PG_error, &(page)->flags)
126
#define SetPageError(page)      set_bit(PG_error, &(page)->flags)
127
#define ClearPageError(page)    clear_bit(PG_error, &(page)->flags)
128
 
129
#define PageReferenced(page)    test_bit(PG_referenced, &(page)->flags)
130
#define SetPageReferenced(page) set_bit(PG_referenced, &(page)->flags)
131
#define ClearPageReferenced(page)       clear_bit(PG_referenced, &(page)->flags)
132
#define TestClearPageReferenced(page) test_and_clear_bit(PG_referenced, &(page)->flags)
133
 
134
#define PageUptodate(page)      test_bit(PG_uptodate, &(page)->flags)
135
#ifdef CONFIG_S390
136
static inline void SetPageUptodate(struct page *page)
137
{
138
        if (!test_and_set_bit(PG_uptodate, &page->flags))
139
                page_clear_dirty(page);
140
}
141
#else
142
#define SetPageUptodate(page)   set_bit(PG_uptodate, &(page)->flags)
143
#endif
144
#define ClearPageUptodate(page) clear_bit(PG_uptodate, &(page)->flags)
145
 
146
#define PageDirty(page)         test_bit(PG_dirty, &(page)->flags)
147
#define SetPageDirty(page)      set_bit(PG_dirty, &(page)->flags)
148
#define TestSetPageDirty(page)  test_and_set_bit(PG_dirty, &(page)->flags)
149
#define ClearPageDirty(page)    clear_bit(PG_dirty, &(page)->flags)
150
#define __ClearPageDirty(page)  __clear_bit(PG_dirty, &(page)->flags)
151
#define TestClearPageDirty(page) test_and_clear_bit(PG_dirty, &(page)->flags)
152
 
153
#define PageLRU(page)           test_bit(PG_lru, &(page)->flags)
154
#define SetPageLRU(page)        set_bit(PG_lru, &(page)->flags)
155
#define ClearPageLRU(page)      clear_bit(PG_lru, &(page)->flags)
156
#define __ClearPageLRU(page)    __clear_bit(PG_lru, &(page)->flags)
157
 
158
#define PageActive(page)        test_bit(PG_active, &(page)->flags)
159
#define SetPageActive(page)     set_bit(PG_active, &(page)->flags)
160
#define ClearPageActive(page)   clear_bit(PG_active, &(page)->flags)
161
#define __ClearPageActive(page) __clear_bit(PG_active, &(page)->flags)
162
 
163
#define PageSlab(page)          test_bit(PG_slab, &(page)->flags)
164
#define __SetPageSlab(page)     __set_bit(PG_slab, &(page)->flags)
165
#define __ClearPageSlab(page)   __clear_bit(PG_slab, &(page)->flags)
166
 
167
#ifdef CONFIG_HIGHMEM
168
#define PageHighMem(page)       is_highmem(page_zone(page))
169
#else
170
#define PageHighMem(page)       0 /* needed to optimize away at compile time */
171
#endif
172
 
173
#define PageChecked(page)       test_bit(PG_checked, &(page)->flags)
174
#define SetPageChecked(page)    set_bit(PG_checked, &(page)->flags)
175
#define ClearPageChecked(page)  clear_bit(PG_checked, &(page)->flags)
176
 
177
#define PagePinned(page)        test_bit(PG_pinned, &(page)->flags)
178
#define SetPagePinned(page)     set_bit(PG_pinned, &(page)->flags)
179
#define ClearPagePinned(page)   clear_bit(PG_pinned, &(page)->flags)
180
 
181
#define PageReserved(page)      test_bit(PG_reserved, &(page)->flags)
182
#define SetPageReserved(page)   set_bit(PG_reserved, &(page)->flags)
183
#define ClearPageReserved(page) clear_bit(PG_reserved, &(page)->flags)
184
#define __ClearPageReserved(page)       __clear_bit(PG_reserved, &(page)->flags)
185
 
186
#define SetPagePrivate(page)    set_bit(PG_private, &(page)->flags)
187
#define ClearPagePrivate(page)  clear_bit(PG_private, &(page)->flags)
188
#define PagePrivate(page)       test_bit(PG_private, &(page)->flags)
189
#define __SetPagePrivate(page)  __set_bit(PG_private, &(page)->flags)
190
#define __ClearPagePrivate(page) __clear_bit(PG_private, &(page)->flags)
191
 
192
/*
193
 * Only test-and-set exist for PG_writeback.  The unconditional operators are
194
 * risky: they bypass page accounting.
195
 */
196
#define PageWriteback(page)     test_bit(PG_writeback, &(page)->flags)
197
#define TestSetPageWriteback(page) test_and_set_bit(PG_writeback,       \
198
                                                        &(page)->flags)
199
#define TestClearPageWriteback(page) test_and_clear_bit(PG_writeback,   \
200
                                                        &(page)->flags)
201
 
202
#define PageBuddy(page)         test_bit(PG_buddy, &(page)->flags)
203
#define __SetPageBuddy(page)    __set_bit(PG_buddy, &(page)->flags)
204
#define __ClearPageBuddy(page)  __clear_bit(PG_buddy, &(page)->flags)
205
 
206
#define PageMappedToDisk(page)  test_bit(PG_mappedtodisk, &(page)->flags)
207
#define SetPageMappedToDisk(page) set_bit(PG_mappedtodisk, &(page)->flags)
208
#define ClearPageMappedToDisk(page) clear_bit(PG_mappedtodisk, &(page)->flags)
209
 
210
#define PageReadahead(page)     test_bit(PG_readahead, &(page)->flags)
211
#define SetPageReadahead(page)  set_bit(PG_readahead, &(page)->flags)
212
#define ClearPageReadahead(page) clear_bit(PG_readahead, &(page)->flags)
213
 
214
#define PageReclaim(page)       test_bit(PG_reclaim, &(page)->flags)
215
#define SetPageReclaim(page)    set_bit(PG_reclaim, &(page)->flags)
216
#define ClearPageReclaim(page)  clear_bit(PG_reclaim, &(page)->flags)
217
#define TestClearPageReclaim(page) test_and_clear_bit(PG_reclaim, &(page)->flags)
218
 
219
#define PageCompound(page)      test_bit(PG_compound, &(page)->flags)
220
#define __SetPageCompound(page) __set_bit(PG_compound, &(page)->flags)
221
#define __ClearPageCompound(page) __clear_bit(PG_compound, &(page)->flags)
222
 
223
/*
224
 * PG_reclaim is used in combination with PG_compound to mark the
225
 * head and tail of a compound page
226
 *
227
 * PG_compound & PG_reclaim     => Tail page
228
 * PG_compound & ~PG_reclaim    => Head page
229
 */
230
 
231
#define PG_head_tail_mask ((1L << PG_compound) | (1L << PG_reclaim))
232
 
233
#define PageTail(page)  ((page->flags & PG_head_tail_mask) \
234
                                == PG_head_tail_mask)
235
 
236
static inline void __SetPageTail(struct page *page)
237
{
238
        page->flags |= PG_head_tail_mask;
239
}
240
 
241
static inline void __ClearPageTail(struct page *page)
242
{
243
        page->flags &= ~PG_head_tail_mask;
244
}
245
 
246
#define PageHead(page)  ((page->flags & PG_head_tail_mask) \
247
                                == (1L << PG_compound))
248
#define __SetPageHead(page)     __SetPageCompound(page)
249
#define __ClearPageHead(page)   __ClearPageCompound(page)
250
 
251
#ifdef CONFIG_SWAP
252
#define PageSwapCache(page)     test_bit(PG_swapcache, &(page)->flags)
253
#define SetPageSwapCache(page)  set_bit(PG_swapcache, &(page)->flags)
254
#define ClearPageSwapCache(page) clear_bit(PG_swapcache, &(page)->flags)
255
#else
256
#define PageSwapCache(page)     0
257
#endif
258
 
259
#define PageUncached(page)      test_bit(PG_uncached, &(page)->flags)
260
#define SetPageUncached(page)   set_bit(PG_uncached, &(page)->flags)
261
#define ClearPageUncached(page) clear_bit(PG_uncached, &(page)->flags)
262
 
263
struct page;    /* forward declaration */
264
 
265
extern void cancel_dirty_page(struct page *page, unsigned int account_size);
266
 
267
int test_clear_page_writeback(struct page *page);
268
int test_set_page_writeback(struct page *page);
269
 
270
static inline void set_page_writeback(struct page *page)
271
{
272
        test_set_page_writeback(page);
273
}
274
 
275
#endif  /* PAGE_FLAGS_H */

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.