@@ -29,6 +29,11 @@ struct pagevec {
};
};
+#define declare_pagevec(name, size) union { \
+ struct pagevec name; \
+ void *__p ##name [size + 1]; \
+}
+
void __pagevec_release(struct pagevec *pvec);
void __pagevec_lru_add(struct pagevec *pvec);
void pagevec_remove_exceptionals(struct pagevec *pvec);
@@ -45,14 +45,17 @@
/* How many pages do we try to swap or page in/out together? */
int page_cluster;
+#define LRU_PAGEVEC_SIZE 63
+#define lru_pagevec(name) declare_pagevec(name, LRU_PAGEVEC_SIZE)
+
/* Protecting only lru_rotate.pvec which requires disabling interrupts */
struct lru_rotate {
local_lock_t lock;
- struct pagevec pvec;
+ lru_pagevec(pvec);
};
static DEFINE_PER_CPU(struct lru_rotate, lru_rotate) = {
.lock = INIT_LOCAL_LOCK(lock),
- .pvec.sz = PAGEVEC_SIZE,
+ .pvec.sz = LRU_PAGEVEC_SIZE,
};
/*
@@ -61,22 +64,22 @@ static DEFINE_PER_CPU(struct lru_rotate, lru_rotate) = {
*/
struct lru_pvecs {
local_lock_t lock;
- struct pagevec lru_add;
- struct pagevec lru_deactivate_file;
- struct pagevec lru_deactivate;
- struct pagevec lru_lazyfree;
+ lru_pagevec(lru_add);
+ lru_pagevec(lru_deactivate_file);
+ lru_pagevec(lru_deactivate);
+ lru_pagevec(lru_lazyfree);
#ifdef CONFIG_SMP
- struct pagevec activate_page;
+ lru_pagevec(activate_page);
#endif
};
static DEFINE_PER_CPU(struct lru_pvecs, lru_pvecs) = {
.lock = INIT_LOCAL_LOCK(lock),
- .lru_add.sz = PAGEVEC_SIZE,
- .lru_deactivate_file.sz = PAGEVEC_SIZE,
- .lru_deactivate.sz = PAGEVEC_SIZE,
- .lru_lazyfree.sz = PAGEVEC_SIZE,
+ .lru_add.sz = LRU_PAGEVEC_SIZE,
+ .lru_deactivate_file.sz = LRU_PAGEVEC_SIZE,
+ .lru_deactivate.sz = LRU_PAGEVEC_SIZE,
+ .lru_lazyfree.sz = LRU_PAGEVEC_SIZE,
#ifdef CONFIG_SMP
- .activate_page.sz = PAGEVEC_SIZE,
+ .activate_page.sz = LRU_PAGEVEC_SIZE,
#endif
};
Tim Chen reports that increasing the size of LRU pagevecs is advantageous with a workload he has: https://lore.kernel.org/linux-mm/d1cc9f12a8ad6c2a52cb600d93b06b064f2bbc57.1593205965.git.tim.c.chen@linux.intel.com/ Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> --- include/linux/pagevec.h | 5 +++++ mm/swap.c | 27 +++++++++++++++------------ 2 files changed, 20 insertions(+), 12 deletions(-)