[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <alpine.LFD.1.10.0807121201220.2875@woody.linux-foundation.org>
Date: Sat, 12 Jul 2008 12:15:06 -0700 (PDT)
From: Linus Torvalds <torvalds@...ux-foundation.org>
To: Miao Xie <miaox@...fujitsu.com>
cc: Vegard Nossum <vegard.nossum@...il.com>,
Dmitry Adamushko <dmitry.adamushko@...il.com>,
Paul Menage <menage@...gle.com>,
Max Krasnyansky <maxk@...lcomm.com>, Paul Jackson <pj@....com>,
Peter Zijlstra <a.p.zijlstra@...llo.nl>, rostedt@...dmis.org,
Thomas Gleixner <tglx@...utronix.de>,
Ingo Molnar <mingo@...e.hu>,
Linux Kernel <linux-kernel@...r.kernel.org>
Subject: Re: current linux-2.6.git: cpusets completely broken
On Sat, 12 Jul 2008, Miao Xie wrote:
>
> I think Vegard Nossum's patch is not so good because it is not necessary to detach
> all the sched domains when making a cpu offline.
Well, short-term, I'd like to have a minimal fix.
Long-term, I really think that whole CPU notifier thing needs to be
*fixed*.
It's totally broken to have single callback functions with "flags"
parameters telling people what to do. I don't understand why people keep
doing it. It's *always* broken, and the fix is *always* to a structure
with multiple function pointers - separate functions for separate events.
In the case of those CPU hotplug notifiers, the "freeze" thing could
probably have been a flag, but CPU_DOWN_PREPARE/DEAD/DYING/UP/xyz should
likely just be different function callbacks. That way, when we add a
callback type, it doesn't require changing all existing callbacks that
don't want to care about the new case. And we wouldn't have these stupid
and fragile and ugly "switch()" statements with tons of cases all over.
Sadly, people have latched onto a model (that piece-of-sh*t "notifier"
infrastructure) that encourages - and almost requires - this kind of pure
crap.
But the CPU hotplug stuff _could_ just use separate notifier chains for
the different kinds of events. It wouldn't be perfect, but it would be
better than the mess we have now. Instead of doing
register_cpu_notifier(..);
and having a single thing that has to handle all cases, we could have
/* current "ONLINE/ONLINE_FROZEN" cases */
online = register_cpu_notifier(CPU_ONLINE, online_fn);
dead = register_cpu_nofitier(CPU_DEAD, dead_fn);
which would allocate the "struct notifier_block" an fill it in, and have
_separate_ queues for all those cases. That way, *if* you want to share
the code for multiple cases, you just register the same function. And if
you only cared about one case, you'd only be called for that one case!
I dunno. Maybe the conversion would be painful. And maybe the end result
isn't wonderful either. But the current setup for CPU notifiers is just a
damn disgrace.
Linus
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists