On Thu, Sep 7, 2017 at 11:25 AM, Vishwanath Pai <v...@akamai.com> wrote: > On 09/07/2017 01:51 PM, Linus Torvalds wrote: >> >> But honestly, that math is odd in other ways too (is that "r-1" >> _supposed_ to underflow to -1 for large 'user' counts?), so somebody >> needs to look at that logic. > > Sorry about the build failure, we have already queued up a fix for this: > https://patchwork.ozlabs.org/patch/810772/
Note: that patch has *exactly* the issue I was talking about above. Doing that if (user > 0xFFFFFFFFULL) return 0; is different from the old code, which used to result in a zero in the divide, and then r = (r - 1) << 4; would cause it to return a large value. So the patch in question doesn't just fix the build error, it completely changes the semantics of the function too. I *think* the new behavior is likely what you want, but these kinds of things should be _described_. Also, even with the patch, we have garbage: 0xFFFFFFFFULL / (u32)user why is that sub-expression pointlessly doing a 64-bit divide with a 32-bit number? The compiler is hopefully smart enough to point things out, but that "ULL" really is _wrong_ there, and could cause a stupid compiler to still do a 64-bit divide (although hopefully the simpler version that is 64/32). So please clarify both the correct behavior _and_ the actual typing of the divide, ok? Linus