Messages in this thread | | | Date | Thu, 10 Oct 2013 12:00:16 -0700 | Subject | Re: [PATCH 0/6] Optimize the cpu hotplug locking -v2 | From | Linus Torvalds <> |
| |
On Thu, Oct 10, 2013 at 11:43 AM, Steven Rostedt <rostedt@goodmis.org> wrote: > > There's places in the kernel that does for_each_cpu() that I'm sure you > don't want to disable preemption for. Especially when you start having > 4096 CPU machines!
We could _easily_ add preemption points in for_each_cpu() for the MAX_SMP case. We can even do it in the macro itself.
So I wouldn't worry about things like that. I'd expect the "Oh damn, we have to allocate" case to be more painful, but I think that is fairly easily handled by having something like a "redo_cpu()" macro that you can call inside for_each_cpu(). So the pattern for the (nopefully-not-all-that-common) thing would be something like
sometype *prealloc = NULL;
for_each_cpu() { if (!prealloc) { rcu_read_unlock(); // Or whatever we want to call it prealloc = kmalloc(..); rcu_read_lock(); redo_cpu(); } } kfree(prealloc);
which is certainly more work than a sleeping lock is, but this looks like a initialization pattern.
Looking at the things that are actually performance-critical, they tend to be things like "gather all the statistics for all CPUs".
Honesty in advertizing: I only grepped a couple of users of get_online_cpus(), and they all seemed like they'd be perfectly happy with preemption-off. But maybe I was just lucky in my few samples: I have anecdotes, not data.
Linus
| |