From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751985AbbCAFff (ORCPT ); Sun, 1 Mar 2015 00:35:35 -0500 Received: from mail-wi0-f171.google.com ([209.85.212.171]:33519 "EHLO mail-wi0-f171.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751004AbbCAFfd (ORCPT ); Sun, 1 Mar 2015 00:35:33 -0500 Message-ID: <1425188128.2345.2.camel@gmail.com> Subject: Re: [PATCH 3/3] locking: rtmutex: set state back to running on error From: Mike Galbraith To: Sebastian Andrzej Siewior Cc: linux-kernel@vger.kernel.org, Peter Zijlstra , Ingo Molnar , Maarten Lankhorst Date: Sun, 01 Mar 2015 06:35:28 +0100 In-Reply-To: <1425056229-22326-4-git-send-email-bigeasy@linutronix.de> References: <1425056229-22326-1-git-send-email-bigeasy@linutronix.de> <1425056229-22326-4-git-send-email-bigeasy@linutronix.de> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.12.9 Mime-Version: 1.0 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, 2015-02-27 at 17:57 +0100, Sebastian Andrzej Siewior wrote: > 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 > --- > 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 */ This may want a Fixes: afffc6c1 tag, and should use the double underscore variant methinks. -Mike