On Wed, Jan 27, 2021 at 10:18:51PM +0100, Helge Deller wrote: > On parisc a spinlock is stored in the next page behind the pgd which > protects against parallel accesses to the pgd. That's why one additional > page (PGD_ALLOC_ORDER) is allocated for the pgd. > > Matthew Wilcox suggested that we instead should use a pointer in the > struct page table for this spinlock and noted, that the comments for the > PGD_ORDER and PMD_ORDER defines were wrong. > > Both suggestions are addressed in this patch. The pgd spinlock > (parisc_pgd_lock) is stored in the struct page table. In > switch_mm_irqs_off() the physical address of this lock is loaded into > cr28 (tr4) and the pgd into cr25, so that the fault handlers can > directly access the lock. > > The currently implemened Hybrid L2/L3 page table scheme (where the pmd > is adjacent to the pgd) is dropped now too. > > Suggested-by: Matthew Wilcox <willy@xxxxxxxxxxxxx> > Fixes: b37d1c1898b2 ("parisc: Use per-pagetable spinlock") > Signed-off-by: Helge Deller <deller@xxxxxx> > Signed-off-by: John David Anglin <dave.anglin@xxxxxxxx> This patch results in: BUG: spinlock recursion on CPU#0, swapper/0/1 lock: 0x12226d14, .magic: dead4ead, .owner: swapper/0/1, .owner_cpu: 0 CPU: 0 PID: 1 Comm: swapper/0 Not tainted 5.11.0-rc7-next-20210209-32bit #1 Hardware name: 9000/778/B160L Backtrace: [<1019f9bc>] show_stack+0x34/0x48 [<10a65278>] dump_stack+0x94/0x114 [<10219f4c>] spin_dump+0x8c/0xb8 [<1021a0b4>] do_raw_spin_lock+0xdc/0x108 [<10a7367c>] _raw_spin_lock_irqsave+0x30/0x48 [<102bf41c>] handle_mm_fault+0x5e8/0xdb0 [<102b813c>] __get_user_pages.part.0+0x1b0/0x3d4 [<102b8900>] __get_user_pages_remote+0x134/0x34c [<102b8b80>] get_user_pages_remote+0x68/0x90 [<102fccb0>] get_arg_page+0x94/0xd8 [<102fdd84>] copy_string_kernel+0xc4/0x234 [<102fe70c>] kernel_execve+0xcc/0x1a4 [<10a58d94>] run_init_process+0xbc/0xe0 [<10a70d50>] kernel_init+0x98/0x13c [<1019a01c>] ret_from_kernel_thread+0x1c/0x24 when trying to boot parisc/hppa images in qemu. Reverting this patch fixes the problem. Bitsect log attached. Guenter --- # bad: [a4bfd8d46ac357c12529e4eebb6c89502b03ecc9] Add linux-next specific files for 20210209 # good: [92bf22614b21a2706f4993b278017e437f7785b3] Linux 5.11-rc7 git bisect start 'HEAD' 'v5.11-rc7' # bad: [a8eb921ba7e8e77d994a1c6c69c8ef08456ecf53] Merge remote-tracking branch 'crypto/master' git bisect bad a8eb921ba7e8e77d994a1c6c69c8ef08456ecf53 # bad: [b68df186dae8ae890df08059bb068b78252b053a] Merge remote-tracking branch 'hid/for-next' git bisect bad b68df186dae8ae890df08059bb068b78252b053a # good: [323c9f6fb99b033883b404ecbc811e7b283a60b3] Merge remote-tracking branch 'sunxi/sunxi/for-next' git bisect good 323c9f6fb99b033883b404ecbc811e7b283a60b3 # bad: [9d40a7a579a5c51fad0d734a4ed39e39b858fca2] Merge remote-tracking branch 'btrfs/for-next' git bisect bad 9d40a7a579a5c51fad0d734a4ed39e39b858fca2 # bad: [afe0c3efe88f6c295542fd336d5f604115e9184f] Merge remote-tracking branch 'powerpc/next' git bisect bad afe0c3efe88f6c295542fd336d5f604115e9184f # good: [c276186556ed2ce6d30da69ce275234a7df85b09] Merge remote-tracking branch 'mips/mips-next' git bisect good c276186556ed2ce6d30da69ce275234a7df85b09 # good: [755d664174463791489dddf34c33308b61de68c3] powerpc: DebugException remove args git bisect good 755d664174463791489dddf34c33308b61de68c3 # good: [26418b36a11f2eaf2556aa8cefe86132907e311f] powerpc/64s/radix: refactor TLB flush type selection git bisect good 26418b36a11f2eaf2556aa8cefe86132907e311f # bad: [d7bbb31642d2bd4aa5aad3595061a5e96c32d91d] Merge remote-tracking branch 'parisc-hd/for-next' git bisect bad d7bbb31642d2bd4aa5aad3595061a5e96c32d91d # good: [2261352157a932717ec08b9dd18d1bfbb7c37c52] Merge remote-tracking branch 'openrisc/or1k-5.11-fixes' into or1k-5.12-updates git bisect good 2261352157a932717ec08b9dd18d1bfbb7c37c52 # good: [3c92b9eed3ae088ade3688fb356a90926c1c8ee4] Merge remote-tracking branch 'openrisc/for-next' git bisect good 3c92b9eed3ae088ade3688fb356a90926c1c8ee4 # good: [accb4993d2ee6b644a3d01851cf2fb2c1e0813a6] parisc: Fix IVT checksum calculation wrt HPMC git bisect good accb4993d2ee6b644a3d01851cf2fb2c1e0813a6 # bad: [4add5f175b1e4e71c06493f9a2c52490d2ea4365] parisc: Optimize per-pagetable spinlocks git bisect bad 4add5f175b1e4e71c06493f9a2c52490d2ea4365 # good: [0d2d3836dd0a597e514e6231fbf2ae3944f5d38c] parisc: Bump 64-bit IRQ stack size to 64 KB git bisect good 0d2d3836dd0a597e514e6231fbf2ae3944f5d38c # first bad commit: [4add5f175b1e4e71c06493f9a2c52490d2ea4365] parisc: Optimize per-pagetable spinlocks