On Thu 19-12-24 08:27:06, Michal Hocko wrote: > On Thu 19-12-24 08:08:44, Michal Hocko wrote: > > All that being said, the message I wanted to get through is that atomic > > (NOWAIT) charges could be trully reentrant if the stock local lock uses > > trylock. We do not need a dedicated gfp flag for that now. > > And I want to add. Not only we can achieve that, I also think this is > desirable because for !RT this will be no functional change and for RT > it makes more sense to simply do deterministic (albeit more costly > page_counter update) than spin over a lock to use the batch (or learn > the batch cannot be used). So effectively this on top of yours diff --git a/mm/memcontrol.c b/mm/memcontrol.c index f168d223375f..29a831f6109c 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -1768,7 +1768,7 @@ static bool consume_stock(struct mem_cgroup *memcg, unsigned int nr_pages, return ret; if (!local_trylock_irqsave(&memcg_stock.stock_lock, flags)) { - if (gfp_mask & __GFP_TRYLOCK) + if (!gfpflags_allow_blockingk(gfp_mask)) return ret; local_lock_irqsave(&memcg_stock.stock_lock, flags); } @@ -2211,6 +2211,9 @@ int try_charge_memcg(struct mem_cgroup *memcg, gfp_t gfp_mask, if (consume_stock(memcg, nr_pages, gfp_mask)) return 0; + if (!gfpflags_allow_blockingk(gfp_mask)) + batch = nr_pages; + if (!do_memsw_account() || page_counter_try_charge(&memcg->memsw, batch, &counter)) { if (page_counter_try_charge(&memcg->memory, batch, &counter)) -- Michal Hocko SUSE Labs