Hi Peter, Thanks for looking. I'll try to reply on Monday, just one note...
On 07/30, Peter Zijlstra wrote: > > On Tue, Jul 21, 2015 at 09:22:47PM +0200, Oleg Nesterov wrote: > > > +static int cpu_stop_queue_two_works(int cpu1, struct cpu_stop_work *work1, > > + int cpu2, struct cpu_stop_work *work2) > > +{ > > + struct cpu_stopper *stopper1 = per_cpu_ptr(&cpu_stopper, cpu1); > > + struct cpu_stopper *stopper2 = per_cpu_ptr(&cpu_stopper, cpu2); > > + int err; > > +retry: > > + spin_lock_irq(&stopper1->lock); > > + spin_lock_nested(&stopper2->lock, SINGLE_DEPTH_NESTING); > > + /* > > + * If we observe both CPUs active we know _cpu_down() cannot yet have > > + * queued its stop_machine works and therefore ours will get executed > > + * first. Or its not either one of our CPUs that's getting unplugged, > > + * in which case we don't care. > > + */ > > + err = -ENOENT; > > + if (!cpu_active(cpu1) || !cpu_active(cpu2)) > > + goto unlock; > > + > > + WARN_ON(!stopper1->enabled || !stopper2->enabled); > > + /* > > + * Ensure that if we race with stop_cpus() the stoppers won't > > + * get queued up in reverse order, leading to system deadlock. > > + */ > > + err = -EDEADLK; > > + if (stop_work_pending(stopper1) != stop_work_pending(stopper2)) > > + goto unlock; > > You could DoS/false positive this by running stop_one_cpu() in a loop, > and thereby 'always' having work pending on one but not the other. IIRC no. I am pretty sure stop_one_cpu() doesn't use stopper->stop_work, only stop_machine() does. Oleg. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/