Re: [PATCH][resubmit] x86: enable preemption in delay

Peter Zijlstra
2008-06-18T12:17:39Z

On Wed, 2008-06-18 at 06:08 -0600, Gregory Haskins wrote:
> >>> On Wed, Jun 18, 2008 at 3:55 AM, in message <20080618075518.GD4135@elte.hu>,
> Ingo Molnar <mingo@elte.hu> wrote:
>
> > * Marin Mitov <mitov@issp.bas.bg> wrote:
> >
> >> Why not something like that (do keep in mind I am not an expert :-):
> >>
> >> static void delay_tsc(unsigned long loops)
> >> {
> >> get and store the mask of allowed cpus;
> >> /* prevent the migration */
> >> set the mask of allowed cpus to the current cpu only;
> >> /* is it possible? could it be guaranteed? */
> >> loop for the delay;
> >> restore the old mask of allowed cpus;
> >> }
> >>
> >> You have got the idea. Could it be realized? Is it more expensive than
> >> the current realization? So, comments, please.
> >
> > hm, changing/saving/restorig cpus_allowed is really considered a 'heavy'
> > operation compared to preempt_disable(). On a 4096 CPUs box cpus_allowed
> > is 4096 bits which is half a kilobyte ...
> >
> > preempt_disable()/enable() on the other hand only touches a single
> > variable, (thread_info->preempt_count which is an u32)
> >
> > Ingo
>
> FWIW: I had submitted some "migration disable" patches a while back
> that would solve this without the cpus_allowed manipulations described
> here. Its more expensive than a preempt-disable (but its
> preemptible), yet its way cheaper (and more correct / less racy) than
> chaning cpus_allowed. I could resubmit if there was any interest,
> though I think Ingo said he didnt like the concept on the first pass.
> Anyway, FYI.

(please teach your mailer to wrap text)

Yeah - migrate_disable() has been proposed several times. The reason I
don't like it is that is creates scheduling artefacts like latencies by
not being able to load-balance (and thereby complicates all that, and
you know we don't need more complication there).

Things like preempt latency and irq off latency are rather easy to
notice and debug in general. migrate_disable() would be fully
preemptable/schedulable which makes it much much harder to instrument or
even detect we have an issue. Which in turn makes it much harder to find
abuse.