On Mon, Sep 08, 2025 at 11:28:20AM +0200, Michal Hocko wrote: > On Fri 05-09-25 13:16:06, Shakeel Butt wrote: > > Generally memcg charging is allowed from all the contexts including NMI > > where even spinning on spinlock can cause locking issues. However one > > call chain was missed during the addition of memcg charging from any > > context support. That is try_charge_memcg() -> memcg_memory_event() -> > > cgroup_file_notify(). > > > > The possible function call tree under cgroup_file_notify() can acquire > > many different spin locks in spinning mode. Some of them are > > cgroup_file_kn_lock, kernfs_notify_lock, pool_workqeue's lock. So, let's > > just skip cgroup_file_notify() from memcg charging if the context does > > not allow spinning. > > > > Signed-off-by: Shakeel Butt <shakeel.butt@xxxxxxxxx> > > Acked-by: Michal Hocko <mhocko@xxxxxxxx> Thanks. > > > --- > > include/linux/memcontrol.h | 23 ++++++++++++++++------- > > mm/memcontrol.c | 7 ++++--- > > 2 files changed, 20 insertions(+), 10 deletions(-) > > > > diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h > > index 9dc5b52672a6..054fa34c936a 100644 > > --- a/include/linux/memcontrol.h > > +++ b/include/linux/memcontrol.h > > @@ -993,22 +993,25 @@ static inline void count_memcg_event_mm(struct mm_struct *mm, > > count_memcg_events_mm(mm, idx, 1); > > } > > > > -static inline void memcg_memory_event(struct mem_cgroup *memcg, > > - enum memcg_memory_event event) > > +static inline void __memcg_memory_event(struct mem_cgroup *memcg, > > + enum memcg_memory_event event, > > + bool allow_spinning) > > { > > bool swap_event = event == MEMCG_SWAP_HIGH || event == MEMCG_SWAP_MAX || > > event == MEMCG_SWAP_FAIL; > > > > atomic_long_inc(&memcg->memory_events_local[event]); > > Doesn't this involve locking on 32b? I guess we do not care all that > much but we might want to bail out early on those arches for > !allow_spinning > I am prototyping irq_work based approach and if that looks good then we might not need to worry about 32b at all.