Re: [PATCH v7 8/8] x86/tlb: just do tlb flush on one of siblingsof SMT

From: Peter Zijlstra
Date: Wed May 23 2012 - 13:09:52 EST


On Wed, 2012-05-23 at 16:05 +0100, Jan Beulich wrote:
> >>> On 23.05.12 at 16:15, Alex Shi <alex.shi@xxxxxxxxx> wrote:
> > + /* doing flush on both siblings of SMT is just wasting time */
> > + cpumask_copy(&flush_mask, cpumask);
> > + if (likely(smp_num_siblings > 1)) {
> > + rand = jiffies;
> > + /* See "Numerical Recipes in C", second edition, p. 284 */
> > + rand = rand * 1664525L + 1013904223L;
> > + rand &= 0x1;
> > +
> > + for_each_cpu(cpu, &flush_mask) {
> > + sblmask = cpu_sibling_mask(cpu);
> > + if (cpumask_subset(sblmask, &flush_mask)) {
> > + if (rand == 0)
> > + cpu_clear(cpu, flush_mask);
> > + else
> > + cpu_clear(cpumask_next(cpu, sblmask),
> > + flush_mask);
> > + }
> > + }
> > + }
> > +
>
> There is no comment or anything else indicating that this is
> suitable for dual-thread CPUs only - when there are more than
> 2 threads per core, the intended effect won't be achieved.

Why would that be? Won't higher thread count still share the same
resources just more so?

> I'd
> recommend making the logic generic from the beginning, but if
> that doesn't seem feasible to you, at least a comment stating
> the limitation should be added imo.

My objection to the whole lot is that its looks mightily expensive on
large machines, cpumask operations aren't cheap when you've got 4k cpus
etc..

Also, you very much cannot put cpumask_t on stack.

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/