Messages in this thread | | | From | Dmitry Vyukov <> | Date | Mon, 14 May 2018 09:28:19 +0200 | Subject | Re: for_each_cpu() is buggy for UP kernel? |
| |
On Sun, May 13, 2018 at 8:21 PM, Linus Torvalds <torvalds@linux-foundation.org> wrote: > On Tue, May 8, 2018 at 11:24 PM Dexuan Cui <decui@microsoft.com> wrote: > >> Should we fix the for_each_cpu() in include/linux/cpumask.h for UP? > > As Thomas points out, this has come up before. > > One of the issues is historical - we tried very hard to make the SMP code > not cause code generation problems for UP, and part of that was just that > all these loops were literally designed to entirely go away under UP. It > still *looks* syntactically like a loop, but an optimizing compiler will > see that there's nothing there, and "for_each_cpu(...) x" essentially just > turns into "x" on UP. An empty mask simply generally doesn't make sense, > since opn UP you also don't have any masking of CPU ops, so the mask is > ignored, and that helps the code generation immensely. > > If you have to load and test the mask, you immediately lose out badly in > code generation. > > So honestly, I'd really prefer to keep our current behavior. Perhaps with a > debug option that actually tests (on SMP - because that's what every > developer is actually _using_ these days) that the mask isn't empty. But > I'm not sure that would find this case, since presumably on SMP it might > never be empty.
This looks like the problem automated testing traditionally and effectively solves. If UP is an important config, there must be automated pre/post commit checks for this.
| |