Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752181AbcDIDZo (ORCPT ); Fri, 8 Apr 2016 23:25:44 -0400 Received: from mx1.redhat.com ([209.132.183.28]:50316 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751587AbcDIDZn (ORCPT ); Fri, 8 Apr 2016 23:25:43 -0400 Reply-To: xlpang@redhat.com Subject: Re: [PATCH] sched/deadline/rtmutex: Fix a PI crash for deadline tasks References: <56FE685E.6080001@redhat.com> <19912883-8AB1-4DFD-A0E1-F23057785243@infradead.org> <56FE78E0.5060504@redhat.com> <20160401215143.GB2906@worktop> <57037974.1020002@redhat.com> <20160405091954.GI3448@twins.programming.kicks-ass.net> <20160405092954.GC24771@twins.programming.kicks-ass.net> <20160408122510.15978179@gandalf.local.home> <20160408173835.GC1087@worktop> <20160408145055.13c98a75@gandalf.local.home> <20160408185916.GQ3448@twins.programming.kicks-ass.net> To: Peter Zijlstra , Steven Rostedt Cc: linux-kernel@vger.kernel.org, Juri Lelli , Ingo Molnar , Thomas Gleixner From: Xunlei Pang Message-ID: <57087633.3020700@redhat.com> Date: Sat, 9 Apr 2016 11:25:39 +0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.2.0 MIME-Version: 1.0 In-Reply-To: <20160408185916.GQ3448@twins.programming.kicks-ass.net> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2081 Lines: 46 On 2016/04/09 at 02:59, Peter Zijlstra wrote: > On Fri, Apr 08, 2016 at 02:50:55PM -0400, Steven Rostedt wrote: >> On Fri, 8 Apr 2016 19:38:35 +0200 >> Peter Zijlstra wrote: >> >>> On Fri, Apr 08, 2016 at 12:25:10PM -0400, Steven Rostedt wrote: >>> >>>> So the preempt_disable() is to allow us to set current back to its >>>> normal priority first before waking up the other task because we don't >>>> want two tasks at the same priority? >>>> What's the point of swapping deboost and the wake up again? >>> In the context of this patch, it ensures the new pi_task pointer points >>> to something that exists -- this is a rather useful property for a >>> pointer to have. >> It's not clear to what would make the new pi_task pointer object no >> longer exist from this patch. I take it that waking up the wake_q, will >> cause something to change in the code of rt_mutex_adjust_prio(current). >> If so, it should probably be stated in a comment, because nothing is >> obvious here. > Its pretty obvious that a running task can exit :-) > > But also, wake_q holds a task ref. > >>> It furthermore guarantees that it points to a blocked task, another >>> useful property. >> I would think that the slowfn() would have removed anything to do with >> what's on the wake_q removed from current. > It cannot. > >> What task on what pointer. >> I'm only looking at this current patch, not anything to do with the >> original patch of this thread. That is, just the swap of waking up >> wake_q and calling rt_mutex_adjust_prio(). > This whole patch was in the context of the previous patch, as should be > clear from the thread. > > In any case, I just realized we do not in fact provide this guarantee > (of pointing to a blocked task) that needs a bit more work. Current patch calls rt_mutex_adjust_prio() before wake_up_q() the wakee, at that moment the wakee has been removed by rt_mutex_slowunlock()->mark_wakeup_next_waiter(), from current's pi_waiters, rt_mutex_adjust_prio() won't see this wakee, so I think this should not be problem. Regards, Xunlei