소스 검색

fixup: ipc: protect taken_list on shared lock

为什么提交这份PR (why to submit this PR)
Issue: using iperf server with sshd together and the kernel will get stuck occasionally.

taken_list is accessed from other mutex when updating priority.

你的解决方案是什么 (what is your solution)
protect taken_list on shared lock, but not on mutex local spinlock.

Signed-off-by: Shell <smokewood@qq.com>
Shell 11 달 전
부모
커밋
d2160d352c
1개의 변경된 파일14개의 추가작업 그리고 12개의 파일을 삭제
  1. 14 12
      src/ipc.c

+ 14 - 12
src/ipc.c

@@ -945,28 +945,30 @@ static rt_bool_t _check_and_update_prio(rt_thread_t thread, rt_mutex_t mutex)
 static void _mutex_before_delete_detach(rt_mutex_t mutex)
 {
     rt_sched_lock_level_t slvl;
-    rt_bool_t need_schedule;
+    rt_bool_t need_schedule = RT_FALSE;
 
     rt_spin_lock(&(mutex->spinlock));
     /* wakeup all suspended threads */
     rt_susp_list_resume_all(&(mutex->parent.suspend_thread), RT_ERROR);
+
+    rt_sched_lock(&slvl);
+
     /* remove mutex from thread's taken list */
     rt_list_remove(&mutex->taken_list);
 
     /* whether change the thread priority */
     if (mutex->owner)
     {
-        rt_sched_lock(&slvl);
         need_schedule = _check_and_update_prio(mutex->owner, mutex);
+    }
 
-        if (need_schedule)
-        {
-            rt_sched_unlock_n_resched(slvl);
-        }
-        else
-        {
-            rt_sched_unlock(slvl);
-        }
+    if (need_schedule)
+    {
+        rt_sched_unlock_n_resched(slvl);
+    }
+    else
+    {
+        rt_sched_unlock(slvl);
     }
 
     /* unlock and do necessary reschedule if required */
@@ -1617,11 +1619,11 @@ rt_err_t rt_mutex_release(rt_mutex_t mutex)
     /* if no hold */
     if (mutex->hold == 0)
     {
+        rt_sched_lock(&slvl);
+
         /* remove mutex from thread's taken list */
         rt_list_remove(&mutex->taken_list);
 
-        rt_sched_lock(&slvl);
-
         /* whether change the thread priority */
         need_schedule = _check_and_update_prio(thread, mutex);