mem_cgroup_uncharge_list will be needed in a later patch for an optimization to free zapped tail pages when splitting isolated thp. Signed-off-by: Usama Arif <usamaarif642@xxxxxxxxx> --- include/linux/memcontrol.h | 12 ++++++++++++ mm/memcontrol.c | 19 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 07eadf7ecbba..cbaf0ea1b217 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -713,6 +713,14 @@ static inline void mem_cgroup_uncharge(struct folio *folio) __mem_cgroup_uncharge(folio); } +void __mem_cgroup_uncharge_list(struct list_head *page_list); +static inline void mem_cgroup_uncharge_list(struct list_head *page_list) +{ + if (mem_cgroup_disabled()) + return; + __mem_cgroup_uncharge_list(page_list); +} + void __mem_cgroup_uncharge_folios(struct folio_batch *folios); static inline void mem_cgroup_uncharge_folios(struct folio_batch *folios) { @@ -1203,6 +1211,10 @@ static inline void mem_cgroup_uncharge(struct folio *folio) { } +static inline void mem_cgroup_uncharge_list(struct list_head *page_list) +{ +} + static inline void mem_cgroup_uncharge_folios(struct folio_batch *folios) { } diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 9b3ef3a70833..f568b9594c2b 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -4717,6 +4717,25 @@ void __mem_cgroup_uncharge(struct folio *folio) uncharge_batch(&ug); } +/** + * __mem_cgroup_uncharge_list - uncharge a list of page + * @page_list: list of pages to uncharge + * + * Uncharge a list of pages previously charged with + * __mem_cgroup_charge(). + */ +void __mem_cgroup_uncharge_list(struct list_head *page_list) +{ + struct uncharge_gather ug; + struct folio *folio; + + uncharge_gather_clear(&ug); + list_for_each_entry(folio, page_list, lru) + uncharge_folio(folio, &ug); + if (ug.memcg) + uncharge_batch(&ug); +} + void __mem_cgroup_uncharge_folios(struct folio_batch *folios) { struct uncharge_gather ug; -- 2.43.0