You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by "hujun260 (via GitHub)" <gi...@apache.org> on 2024/05/20 04:28:07 UTC

[PR] signal: fix deadlock when sigdeliver call enter_critical_section [nuttx]

hujun260 opened a new pull request, #12380:
URL: https://github.com/apache/nuttx/pull/12380

   ## Summary
   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.
   ## Impact
   NONE
   
   ## Testing
   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
   
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] signal: fix deadlock when sigdeliver call enter_critical_section [nuttx]

Posted by "masayuki2009 (via GitHub)" <gi...@apache.org>.
masayuki2009 commented on PR #12380:
URL: https://github.com/apache/nuttx/pull/12380#issuecomment-2120358622

   @hujun260 
   Why didn't you modify arch/sim/src/sim/sim_sigdeliver.c?
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] signal: fix deadlock when sigdeliver call enter_critical_section [nuttx]

Posted by "masayuki2009 (via GitHub)" <gi...@apache.org>.
masayuki2009 commented on PR #12380:
URL: https://github.com/apache/nuttx/pull/12380#issuecomment-2132212285

   >The implementation of signal processing in SIM is quite special. When we enter sim_sigdeliver, we are already in the critical section, so there is no chance of a deadlock.
   
   @hujun260 
   Hmm, it seems that ASSERT still happens when I run ostest with sim:smp on ubuntu 20.04 (amd64).
   
   ```
   NuttShell (NSH) NuttX-12.5.1
   nsh> uname -a
   NuttX 12.5.1 4197b5aec8 May 26 2024 21:53:42 sim sim
   nsh> ps
     PID GROUP CPU PRI POLICY   TYPE    NPX STATE    EVENT     SIGMASK           STACK   USED  FILLED COMMAND
       0     0   0   0 FIFO     Kthread   - Assigned           0000000000000000 066544 004744   7.1%  CPU0 IDLE
       1     1   1   0 FIFO     Kthread   - Running            0000000000000000 066544 008792  13.2%  CPU1 IDLE
       2     2   2   0 FIFO     Kthread   - Running            0000000000000000 066544 008744  13.1%  CPU2 IDLE
       3     3   3   0 FIFO     Kthread   - Running            0000000000000000 066544 004664   7.0%  CPU3 IDLE
       4     4 --- 224 FIFO     Kthread   - Waiting  Signal    0000000000000000 067536 004904   7.2%  loop_task
       5     5 --- 224 FIFO     Kthread   - Waiting  Semaphore 0000000000000000 067504 001048   1.5%  hpwork 0x46b6a0 0x46b6c8
       6     6   0 100 FIFO     Task      - Running            0000000000000000 067536 003304   4.8%  nsh_main
   nsh> free
                    total       used       free    maxused    maxfree  nused  nfree
         Umem:   67108864     414416   66694448     414384   66694448     30      1
   nsh> ostest
   stdio_test: write fd=1
   stdio_test: Standard I/O Check: printf
   stdio_test: write fd=2
   ...
   user_main: nested signal handler test
   signest_test: Starting signal waiter task at priority 101
   signest_test: Started waiter_main pid=175
   waiter_main: Waiter started
   signest_test: Starting interfering task at priority 102
   waiter_main: Setting signal mask
   waiter_main: Registering signal handler
   signest_test: Started interfere_main pid=185
   interfere_main: Waiting on semaphore
   waiter_main: Waiting on semaphore
   signest_test: Simple case:
     Total signalled 1240  Odd=620 Even=620
     Total handled   1240  Odd=620 Even=620
     Total nested    0    Odd=0   Even=0  
   signest_test: With task locking
     Total signalled 2480  Odd=1240 Even=1240
     Total handled   2480  Odd=1240 Even=1240
     Total nested    0    Odd=0   Even=0  
   [CPU0] _assert: Current Version: NuttX  12.5.1 4197b5aec8 May 26 2024 21:53:42 sim
   [CPU0] _assert: Assertion failed : at file: signest.c:228 task(CPU0): ostest process: ostest 0x43af44
   ostest_main: Exiting with status 256
   stdio_test: Standard I/O Check: fprintf to stderr
   nsh>
   ```


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] signal: fix deadlock when sigdeliver call enter_critical_section [nuttx]

