Messages in this thread | | | Date | Mon, 4 Jul 2022 11:34:02 +0100 | From | Catalin Marinas <> | Subject | Re: [PATCH V2] arm64: fix oops in concurrently setting insn_emulation sysctls |
| |
On Sat, Jul 02, 2022 at 05:43:19AM +0000, haibinzhang(张海斌) wrote: > How to reproduce: > launch two shell executions: > #!/bin/bash > while [ 1 ]; > do > echo 1 > /proc/sys/abi/swp > done > > Oops info: > Unable to handle kernel NULL pointer dereference at virtual address 0000000000000010 > Internal error: Oops: 96000006 [#1] SMP > Call trace: > update_insn_emulation_mode+0xc0/0x148 > emulation_proc_handler+0x64/0xb8 > proc_sys_call_handler+0x9c/0xf8 > proc_sys_write+0x18/0x20 > __vfs_write+0x20/0x48 > vfs_write+0xe4/0x1d0 > ksys_write+0x70/0xf8 > __arm64_sys_write+0x20/0x28 > el0_svc_common.constprop.0+0x7c/0x1c0 > el0_svc_handler+0x2c/0xa0 > el0_svc+0x8/0x200 > > emulation_proc_handler changes table->data for proc_dointvec_minmax > and so it isn't allowed to reenter before restoring table->data, > which isn't right now. > To fix this issue, keep the table->data as &insn->current_mode and > use container_of() to retrieve the insn pointer. Another mutex is > used to protect against the current_mode update but not for retrieving > insn_emulation as table->data is no longer changing. > > Signed-off-by: hewenliang <hewenliang4@huawei.com> > Signed-off-by: Haibin Zhang <haibinzhang@tencent.com>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
| |