nuttx/arch
hujun5 ed78646798 signal: fix deadlock when sigdeliver call enter_critical_section
cpu0                                 cpu1:

user_main
signest_test
sched_unlock
nxsched_merge_pending
nxsched_add_readytorun
up_cpu_pause
			             arm_sigdeliver
				     enter_critical_section

Reason:
In the SMP, cpu0 is already in the critical section and waiting for cpu1 to enter the suspended state.
However, when cpu1 executes arm_sigdeliver, it is in the irq-disabled state but not in the critical section.
At this point, cpu1 is unable to respond to interrupts and
is continuously attempting to enter the critical section, resulting in a deadlock.

Resolve:
adjust the logic, do not entering the critical section when interrupt-disabled.

test:
We can use qemu for testing.

compiling
make distclean -j20; ./tools/configure.sh -l qemu-armv8a:nsh_smp ;make -j20
running
qemu-system-aarch64 -cpu cortex-a53 -smp 4 -nographic -machine virt,virtualization=on,gic-version=3 -net none -chardev stdio,id=con,mux=on -serial chardev:con -mon chardev=con,mode=readline -kernel ./nuttx

Signed-off-by: hujun5 <hujun5@xiaomi.com>
2024-06-22 19:35:28 -03:00
..
arm signal: fix deadlock when sigdeliver call enter_critical_section 2024-06-22 19:35:28 -03:00
arm64 signal: fix deadlock when sigdeliver call enter_critical_section 2024-06-22 19:35:28 -03:00
avr Add basic support for locales in order to C++ streams to build and work for simple cases (POSIX / C locale). 2024-04-29 17:34:10 +08:00
ceva Add basic support for locales in order to C++ streams to build and work for simple cases (POSIX / C locale). 2024-04-29 17:34:10 +08:00
dummy
hc stack: update up_get_intstackbase API to support cpu id 2024-04-09 16:59:00 -03:00
mips up_putc: int up_putc, enter_critical_section may be called 2024-05-09 13:45:02 +08:00
misoc fix nxstyle 2024-05-13 22:24:36 +02:00
or1k up_putc: int up_putc, enter_critical_section may be called 2024-05-09 13:45:02 +08:00
renesas stack: update up_get_intstackbase API to support cpu id 2024-04-09 16:59:00 -03:00
risc-v signal: fix deadlock when sigdeliver call enter_critical_section 2024-06-22 19:35:28 -03:00
sim sim/net: Support to set the MTU of the sim netdevice. 2024-06-02 09:31:37 -03:00
sparc signal: fix deadlock when sigdeliver call enter_critical_section 2024-06-22 19:35:28 -03:00
tricore arch/tricore: update the function prototype as mainline 2024-06-12 23:36:11 +08:00
x86 stack: update up_get_intstackbase API to support cpu id 2024-04-09 16:59:00 -03:00
x86_64 cmake:bugfix CMake compilation options settings should not use strings 2024-05-30 10:02:10 -03:00
xtensa signal: fix deadlock when sigdeliver call enter_critical_section 2024-06-22 19:35:28 -03:00
z16 up_putc: int up_putc, enter_critical_section may be called 2024-05-09 13:45:02 +08:00
z80 up_putc: int up_putc, enter_critical_section may be called 2024-05-09 13:45:02 +08:00
CMakeLists.txt build/cmake: add initial KERNEL mode support 2024-03-15 16:21:23 +08:00
Kconfig Kconfig: move LTO options to Build Setup menu 2024-06-02 09:26:35 -03:00