From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751759AbdCMJZ5 (ORCPT ); Mon, 13 Mar 2017 05:25:57 -0400 Received: from bombadil.infradead.org ([65.50.211.133]:56739 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750902AbdCMJZu (ORCPT ); Mon, 13 Mar 2017 05:25:50 -0400 Date: Mon, 13 Mar 2017 10:25:42 +0100 From: Peter Zijlstra To: Thomas Gleixner Cc: mingo@kernel.org, juri.lelli@arm.com, rostedt@goodmis.org, xlpang@redhat.com, bigeasy@linutronix.de, linux-kernel@vger.kernel.org, mathieu.desnoyers@efficios.com, jdesfossez@efficios.com, bristot@redhat.com, dvhart@infradead.org Subject: Re: [PATCH -v5 14/14] futex: futex_unlock_pi() determinism Message-ID: <20170313092542.GJ3343@twins.programming.kicks-ass.net> References: <20170304092717.762954142@infradead.org> <20170304093559.696873055@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23.1 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Mar 07, 2017 at 03:31:50PM +0100, Thomas Gleixner wrote: > On Sat, 4 Mar 2017, Peter Zijlstra wrote: > > > The problem with returning -EAGAIN when the waiter state mismatches is > > that it becomes very hard to proof a bounded execution time on the > > operation. And seeing that this is a RT operation, this is somewhat > > important. > > > > While in practise it will be very unlikely to ever really take more > > than one or two rounds, proving so becomes rather hard. > > Oh no. Assume the following: > > T1 and T2 are both pinned to CPU0. prio(T2) > prio(T1) > > CPU0 > > T1 > lock_pi() > queue_me() <- Waiter is visible > > preemption > > T2 > unlock_pi() > loops with -EAGAIN forever So this is true before the last patch; but if we look at the locking changes brought by that (pasting its changelog here): Before: futex_lock_pi() futex_unlock_pi() unlock hb->lock lock hb->lock unlock hb->lock lock rt_mutex->wait_lock unlock rt_mutex_wait_lock -EAGAIN lock rt_mutex->wait_lock list_add unlock rt_mutex->wait_lock schedule() lock rt_mutex->wait_lock list_del unlock rt_mutex->wait_lock -EAGAIN lock hb->lock After: futex_lock_pi() futex_unlock_pi() lock hb->lock lock rt_mutex->wait_lock list_add unlock rt_mutex->wait_lock unlock hb->lock schedule() lock hb->lock unlock hb->lock lock hb->lock lock rt_mutex->wait_lock list_del unlock rt_mutex->wait_lock lock rt_mutex->wait_lock unlock rt_mutex_wait_lock -EAGAIN unlock hb->lock Your T2 (of higher prio) would block on T1's hb->lock and boost T1 (since hb->lock is an rt_mutex). Alternatively (!PREEMPT_FULL), the interleave cannot happen (when pinned to a single CPU) because then hb->lock disables preemption, it being a spinlock. Unless I need to go drink more wake-up-juice..