Commit d688abf5 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

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: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 6819457d
...@@ -189,37 +189,15 @@ static inline void SetPageUptodate(struct page *page) ...@@ -189,37 +189,15 @@ static inline void SetPageUptodate(struct page *page)
#define __SetPagePrivate(page) __set_bit(PG_private, &(page)->flags) #define __SetPagePrivate(page) __set_bit(PG_private, &(page)->flags)
#define __ClearPagePrivate(page) __clear_bit(PG_private, &(page)->flags) #define __ClearPagePrivate(page) __clear_bit(PG_private, &(page)->flags)
/*
* Only test-and-set exist for PG_writeback. The unconditional operators are
* risky: they bypass page accounting.
*/
#define PageWriteback(page) test_bit(PG_writeback, &(page)->flags) #define PageWriteback(page) test_bit(PG_writeback, &(page)->flags)
#define SetPageWriteback(page) \ #define TestSetPageWriteback(page) test_and_set_bit(PG_writeback, \
do { \ &(page)->flags)
if (!test_and_set_bit(PG_writeback, \ #define TestClearPageWriteback(page) test_and_clear_bit(PG_writeback, \
&(page)->flags)) \ &(page)->flags)
inc_zone_page_state(page, NR_WRITEBACK); \
} while (0)
#define TestSetPageWriteback(page) \
({ \
int ret; \
ret = test_and_set_bit(PG_writeback, \
&(page)->flags); \
if (!ret) \
inc_zone_page_state(page, NR_WRITEBACK); \
ret; \
})
#define ClearPageWriteback(page) \
do { \
if (test_and_clear_bit(PG_writeback, \
&(page)->flags)) \
dec_zone_page_state(page, NR_WRITEBACK); \
} while (0)
#define TestClearPageWriteback(page) \
({ \
int ret; \
ret = test_and_clear_bit(PG_writeback, \
&(page)->flags); \
if (ret) \
dec_zone_page_state(page, NR_WRITEBACK); \
ret; \
})
#define PageBuddy(page) test_bit(PG_buddy, &(page)->flags) #define PageBuddy(page) test_bit(PG_buddy, &(page)->flags)
#define __SetPageBuddy(page) __set_bit(PG_buddy, &(page)->flags) #define __SetPageBuddy(page) __set_bit(PG_buddy, &(page)->flags)
......
...@@ -987,6 +987,8 @@ int test_clear_page_writeback(struct page *page) ...@@ -987,6 +987,8 @@ int test_clear_page_writeback(struct page *page)
} else { } else {
ret = TestClearPageWriteback(page); ret = TestClearPageWriteback(page);
} }
if (ret)
dec_zone_page_state(page, NR_WRITEBACK);
return ret; return ret;
} }
...@@ -1012,6 +1014,8 @@ int test_set_page_writeback(struct page *page) ...@@ -1012,6 +1014,8 @@ int test_set_page_writeback(struct page *page)
} else { } else {
ret = TestSetPageWriteback(page); ret = TestSetPageWriteback(page);
} }
if (!ret)
inc_zone_page_state(page, NR_WRITEBACK);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment