mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 02:50:49 +09:00
powerpc/64s: Fix native_hpte_remove() to be irq-safe
commit8bbe9fee58upstream. Lockdep warns that the use of the hpte_lock in native_hpte_remove() is not safe against an IRQ coming in: ================================ WARNING: inconsistent lock state 6.4.0-rc2-g0c54f4d30ecc #1 Not tainted -------------------------------- inconsistent {IN-SOFTIRQ-W} -> {SOFTIRQ-ON-W} usage. qemu-system-ppc/93865 [HC0[0]:SC0[0]:HE1:SE1] takes: c0000000021f5180 (hpte_lock){+.?.}-{0:0}, at: native_lock_hpte+0x8/0xd0 {IN-SOFTIRQ-W} state was registered at: lock_acquire+0x134/0x3f0 native_lock_hpte+0x44/0xd0 native_hpte_insert+0xd4/0x2a0 __hash_page_64K+0x218/0x4f0 hash_page_mm+0x464/0x840 do_hash_fault+0x11c/0x260 data_access_common_virt+0x210/0x220 __ip_select_ident+0x140/0x150 ... net_rx_action+0x3bc/0x440 __do_softirq+0x180/0x534 ... sys_sendmmsg+0x34/0x50 system_call_exception+0x128/0x320 system_call_common+0x160/0x2e4 ... Possible unsafe locking scenario: CPU0 ---- lock(hpte_lock); <Interrupt> lock(hpte_lock); *** DEADLOCK *** ... Call Trace: dump_stack_lvl+0x98/0xe0 (unreliable) print_usage_bug.part.0+0x250/0x278 mark_lock+0xc9c/0xd30 __lock_acquire+0x440/0x1ca0 lock_acquire+0x134/0x3f0 native_lock_hpte+0x44/0xd0 native_hpte_remove+0xb0/0x190 kvmppc_mmu_map_page+0x650/0x698 [kvm_pr] kvmppc_handle_pagefault+0x534/0x6e8 [kvm_pr] kvmppc_handle_exit_pr+0x6d8/0xe90 [kvm_pr] after_sprg3_load+0x80/0x90 [kvm_pr] kvmppc_vcpu_run_pr+0x108/0x270 [kvm_pr] kvmppc_vcpu_run+0x34/0x48 [kvm] kvm_arch_vcpu_ioctl_run+0x340/0x470 [kvm] kvm_vcpu_ioctl+0x338/0x8b8 [kvm] sys_ioctl+0x7c4/0x13e0 system_call_exception+0x128/0x320 system_call_common+0x160/0x2e4 I suspect kvm_pr is the only caller that doesn't already have IRQs disabled, which is why this hasn't been reported previously. Fix it by disabling IRQs in native_hpte_remove(). Fixes:35159b5717("powerpc/64s: make HPTE lock and native_tlbie_lock irq-safe") Cc: stable@vger.kernel.org # v6.1+ Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://msgid.link/20230517123033.18430-1-mpe@ellerman.id.au Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
484b8fb1ff
commit
58d1c81307
@@ -328,10 +328,12 @@ static long native_hpte_insert(unsigned long hpte_group, unsigned long vpn,
|
|||||||
|
|
||||||
static long native_hpte_remove(unsigned long hpte_group)
|
static long native_hpte_remove(unsigned long hpte_group)
|
||||||
{
|
{
|
||||||
|
unsigned long hpte_v, flags;
|
||||||
struct hash_pte *hptep;
|
struct hash_pte *hptep;
|
||||||
int i;
|
int i;
|
||||||
int slot_offset;
|
int slot_offset;
|
||||||
unsigned long hpte_v;
|
|
||||||
|
local_irq_save(flags);
|
||||||
|
|
||||||
DBG_LOW(" remove(group=%lx)\n", hpte_group);
|
DBG_LOW(" remove(group=%lx)\n", hpte_group);
|
||||||
|
|
||||||
@@ -356,13 +358,16 @@ static long native_hpte_remove(unsigned long hpte_group)
|
|||||||
slot_offset &= 0x7;
|
slot_offset &= 0x7;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i == HPTES_PER_GROUP)
|
if (i == HPTES_PER_GROUP) {
|
||||||
return -1;
|
i = -1;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
/* Invalidate the hpte. NOTE: this also unlocks it */
|
/* Invalidate the hpte. NOTE: this also unlocks it */
|
||||||
release_hpte_lock();
|
release_hpte_lock();
|
||||||
hptep->v = 0;
|
hptep->v = 0;
|
||||||
|
out:
|
||||||
|
local_irq_restore(flags);
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user