Re: [RFC PATCH 02/10] memcg: decouple drain_obj_stock from local stock
From: Vlastimil Babka
Date: Fri Mar 14 2025 - 05:57:42 EST
On 3/14/25 07:15, Shakeel Butt wrote:
> Currently drain_obj_stock() can potentially call __refill_stock which
> accesses local cpu stock and thus requires memcg stock's local_lock.
> However if we look at the code paths leading to drain_obj_stock(), there
> is never a good reason to refill the memcg stock at all from it.
>
> At the moment, drain_obj_stock can be called from reclaim, hotplug cpu
> teardown, mod_objcg_state() and refill_obj_stock(). For reclaim and
> hotplug there is no need to refill. For the other two paths, most
> probably the newly switched objcg would be used in near future and thus
> no need to refill stock with the older objcg.
>
> In addition, __refill_stock() from drain_obj_stock() happens on rare
> cases, so performance is not really an issue. Let's just uncharge
> directly instead of refill which will also decouple drain_obj_stock from
> local cpu stock and local_lock requirements.
>
> Signed-off-by: Shakeel Butt <shakeel.butt@xxxxxxxxx>
Acked-by: Vlastimil Babka <vbabka@xxxxxxx>
> ---
> mm/memcontrol.c | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> index c09a32e93d39..28cb75b5bc66 100644
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -2855,7 +2855,12 @@ static struct obj_cgroup *drain_obj_stock(struct memcg_stock_pcp *stock)
>
> mod_memcg_state(memcg, MEMCG_KMEM, -nr_pages);
> memcg1_account_kmem(memcg, -nr_pages);
> - __refill_stock(memcg, nr_pages);
> + if (!mem_cgroup_is_root(memcg)) {
> + page_counter_uncharge(&memcg->memory, nr_pages);
> + if (do_memsw_account())
> + page_counter_uncharge(&memcg->memsw,
> + nr_pages);
> + }
>
> css_put(&memcg->css);
> }