On Thu, Aug 08 2024 at 08:53, Linus Torvalds wrote: > On Thu, 8 Aug 2024 at 02:57, Thomas Gleixner <tglx@xxxxxxxxxxxxx> wrote: > Hmm. There's a few patterns there: > > - the incorrect Maxobj is always 16, with wildly different sizes. Which means that the size value is rounded up to the next power of 2 >> [ 0.000000] Order: 1 Size: 384 Nobj: 21 Maxobj: 16 21 Inuse: 14 8192/16 = 512 >> [ 0.000000] Order: 0 Size: 168 Nobj: 24 Maxobj: 16 24 Inuse: 1 4096/16 = 256 >> [ 0.000000] Order: 3 Size: 1536 Nobj: 21 Maxobj: 16 21 Inuse: 1 32768/16 = 2048 >> The maxobj column shows the failed result and the result from the second >> invocation inside of the printk(). > I actually went into the gcc sources to look at the libgcc routines > for the hppa $$divU routine, but apart from checking for trivial > powers-of-two and for divisions with small divisor values (<=17), all > it is ends up being a series of "ds" (divide step) and "addc" > instructions. I don't see how that could possibly mess up. It does end > up with the final addc in the delay slot of the return, but that's > normal parisc behavior (and here by "normal" I mean "it's a really > messed up instruction set that did everything wrong, including branch > delay slots") > > I do note that the $$divU function (which is what this all should use) > oddly doesn't show up as defined in 'nm' for me when I look at > Guenter's vmlinux file. So there's some odd linker thing going on, and > it *only* affects the $$div* functions. > > Thomas' System.map shows some of the same effects, ie it shows $$divoI > (signed integer divide with overflow checking), but doesn't show > $$divU that is right after it. The reason I was looking was exactly > because this should be using $$divU, and clearly code alignment is > implicated somehow, but the exact alignment of $$divU wasn't obvious. > > But it looks like "$$divU" should be somewhere between $$divoI and > $$divl_2, and in Guenter's bad case that's > > 0000000041218c70 T $$divoI > 00000000412190d0 T $$divI_2 > > so *maybe* $$divU is around a page boundary? 0000000041218xxx turning > into 0000000041219000? It uses $$divU which is at $$divoI + 0x250. I validated that in the disassembly. Thanks, tglx