[PATCH v3] mm: limit mmu_gather batching to fix soft lockups on!CONFIG_PREEMPT

From: Michal Hocko
Date: Thu Dec 20 2012 - 17:36:17 EST


On Thu 20-12-12 12:27:46, Andrew Morton wrote:
> On Thu, 20 Dec 2012 13:47:10 +0100
> Michal Hocko <mhocko@xxxxxxx> wrote:
>
> > > > + */
> > > > +#if defined(CONFIG_PREEMPT_COUNT)
> > > > +#define MAX_GATHER_BATCH_COUNT (UINT_MAX)
> > > > +#else
> > > > +#define MAX_GATHER_BATCH_COUNT (((1UL<<(30-PAGE_SHIFT))/MAX_GATHER_BATCH))
> > >
> > > Geeze. I spent waaaaay too long staring at that expression trying to
> > > work out "how many pages is in a batch" and gave up.
> > >
> > > Realistically, I don't think we need to worry about CONFIG_PREEMPT here
> > > - if we just limit the thing to, say, 64k pages per batch then that
> > > will be OK for preemptible and non-preemptible kernels.
> >
> > I wanted the fix to be as non-intrusive as possible so I didn't want to
> > touch PREEMPT (which is default in many configs) at all. I am OK to a
> > single limit of course.
>
> non-intrusive is nice, but best-implementation is nicer.
>
> > > The performance difference between "64k" and "infinite" will be
> > > miniscule and unmeasurable.
> > >
> > > Also, the batch count should be independent of PAGE_SIZE. Because
> > > PAGE_SIZE can vary by a factor of 16 and you don't want to fix the
> > > problem on 4k page size but leave it broken on 64k page size.
> >
> > MAX_GATHER_BATCH depends on the page size so I didn't want to differ
> > without a good reason.
>
> There's a good reason! PAGE_SIZE can vary by a factor of 16, and if
> this results in the unpreemptible-CPU-effort varying by a factor of 16
> then that's bad, and we should change things so the
> unpreemptible-CPU-effort is independent of PAGE_SIZE.

Yes you are right. Let's make the number of entries (pages) fixed instead
(in the end we are just freeing pages which have more or less constant
cost). Then something like the following should work:
---