Commit d688abf50bd5a30d2c44dea2a72dd59052cd3cce
Committed by
Linus Torvalds
1 parent
6819457d2c
Exists in
master
and in
7 other branches
move page writeback acounting out of macros
page-writeback accounting is presently performed in the page-flags macros. This is inconsistent and a bit ugly and makes it awkward to implement per-backing_dev under-writeback page accounting. So move this accounting down to the callsite(s). Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 2 changed files with 12 additions and 30 deletions Side-by-side Diff
include/linux/page-flags.h
... | ... | @@ -189,37 +189,15 @@ |
189 | 189 | #define __SetPagePrivate(page) __set_bit(PG_private, &(page)->flags) |
190 | 190 | #define __ClearPagePrivate(page) __clear_bit(PG_private, &(page)->flags) |
191 | 191 | |
192 | +/* | |
193 | + * Only test-and-set exist for PG_writeback. The unconditional operators are | |
194 | + * risky: they bypass page accounting. | |
195 | + */ | |
192 | 196 | #define PageWriteback(page) test_bit(PG_writeback, &(page)->flags) |
193 | -#define SetPageWriteback(page) \ | |
194 | - do { \ | |
195 | - if (!test_and_set_bit(PG_writeback, \ | |
196 | - &(page)->flags)) \ | |
197 | - inc_zone_page_state(page, NR_WRITEBACK); \ | |
198 | - } while (0) | |
199 | -#define TestSetPageWriteback(page) \ | |
200 | - ({ \ | |
201 | - int ret; \ | |
202 | - ret = test_and_set_bit(PG_writeback, \ | |
203 | - &(page)->flags); \ | |
204 | - if (!ret) \ | |
205 | - inc_zone_page_state(page, NR_WRITEBACK); \ | |
206 | - ret; \ | |
207 | - }) | |
208 | -#define ClearPageWriteback(page) \ | |
209 | - do { \ | |
210 | - if (test_and_clear_bit(PG_writeback, \ | |
211 | - &(page)->flags)) \ | |
212 | - dec_zone_page_state(page, NR_WRITEBACK); \ | |
213 | - } while (0) | |
214 | -#define TestClearPageWriteback(page) \ | |
215 | - ({ \ | |
216 | - int ret; \ | |
217 | - ret = test_and_clear_bit(PG_writeback, \ | |
218 | - &(page)->flags); \ | |
219 | - if (ret) \ | |
220 | - dec_zone_page_state(page, NR_WRITEBACK); \ | |
221 | - ret; \ | |
222 | - }) | |
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) | |
223 | 201 | |
224 | 202 | #define PageBuddy(page) test_bit(PG_buddy, &(page)->flags) |
225 | 203 | #define __SetPageBuddy(page) __set_bit(PG_buddy, &(page)->flags) |
mm/page-writeback.c
... | ... | @@ -987,6 +987,8 @@ |
987 | 987 | } else { |
988 | 988 | ret = TestClearPageWriteback(page); |
989 | 989 | } |
990 | + if (ret) | |
991 | + dec_zone_page_state(page, NR_WRITEBACK); | |
990 | 992 | return ret; |
991 | 993 | } |
992 | 994 | |
... | ... | @@ -1012,6 +1014,8 @@ |
1012 | 1014 | } else { |
1013 | 1015 | ret = TestSetPageWriteback(page); |
1014 | 1016 | } |
1017 | + if (!ret) | |
1018 | + inc_zone_page_state(page, NR_WRITEBACK); | |
1015 | 1019 | return ret; |
1016 | 1020 | |
1017 | 1021 | } |