Posted by "hujun260 (via GitHub)" <gi...@apache.org>.
hujun260 commented on PR #12380:
URL: https://github.com/apache/nuttx/pull/12380#issuecomment-2122194605

   > @hujun260 Why didn't you modify arch/sim/src/sim/sim_sigdeliver.c? I think you need to modify the file as well.
   
   The implementation of signal processing in SIM is quite special. When we enter sim_sigdeliver, we are already in the critical section, so there is no chance of a deadlock.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] signal: fix deadlock when sigdeliver call enter_critical_section [nuttx]

Posted by "hujun260 (via GitHub)" <gi...@apache.org>.
hujun260 commented on PR #12380:
URL: https://github.com/apache/nuttx/pull/12380#issuecomment-2132511154

   > > The implementation of signal processing in SIM is quite special. When we enter sim_sigdeliver, we are already in the critical section, so there is no chance of a deadlock.
   > 
   > @hujun260 Hmm, it seems that ASSERT still happens when I run ostest with sim:smp on ubuntu 20.04 (amd64).
   > 
   > ```
   > NuttShell (NSH) NuttX-12.5.1
   > nsh> uname -a
   > NuttX 12.5.1 4197b5aec8 May 26 2024 21:53:42 sim sim
   > nsh> ps
   >   PID GROUP CPU PRI POLICY   TYPE    NPX STATE    EVENT     SIGMASK           STACK   USED  FILLED COMMAND
   >     0     0   0   0 FIFO     Kthread   - Assigned           0000000000000000 066544 004744   7.1%  CPU0 IDLE
   >     1     1   1   0 FIFO     Kthread   - Running            0000000000000000 066544 008792  13.2%  CPU1 IDLE
   >     2     2   2   0 FIFO     Kthread   - Running            0000000000000000 066544 008744  13.1%  CPU2 IDLE
   >     3     3   3   0 FIFO     Kthread   - Running            0000000000000000 066544 004664   7.0%  CPU3 IDLE
   >     4     4 --- 224 FIFO     Kthread   - Waiting  Signal    0000000000000000 067536 004904   7.2%  loop_task
   >     5     5 --- 224 FIFO     Kthread   - Waiting  Semaphore 0000000000000000 067504 001048   1.5%  hpwork 0x46b6a0 0x46b6c8
   >     6     6   0 100 FIFO     Task      - Running            0000000000000000 067536 003304   4.8%  nsh_main
   > nsh> free
   >                  total       used       free    maxused    maxfree  nused  nfree
   >       Umem:   67108864     414416   66694448     414384   66694448     30      1
   > nsh> ostest
   > stdio_test: write fd=1
   > stdio_test: Standard I/O Check: printf
   > stdio_test: write fd=2
   > ...
   > user_main: nested signal handler test
   > signest_test: Starting signal waiter task at priority 101
   > signest_test: Started waiter_main pid=175
   > waiter_main: Waiter started
   > signest_test: Starting interfering task at priority 102
   > waiter_main: Setting signal mask
   > waiter_main: Registering signal handler
   > signest_test: Started interfere_main pid=185
   > interfere_main: Waiting on semaphore
   > waiter_main: Waiting on semaphore
   > signest_test: Simple case:
   >   Total signalled 1240  Odd=620 Even=620
   >   Total handled   1240  Odd=620 Even=620
   >   Total nested    0    Odd=0   Even=0  
   > signest_test: With task locking
   >   Total signalled 2480  Odd=1240 Even=1240
   >   Total handled   2480  Odd=1240 Even=1240
   >   Total nested    0    Odd=0   Even=0  
   > [CPU0] _assert: Current Version: NuttX  12.5.1 4197b5aec8 May 26 2024 21:53:42 sim
   > [CPU0] _assert: Assertion failed : at file: signest.c:228 task(CPU0): ostest process: ostest 0x43af44
   > ostest_main: Exiting with status 256
   > stdio_test: Standard I/O Check: fprintf to stderr
   > nsh>
   > ```
   
   I have debugged the issue you mentioned, and it is not caused by a deadlock. It should be due to another reason.
   My patch did not resolve this issue.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org