Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

memcg: introduce memcg_uncharge

At multiple places in memcontrol.c, the memory and memsw page counters are
being uncharged. This is error-prone. Let's move the functionality to a
newly introduced memcg_uncharge and call it from all those places.

Link: https://lkml.kernel.org/r/20250404013913.1663035-4-shakeel.butt@linux.dev
Signed-off-by: Shakeel Butt <shakeel.butt@linux.dev>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
Reviewed-by: Roman Gushchin <roman.gushchin@linux.dev>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Michal Hocko <mhocko@kernel.org>
Cc: Muchun Song <muchun.song@linux.dev>
Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

Shakeel Butt and committed by
Andrew Morton
89f342af 65d2d15f

+12 -16
+12 -16
mm/memcontrol.c
··· 1822 1822 return ret; 1823 1823 } 1824 1824 1825 + static void memcg_uncharge(struct mem_cgroup *memcg, unsigned int nr_pages) 1826 + { 1827 + page_counter_uncharge(&memcg->memory, nr_pages); 1828 + if (do_memsw_account()) 1829 + page_counter_uncharge(&memcg->memsw, nr_pages); 1830 + } 1831 + 1825 1832 /* 1826 1833 * Returns stocks cached in percpu and reset cached information. 1827 1834 */ ··· 1841 1834 return; 1842 1835 1843 1836 if (stock_pages) { 1844 - page_counter_uncharge(&old->memory, stock_pages); 1845 - if (do_memsw_account()) 1846 - page_counter_uncharge(&old->memsw, stock_pages); 1847 - 1837 + memcg_uncharge(old, stock_pages); 1848 1838 WRITE_ONCE(stock->nr_pages, 0); 1849 1839 } 1850 1840 ··· 1904 1900 * In case of unlikely failure to lock percpu stock_lock 1905 1901 * uncharge memcg directly. 1906 1902 */ 1907 - page_counter_uncharge(&memcg->memory, nr_pages); 1908 - if (do_memsw_account()) 1909 - page_counter_uncharge(&memcg->memsw, nr_pages); 1903 + memcg_uncharge(memcg, nr_pages); 1910 1904 return; 1911 1905 } 1912 1906 __refill_stock(memcg, nr_pages); ··· 2878 2876 2879 2877 mod_memcg_state(memcg, MEMCG_KMEM, -nr_pages); 2880 2878 memcg1_account_kmem(memcg, -nr_pages); 2881 - if (!mem_cgroup_is_root(memcg)) { 2882 - page_counter_uncharge(&memcg->memory, nr_pages); 2883 - if (do_memsw_account()) 2884 - page_counter_uncharge(&memcg->memsw, 2885 - nr_pages); 2886 - } 2879 + if (!mem_cgroup_is_root(memcg)) 2880 + memcg_uncharge(memcg, nr_pages); 2887 2881 2888 2882 css_put(&memcg->css); 2889 2883 } ··· 4700 4702 static void uncharge_batch(const struct uncharge_gather *ug) 4701 4703 { 4702 4704 if (ug->nr_memory) { 4703 - page_counter_uncharge(&ug->memcg->memory, ug->nr_memory); 4704 - if (do_memsw_account()) 4705 - page_counter_uncharge(&ug->memcg->memsw, ug->nr_memory); 4705 + memcg_uncharge(ug->memcg, ug->nr_memory); 4706 4706 if (ug->nr_kmem) { 4707 4707 mod_memcg_state(ug->memcg, MEMCG_KMEM, -ug->nr_kmem); 4708 4708 memcg1_account_kmem(ug->memcg, -ug->nr_kmem);