Re: [PATCH for-7.5 5/5] memcg: simplify high limit handling after a charge

From: Shakeel Butt

Date: Wed Oct 14 2026 - 13:44:37 EST


On Wed, Oct 14, 2026 at 01:46:23PM +0200, Michal Hocko wrote:
> On Sat 10-10-26 14:09:57, Shakeel Butt wrote:
> [...]
> > - /* Interrupts, kernel threads, and remote chargers stop here. */
> > - if (use_worker)
> > + /*
> > + * Use a worker for interrupts, kernel threads, and tasks whose mm
> > + * does not match the charged hierarchy.
> > + */
> > + if (use_high_work) {
> > + if (!iter)
> > + return;
> > + if (allow_spinning)
> > + schedule_work(&iter->high_work);
> > + else
> > + irq_work_queue(&iter->high_irq_work);
> > return;
> > + }
> > +
> > + if (iter) {
>
> Would it be much simpler to bail out on iter==NULL (i.e. nothing over
> high limit) right after the loop?
>

I want this patch to not change any behavior. If we return here when iter is
NULL, we will skip a potential call to __mem_cgroup_handle_over_high() when
current->memcg_nr_pages_over_high > MEMCG_CHARGE_BATCH. Though I agree that is
very subtle and most probably unexpected. If we decide to remove it, we should
do it in a separate patch. Actually I am working on a followup series where I
plan to remove the sync enforcement of memory.high and put high enforcement on
the code paths which can potentially do a lot of allocation within a single
kernel entry.

> > + /*
> > + * Count the full batch so reclaim work and delay penalties scale
> > + * with the pages charged by this task.
> > + */
> > + current->memcg_nr_pages_over_high += nr_pages;
> > + set_notify_resume(current);
> > + }
> >
> > /*
> > - * Reclaim is set up above to be called from the userland
> > - * return path. But also attempt synchronous reclaim to avoid
> > - * excessive overrun while the task is still inside the
> > - * kernel. If this is successful, the return path will see it
> > - * when it rechecks the overage and simply bail out.
> > + * Earlier charges may have left high overage pending even if this charge
> > + * found no new overage. Handle it now if this charge can block, to limit
> > + * overrun while the task remains in the kernel.
> > */
> > if (current->memcg_nr_pages_over_high > MEMCG_CHARGE_BATCH &&
> > !(current->flags & PF_MEMALLOC) &&
> > --
> > 2.53.0-Meta
>
> --
> Michal Hocko
> SUSE Labs