On 2022-01-05 15:16:53 [+0100], Michal Koutný wrote: > On Wed, Dec 22, 2021 at 12:41:09PM +0100, Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx> wrote: > > The sections with disabled preemption must exclude > > memcg_check_events() so that spinlock_t locks can still be acquired > > (for instance in eventfd_signal()). > > The resulting construct in uncharge_batch() raises eybrows. If you can decouple > per-cpu updates from memcg_check_events() on PREEMPT_RT, why not tackle > it the same way on !PREEMPT_RT too (and have just one variant of the > block)? That would mean that mem_cgroup_event_ratelimit() needs a local_irq_save(). If that is okay then sure I can move it that way. > (Actually, it doesn't seem to me that memcg_check_events() can be > extracted like this from the preempt disabled block since > mem_cgroup_event_ratelimit() relies on similar RMW pattern. > Things would be simpler if PREEMPT_RT didn't allow the threshold event > handlers (akin to Michal Hocko's suggestion of rejecting soft limit).) I added a preempt-disable() section restricted to RT to mem_cgroup_event_ratelimit(). I had to exclude memcg_check_events() from the block because of the spinlock_t locks involved down the road (eventfd_signal() for instance). I remember Michal (Hocko) suggested excluding/ rejecting soft limit but I didn't know where exactly and its implications. In this block here I just followed the replacement of irq-off with preempt-off for RT. > Thanks, > Michal Sebastian