diff options
Diffstat (limited to 'mm/memcontrol.c')
-rw-r--r-- | mm/memcontrol.c | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 597d58101872..f3c15bb07cce 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -25,7 +25,7 @@ | |||
25 | #include <linux/page_counter.h> | 25 | #include <linux/page_counter.h> |
26 | #include <linux/memcontrol.h> | 26 | #include <linux/memcontrol.h> |
27 | #include <linux/cgroup.h> | 27 | #include <linux/cgroup.h> |
28 | #include <linux/mm.h> | 28 | #include <linux/pagewalk.h> |
29 | #include <linux/sched/mm.h> | 29 | #include <linux/sched/mm.h> |
30 | #include <linux/shmem_fs.h> | 30 | #include <linux/shmem_fs.h> |
31 | #include <linux/hugetlb.h> | 31 | #include <linux/hugetlb.h> |
@@ -5499,17 +5499,16 @@ static int mem_cgroup_count_precharge_pte_range(pmd_t *pmd, | |||
5499 | return 0; | 5499 | return 0; |
5500 | } | 5500 | } |
5501 | 5501 | ||
5502 | static const struct mm_walk_ops precharge_walk_ops = { | ||
5503 | .pmd_entry = mem_cgroup_count_precharge_pte_range, | ||
5504 | }; | ||
5505 | |||
5502 | static unsigned long mem_cgroup_count_precharge(struct mm_struct *mm) | 5506 | static unsigned long mem_cgroup_count_precharge(struct mm_struct *mm) |
5503 | { | 5507 | { |
5504 | unsigned long precharge; | 5508 | unsigned long precharge; |
5505 | 5509 | ||
5506 | struct mm_walk mem_cgroup_count_precharge_walk = { | ||
5507 | .pmd_entry = mem_cgroup_count_precharge_pte_range, | ||
5508 | .mm = mm, | ||
5509 | }; | ||
5510 | down_read(&mm->mmap_sem); | 5510 | down_read(&mm->mmap_sem); |
5511 | walk_page_range(0, mm->highest_vm_end, | 5511 | walk_page_range(mm, 0, mm->highest_vm_end, &precharge_walk_ops, NULL); |
5512 | &mem_cgroup_count_precharge_walk); | ||
5513 | up_read(&mm->mmap_sem); | 5512 | up_read(&mm->mmap_sem); |
5514 | 5513 | ||
5515 | precharge = mc.precharge; | 5514 | precharge = mc.precharge; |
@@ -5778,13 +5777,12 @@ put: /* get_mctgt_type() gets the page */ | |||
5778 | return ret; | 5777 | return ret; |
5779 | } | 5778 | } |
5780 | 5779 | ||
5780 | static const struct mm_walk_ops charge_walk_ops = { | ||
5781 | .pmd_entry = mem_cgroup_move_charge_pte_range, | ||
5782 | }; | ||
5783 | |||
5781 | static void mem_cgroup_move_charge(void) | 5784 | static void mem_cgroup_move_charge(void) |
5782 | { | 5785 | { |
5783 | struct mm_walk mem_cgroup_move_charge_walk = { | ||
5784 | .pmd_entry = mem_cgroup_move_charge_pte_range, | ||
5785 | .mm = mc.mm, | ||
5786 | }; | ||
5787 | |||
5788 | lru_add_drain_all(); | 5786 | lru_add_drain_all(); |
5789 | /* | 5787 | /* |
5790 | * Signal lock_page_memcg() to take the memcg's move_lock | 5788 | * Signal lock_page_memcg() to take the memcg's move_lock |
@@ -5810,7 +5808,8 @@ retry: | |||
5810 | * When we have consumed all precharges and failed in doing | 5808 | * When we have consumed all precharges and failed in doing |
5811 | * additional charge, the page walk just aborts. | 5809 | * additional charge, the page walk just aborts. |
5812 | */ | 5810 | */ |
5813 | walk_page_range(0, mc.mm->highest_vm_end, &mem_cgroup_move_charge_walk); | 5811 | walk_page_range(mc.mm, 0, mc.mm->highest_vm_end, &charge_walk_ops, |
5812 | NULL); | ||
5814 | 5813 | ||
5815 | up_read(&mc.mm->mmap_sem); | 5814 | up_read(&mc.mm->mmap_sem); |
5816 | atomic_dec(&mc.from->moving_account); | 5815 | atomic_dec(&mc.from->moving_account); |