Commit d688abf50bd5a30d2c44dea2a72dd59052cd3cce

Authored by Andrew Morton
Committed by Linus Torvalds
1 parent 6819457d2c

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)
... ... @@ -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 }