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>
This commit is contained in:
parent
6819457d2c
commit
d688abf50b
2 changed files with 12 additions and 30 deletions
|
@ -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)
|
||||||
} 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)
|
||||||
} else {
|
} else {
|
||||||
ret = TestSetPageWriteback(page);
|
ret = TestSetPageWriteback(page);
|
||||||
}
|
}
|
||||||
|
if (!ret)
|
||||||
|
inc_zone_page_state(page, NR_WRITEBACK);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue