diff options
author | Christoph Lameter <cl@linux-foundation.org> | 2008-10-18 23:26:14 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-20 11:50:25 -0400 |
commit | b69408e88bd86b98feb7b9a38fd865e1ddb29827 (patch) | |
tree | b19277c29fe624870ba776cc6ada59928cd2796d /include/linux/mm_inline.h | |
parent | 62695a84eb8f2e718bf4dfb21700afaa7a08e0ea (diff) |
vmscan: Use an indexed array for LRU variables
Currently we are defining explicit variables for the inactive and active
list. An indexed array can be more generic and avoid repeating similar
code in several places in the reclaim code.
We are saving a few bytes in terms of code size:
Before:
text data bss dec hex filename
4097753 573120 4092484 8763357 85b7dd vmlinux
After:
text data bss dec hex filename
4097729 573120 4092484 8763333 85b7c5 vmlinux
Having an easy way to add new lru lists may ease future work on the
reclaim code.
Signed-off-by: Rik van Riel <riel@redhat.com>
Signed-off-by: Lee Schermerhorn <lee.schermerhorn@hp.com>
Signed-off-by: Christoph Lameter <cl@linux-foundation.org>
Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux/mm_inline.h')
-rw-r--r-- | include/linux/mm_inline.h | 49 |
1 files changed, 38 insertions, 11 deletions
diff --git a/include/linux/mm_inline.h b/include/linux/mm_inline.h index 895bc4e93039..2704729777ef 100644 --- a/include/linux/mm_inline.h +++ b/include/linux/mm_inline.h | |||
@@ -1,40 +1,67 @@ | |||
1 | static inline void | 1 | static inline void |
2 | add_page_to_lru_list(struct zone *zone, struct page *page, enum lru_list l) | ||
3 | { | ||
4 | list_add(&page->lru, &zone->lru[l].list); | ||
5 | __inc_zone_state(zone, NR_LRU_BASE + l); | ||
6 | } | ||
7 | |||
8 | static inline void | ||
9 | del_page_from_lru_list(struct zone *zone, struct page *page, enum lru_list l) | ||
10 | { | ||
11 | list_del(&page->lru); | ||
12 | __dec_zone_state(zone, NR_LRU_BASE + l); | ||
13 | } | ||
14 | |||
15 | static inline void | ||
2 | add_page_to_active_list(struct zone *zone, struct page *page) | 16 | add_page_to_active_list(struct zone *zone, struct page *page) |
3 | { | 17 | { |
4 | list_add(&page->lru, &zone->active_list); | 18 | add_page_to_lru_list(zone, page, LRU_ACTIVE); |
5 | __inc_zone_state(zone, NR_ACTIVE); | ||
6 | } | 19 | } |
7 | 20 | ||
8 | static inline void | 21 | static inline void |
9 | add_page_to_inactive_list(struct zone *zone, struct page *page) | 22 | add_page_to_inactive_list(struct zone *zone, struct page *page) |
10 | { | 23 | { |
11 | list_add(&page->lru, &zone->inactive_list); | 24 | add_page_to_lru_list(zone, page, LRU_INACTIVE); |
12 | __inc_zone_state(zone, NR_INACTIVE); | ||
13 | } | 25 | } |
14 | 26 | ||
15 | static inline void | 27 | static inline void |
16 | del_page_from_active_list(struct zone *zone, struct page *page) | 28 | del_page_from_active_list(struct zone *zone, struct page *page) |
17 | { | 29 | { |
18 | list_del(&page->lru); | 30 | del_page_from_lru_list(zone, page, LRU_ACTIVE); |
19 | __dec_zone_state(zone, NR_ACTIVE); | ||
20 | } | 31 | } |
21 | 32 | ||
22 | static inline void | 33 | static inline void |
23 | del_page_from_inactive_list(struct zone *zone, struct page *page) | 34 | del_page_from_inactive_list(struct zone *zone, struct page *page) |
24 | { | 35 | { |
25 | list_del(&page->lru); | 36 | del_page_from_lru_list(zone, page, LRU_INACTIVE); |
26 | __dec_zone_state(zone, NR_INACTIVE); | ||
27 | } | 37 | } |
28 | 38 | ||
29 | static inline void | 39 | static inline void |
30 | del_page_from_lru(struct zone *zone, struct page *page) | 40 | del_page_from_lru(struct zone *zone, struct page *page) |
31 | { | 41 | { |
42 | enum lru_list l = LRU_INACTIVE; | ||
43 | |||
32 | list_del(&page->lru); | 44 | list_del(&page->lru); |
33 | if (PageActive(page)) { | 45 | if (PageActive(page)) { |
34 | __ClearPageActive(page); | 46 | __ClearPageActive(page); |
35 | __dec_zone_state(zone, NR_ACTIVE); | 47 | l = LRU_ACTIVE; |
36 | } else { | ||
37 | __dec_zone_state(zone, NR_INACTIVE); | ||
38 | } | 48 | } |
49 | __dec_zone_state(zone, NR_LRU_BASE + l); | ||
39 | } | 50 | } |
40 | 51 | ||
52 | /** | ||
53 | * page_lru - which LRU list should a page be on? | ||
54 | * @page: the page to test | ||
55 | * | ||
56 | * Returns the LRU list a page should be on, as an index | ||
57 | * into the array of LRU lists. | ||
58 | */ | ||
59 | static inline enum lru_list page_lru(struct page *page) | ||
60 | { | ||
61 | enum lru_list lru = LRU_BASE; | ||
62 | |||
63 | if (PageActive(page)) | ||
64 | lru += LRU_ACTIVE; | ||
65 | |||
66 | return lru; | ||
67 | } | ||