Messages in this thread Patch in this message | | | From | Sebastian Andrzej Siewior <> | Subject | [PATCH 3/3] locking: rtmutex: set state back to running on error | Date | Fri, 27 Feb 2015 17:57:09 +0100 |
| |
The "usual" path is: - rt_mutex_slowlock() - set_current_state() - task_blocks_on_rt_mutex() (ret 0) - __rt_mutex_slowlock() - sleep or not but do return with __set_current_state(TASK_RUNNING) - back to caller.
In the early error case where task_blocks_on_rt_mutex() return -EDEADLK we never change the task's state back to RUNNING. I assume this is intended. Without this change after ww_mutex using rt_mutex the selftest passes but later I get plenty of | bad: scheduling from the idle thread! backtraces.
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> --- kernel/locking/rtmutex.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c index 6d7d72ffa619..c4d07f254bb4 100644 --- a/kernel/locking/rtmutex.c +++ b/kernel/locking/rtmutex.c @@ -1305,6 +1305,7 @@ rt_mutex_slowlock(struct rt_mutex *lock, int state, } if (unlikely(ret)) { + set_current_state(TASK_RUNNING); if (rt_mutex_has_waiters(lock)) remove_waiter(lock, &waiter); /* ww_mutex need the error reported */ -- 2.1.4
| |