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); > }