|
@@ -829,6 +829,32 @@ void mem_cgroup_del_lru(struct page *page)
|
|
|
mem_cgroup_del_lru_list(page, page_lru(page));
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Writeback is about to end against a page which has been marked for immediate
|
|
|
+ * reclaim. If it still appears to be reclaimable, move it to the tail of the
|
|
|
+ * inactive list.
|
|
|
+ */
|
|
|
+void mem_cgroup_rotate_reclaimable_page(struct page *page)
|
|
|
+{
|
|
|
+ struct mem_cgroup_per_zone *mz;
|
|
|
+ struct page_cgroup *pc;
|
|
|
+ enum lru_list lru = page_lru(page);
|
|
|
+
|
|
|
+ if (mem_cgroup_disabled())
|
|
|
+ return;
|
|
|
+
|
|
|
+ pc = lookup_page_cgroup(page);
|
|
|
+ /* unused or root page is not rotated. */
|
|
|
+ if (!PageCgroupUsed(pc))
|
|
|
+ return;
|
|
|
+ /* Ensure pc->mem_cgroup is visible after reading PCG_USED. */
|
|
|
+ smp_rmb();
|
|
|
+ if (mem_cgroup_is_root(pc->mem_cgroup))
|
|
|
+ return;
|
|
|
+ mz = page_cgroup_zoneinfo(pc);
|
|
|
+ list_move_tail(&pc->lru, &mz->lists[lru]);
|
|
|
+}
|
|
|
+
|
|
|
void mem_cgroup_rotate_lru_list(struct page *page, enum lru_list lru)
|
|
|
{
|
|
|
struct mem_cgroup_per_zone *mz;
|