From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_MUTT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 27713C31E4B for ; Fri, 14 Jun 2019 12:56:55 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id E8E0E208CA for ; Fri, 14 Jun 2019 12:56:54 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="COXfg54U" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727907AbfFNM4t (ORCPT ); Fri, 14 Jun 2019 08:56:49 -0400 Received: from bombadil.infradead.org ([198.137.202.133]:49564 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726874AbfFNM4t (ORCPT ); Fri, 14 Jun 2019 08:56:49 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=In-Reply-To:Content-Transfer-Encoding :Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date: Sender:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=75ZK6uA+v8HWBuHLrrBEBKQG77OfYldSM/de/8si5No=; b=COXfg54UV0gR017XZ9SWUN/fNL 9LgmRy/npcTpGelXHuFq9mYwJlBP9dWYq0TAZC9dYFPnuXBjrhTjMN3UhqNrt4t5+vO42K6cgmbgK o9ilSXIeCLsRBDCN1k0LaTHKZ0oriFE9AoHYXBaohI7UxbHGv+RvGCsOsfTVu9LZJBkmwByPK7y0m FYCAQn2lJXLCYWsX1bTf+sghfrFoIGVMMBhkcN96v70+biGd6vZqxPk+EvDUT4Yd5A4LrQfFBQF34 OsHwCPwFL12WAguOwyUePNc1PjfaMoBpjREg/76wzpfwN5TG3/ShRM4lnCJ5E5bp206H57Z6eLBPs XXG1lOgQ==; Received: from j217100.upc-j.chello.nl ([24.132.217.100] helo=hirez.programming.kicks-ass.net) by bombadil.infradead.org with esmtpsa (Exim 4.92 #3 (Red Hat Linux)) id 1hbll5-0004yM-1S; Fri, 14 Jun 2019 12:56:43 +0000 Received: by hirez.programming.kicks-ass.net (Postfix, from userid 1000) id 60A052013F73F; Fri, 14 Jun 2019 14:56:41 +0200 (CEST) Date: Fri, 14 Jun 2019 14:56:41 +0200 From: Peter Zijlstra To: Christian =?iso-8859-1?Q?K=F6nig?= Cc: daniel@ffwll.ch, l.stach@pengutronix.de, linux+etnaviv@armlinux.org.uk, christian.gmeiner@gmail.com, yuq825@gmail.com, eric@anholt.net, thellstrom@vmware.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, etnaviv@lists.freedesktop.org, lima@lists.freedesktop.org Subject: Re: [PATCH 1/6] locking: add ww_mutex_(un)lock_for_each helpers Message-ID: <20190614125641.GO3436@hirez.programming.kicks-ass.net> References: <20190614124125.124181-1-christian.koenig@amd.com> <20190614124125.124181-2-christian.koenig@amd.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20190614124125.124181-2-christian.koenig@amd.com> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Jun 14, 2019 at 02:41:20PM +0200, Christian König wrote: > The ww_mutex implementation allows for detection deadlocks when multiple > threads try to acquire the same set of locks in different order. > > The problem is that handling those deadlocks was the burden of the user of > the ww_mutex implementation and at least some users didn't got that right > on the first try. > > I'm not a big fan of macros, but it still better then implementing the same > logic at least halve a dozen times. So this patch adds two macros to lock > and unlock multiple ww_mutex instances with the necessary deadlock handling. > > Signed-off-by: Christian König > --- > include/linux/ww_mutex.h | 75 ++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 75 insertions(+) > > diff --git a/include/linux/ww_mutex.h b/include/linux/ww_mutex.h > index 3af7c0e03be5..a0d893b5b114 100644 > --- a/include/linux/ww_mutex.h > +++ b/include/linux/ww_mutex.h > @@ -369,4 +369,79 @@ static inline bool ww_mutex_is_locked(struct ww_mutex *lock) > return mutex_is_locked(&lock->base); > } > > +/** > + * ww_mutex_unlock_for_each - cleanup after error or contention > + * @loop: for loop code fragment iterating over all the locks > + * @pos: code fragment returning the currently handled lock > + * @contended: the last contended ww_mutex or NULL or ERR_PTR > + * > + * Helper to make cleanup after error or lock contention easier. > + * First unlock the last contended lock and then all other locked ones. > + */ > +#define ww_mutex_unlock_for_each(loop, pos, contended) \ > + if (!IS_ERR(contended)) { \ > + if (contended) \ > + ww_mutex_unlock(contended); \ > + contended = (pos); \ > + loop { \ > + if (contended == (pos)) \ > + break; \ > + ww_mutex_unlock(pos); \ > + } \ > + } > + > +/** > + * ww_mutex_lock_for_each - implement ww_mutex deadlock handling > + * @loop: for loop code fragment iterating over all the locks > + * @pos: code fragment returning the currently handled lock > + * @contended: ww_mutex pointer variable for state handling > + * @ret: int variable to store the return value of ww_mutex_lock() > + * @intr: If true ww_mutex_lock_interruptible() is used > + * @ctx: ww_acquire_ctx pointer for the locking > + * > + * This macro implements the necessary logic to lock multiple ww_mutex > + * instances. Lock contention with backoff and re-locking is handled by the > + * macro so that the loop body only need to handle other errors and > + * successfully acquired locks. > + * > + * With the @loop and @pos code fragment it is possible to apply this logic > + * to all kind of containers (array, list, tree, etc...) holding multiple > + * ww_mutex instances. > + * > + * @contended is used to hold the current state we are in. -ENOENT is used to > + * signal that we are just starting the handling. -EDEADLK means that the > + * current position is contended and we need to restart the loop after locking > + * it. NULL means that there is no contention to be handled. Any other value is > + * the last contended ww_mutex. > + */ > +#define ww_mutex_lock_for_each(loop, pos, contended, ret, intr, ctx) \ > + for (contended = ERR_PTR(-ENOENT); ({ \ > + __label__ relock, next; \ > + ret = -ENOENT; \ > + if (contended == ERR_PTR(-ENOENT)) \ > + contended = NULL; \ > + else if (contended == ERR_PTR(-EDEADLK)) \ > + contended = (pos); \ > + else \ > + goto next; \ > + loop { \ > + if (contended == (pos)) { \ > + contended = NULL; \ > + continue; \ > + } \ > +relock: \ > + ret = !(intr) ? ww_mutex_lock(pos, ctx) : \ > + ww_mutex_lock_interruptible(pos, ctx); \ > + if (ret == -EDEADLK) { \ > + ww_mutex_unlock_for_each(loop, pos, \ > + contended); \ > + contended = ERR_PTR(-EDEADLK); \ > + goto relock; \ > + } \ > + break; \ > +next: \ > + continue; \ > + } \ > + }), ret != -ENOENT;) > + Yea gawds, that's eyebleeding bad, even for macros :/ It also breaks with pretty much all other *for_each*() macros in existence by not actually including the loop itself but farming that out to an argument statement (@loop), suggesting these really should not be called for_each. From mboxrd@z Thu Jan 1 00:00:00 1970 From: Peter Zijlstra Subject: Re: [PATCH 1/6] locking: add ww_mutex_(un)lock_for_each helpers Date: Fri, 14 Jun 2019 14:56:41 +0200 Message-ID: <20190614125641.GO3436@hirez.programming.kicks-ass.net> References: <20190614124125.124181-1-christian.koenig@amd.com> <20190614124125.124181-2-christian.koenig@amd.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline In-Reply-To: <20190614124125.124181-2-christian.koenig@amd.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Christian =?iso-8859-1?Q?K=F6nig?= Cc: thellstrom@vmware.com, lima@lists.freedesktop.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, etnaviv@lists.freedesktop.org, yuq825@gmail.com, linux+etnaviv@armlinux.org.uk List-Id: dri-devel@lists.freedesktop.org T24gRnJpLCBKdW4gMTQsIDIwMTkgYXQgMDI6NDE6MjBQTSArMDIwMCwgQ2hyaXN0aWFuIEvDtm5p ZyB3cm90ZToKPiBUaGUgd3dfbXV0ZXggaW1wbGVtZW50YXRpb24gYWxsb3dzIGZvciBkZXRlY3Rp b24gZGVhZGxvY2tzIHdoZW4gbXVsdGlwbGUKPiB0aHJlYWRzIHRyeSB0byBhY3F1aXJlIHRoZSBz YW1lIHNldCBvZiBsb2NrcyBpbiBkaWZmZXJlbnQgb3JkZXIuCj4gCj4gVGhlIHByb2JsZW0gaXMg dGhhdCBoYW5kbGluZyB0aG9zZSBkZWFkbG9ja3Mgd2FzIHRoZSBidXJkZW4gb2YgdGhlIHVzZXIg b2YKPiB0aGUgd3dfbXV0ZXggaW1wbGVtZW50YXRpb24gYW5kIGF0IGxlYXN0IHNvbWUgdXNlcnMg ZGlkbid0IGdvdCB0aGF0IHJpZ2h0Cj4gb24gdGhlIGZpcnN0IHRyeS4KPiAKPiBJJ20gbm90IGEg YmlnIGZhbiBvZiBtYWNyb3MsIGJ1dCBpdCBzdGlsbCBiZXR0ZXIgdGhlbiBpbXBsZW1lbnRpbmcg dGhlIHNhbWUKPiBsb2dpYyBhdCBsZWFzdCBoYWx2ZSBhIGRvemVuIHRpbWVzLiBTbyB0aGlzIHBh dGNoIGFkZHMgdHdvIG1hY3JvcyB0byBsb2NrCj4gYW5kIHVubG9jayBtdWx0aXBsZSB3d19tdXRl eCBpbnN0YW5jZXMgd2l0aCB0aGUgbmVjZXNzYXJ5IGRlYWRsb2NrIGhhbmRsaW5nLgo+IAo+IFNp Z25lZC1vZmYtYnk6IENocmlzdGlhbiBLw7ZuaWcgPGNocmlzdGlhbi5rb2VuaWdAYW1kLmNvbT4K PiAtLS0KPiAgaW5jbHVkZS9saW51eC93d19tdXRleC5oIHwgNzUgKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKwo+ICAxIGZpbGUgY2hhbmdlZCwgNzUgaW5zZXJ0aW9ucygr KQo+IAo+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3d3X211dGV4LmggYi9pbmNsdWRlL2xp bnV4L3d3X211dGV4LmgKPiBpbmRleCAzYWY3YzBlMDNiZTUuLmEwZDg5M2I1YjExNCAxMDA2NDQK PiAtLS0gYS9pbmNsdWRlL2xpbnV4L3d3X211dGV4LmgKPiArKysgYi9pbmNsdWRlL2xpbnV4L3d3 X211dGV4LmgKPiBAQCAtMzY5LDQgKzM2OSw3OSBAQCBzdGF0aWMgaW5saW5lIGJvb2wgd3dfbXV0 ZXhfaXNfbG9ja2VkKHN0cnVjdCB3d19tdXRleCAqbG9jaykKPiAgCXJldHVybiBtdXRleF9pc19s b2NrZWQoJmxvY2stPmJhc2UpOwo+ICB9Cj4gIAo+ICsvKioKPiArICogd3dfbXV0ZXhfdW5sb2Nr X2Zvcl9lYWNoIC0gY2xlYW51cCBhZnRlciBlcnJvciBvciBjb250ZW50aW9uCj4gKyAqIEBsb29w OiBmb3IgbG9vcCBjb2RlIGZyYWdtZW50IGl0ZXJhdGluZyBvdmVyIGFsbCB0aGUgbG9ja3MKPiAr ICogQHBvczogY29kZSBmcmFnbWVudCByZXR1cm5pbmcgdGhlIGN1cnJlbnRseSBoYW5kbGVkIGxv Y2sKPiArICogQGNvbnRlbmRlZDogdGhlIGxhc3QgY29udGVuZGVkIHd3X211dGV4IG9yIE5VTEwg b3IgRVJSX1BUUgo+ICsgKgo+ICsgKiBIZWxwZXIgdG8gbWFrZSBjbGVhbnVwIGFmdGVyIGVycm9y IG9yIGxvY2sgY29udGVudGlvbiBlYXNpZXIuCj4gKyAqIEZpcnN0IHVubG9jayB0aGUgbGFzdCBj b250ZW5kZWQgbG9jayBhbmQgdGhlbiBhbGwgb3RoZXIgbG9ja2VkIG9uZXMuCj4gKyAqLwo+ICsj ZGVmaW5lIHd3X211dGV4X3VubG9ja19mb3JfZWFjaChsb29wLCBwb3MsIGNvbnRlbmRlZCkJXAo+ ICsJaWYgKCFJU19FUlIoY29udGVuZGVkKSkgewkJCVwKPiArCQlpZiAoY29udGVuZGVkKQkJCQlc Cj4gKwkJCXd3X211dGV4X3VubG9jayhjb250ZW5kZWQpOwlcCj4gKwkJY29udGVuZGVkID0gKHBv cyk7CQkJXAo+ICsJCWxvb3AgewkJCQkJXAo+ICsJCQlpZiAoY29udGVuZGVkID09IChwb3MpKQkJ XAo+ICsJCQkJYnJlYWs7CQkJXAo+ICsJCQl3d19tdXRleF91bmxvY2socG9zKTsJCVwKPiArCQl9 CQkJCQlcCj4gKwl9Cj4gKwo+ICsvKioKPiArICogd3dfbXV0ZXhfbG9ja19mb3JfZWFjaCAtIGlt cGxlbWVudCB3d19tdXRleCBkZWFkbG9jayBoYW5kbGluZwo+ICsgKiBAbG9vcDogZm9yIGxvb3Ag Y29kZSBmcmFnbWVudCBpdGVyYXRpbmcgb3ZlciBhbGwgdGhlIGxvY2tzCj4gKyAqIEBwb3M6IGNv ZGUgZnJhZ21lbnQgcmV0dXJuaW5nIHRoZSBjdXJyZW50bHkgaGFuZGxlZCBsb2NrCj4gKyAqIEBj b250ZW5kZWQ6IHd3X211dGV4IHBvaW50ZXIgdmFyaWFibGUgZm9yIHN0YXRlIGhhbmRsaW5nCj4g KyAqIEByZXQ6IGludCB2YXJpYWJsZSB0byBzdG9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHd3X211 dGV4X2xvY2soKQo+ICsgKiBAaW50cjogSWYgdHJ1ZSB3d19tdXRleF9sb2NrX2ludGVycnVwdGli bGUoKSBpcyB1c2VkCj4gKyAqIEBjdHg6IHd3X2FjcXVpcmVfY3R4IHBvaW50ZXIgZm9yIHRoZSBs b2NraW5nCj4gKyAqCj4gKyAqIFRoaXMgbWFjcm8gaW1wbGVtZW50cyB0aGUgbmVjZXNzYXJ5IGxv Z2ljIHRvIGxvY2sgbXVsdGlwbGUgd3dfbXV0ZXgKPiArICogaW5zdGFuY2VzLiBMb2NrIGNvbnRl bnRpb24gd2l0aCBiYWNrb2ZmIGFuZCByZS1sb2NraW5nIGlzIGhhbmRsZWQgYnkgdGhlCj4gKyAq IG1hY3JvIHNvIHRoYXQgdGhlIGxvb3AgYm9keSBvbmx5IG5lZWQgdG8gaGFuZGxlIG90aGVyIGVy cm9ycyBhbmQKPiArICogc3VjY2Vzc2Z1bGx5IGFjcXVpcmVkIGxvY2tzLgo+ICsgKgo+ICsgKiBX aXRoIHRoZSBAbG9vcCBhbmQgQHBvcyBjb2RlIGZyYWdtZW50IGl0IGlzIHBvc3NpYmxlIHRvIGFw cGx5IHRoaXMgbG9naWMKPiArICogdG8gYWxsIGtpbmQgb2YgY29udGFpbmVycyAoYXJyYXksIGxp c3QsIHRyZWUsIGV0Yy4uLikgaG9sZGluZyBtdWx0aXBsZQo+ICsgKiB3d19tdXRleCBpbnN0YW5j ZXMuCj4gKyAqCj4gKyAqIEBjb250ZW5kZWQgaXMgdXNlZCB0byBob2xkIHRoZSBjdXJyZW50IHN0 YXRlIHdlIGFyZSBpbi4gLUVOT0VOVCBpcyB1c2VkIHRvCj4gKyAqIHNpZ25hbCB0aGF0IHdlIGFy ZSBqdXN0IHN0YXJ0aW5nIHRoZSBoYW5kbGluZy4gLUVERUFETEsgbWVhbnMgdGhhdCB0aGUKPiAr ICogY3VycmVudCBwb3NpdGlvbiBpcyBjb250ZW5kZWQgYW5kIHdlIG5lZWQgdG8gcmVzdGFydCB0 aGUgbG9vcCBhZnRlciBsb2NraW5nCj4gKyAqIGl0LiBOVUxMIG1lYW5zIHRoYXQgdGhlcmUgaXMg bm8gY29udGVudGlvbiB0byBiZSBoYW5kbGVkLiBBbnkgb3RoZXIgdmFsdWUgaXMKPiArICogdGhl IGxhc3QgY29udGVuZGVkIHd3X211dGV4Lgo+ICsgKi8KPiArI2RlZmluZSB3d19tdXRleF9sb2Nr X2Zvcl9lYWNoKGxvb3AsIHBvcywgY29udGVuZGVkLCByZXQsIGludHIsIGN0eCkJXAo+ICsJZm9y IChjb250ZW5kZWQgPSBFUlJfUFRSKC1FTk9FTlQpOyAoewkJCQlcCj4gKwkJX19sYWJlbF9fIHJl bG9jaywgbmV4dDsJCQkJCVwKPiArCQlyZXQgPSAtRU5PRU5UOwkJCQkJCVwKPiArCQlpZiAoY29u dGVuZGVkID09IEVSUl9QVFIoLUVOT0VOVCkpCQkJXAo+ICsJCQljb250ZW5kZWQgPSBOVUxMOwkJ CQlcCj4gKwkJZWxzZSBpZiAoY29udGVuZGVkID09IEVSUl9QVFIoLUVERUFETEspKQkJXAo+ICsJ CQljb250ZW5kZWQgPSAocG9zKTsJCQkJXAo+ICsJCWVsc2UJCQkJCQkJXAo+ICsJCQlnb3RvIG5l eHQ7CQkJCQlcCj4gKwkJbG9vcCB7CQkJCQkJCVwKPiArCQkJaWYgKGNvbnRlbmRlZCA9PSAocG9z KSkJewkJCVwKPiArCQkJCWNvbnRlbmRlZCA9IE5VTEw7CQkJXAo+ICsJCQkJY29udGludWU7CQkJ CVwKPiArCQkJfQkJCQkJCVwKPiArcmVsb2NrOgkJCQkJCQkJCVwKPiArCQkJcmV0ID0gIShpbnRy KSA/IHd3X211dGV4X2xvY2socG9zLCBjdHgpIDoJXAo+ICsJCQkJd3dfbXV0ZXhfbG9ja19pbnRl cnJ1cHRpYmxlKHBvcywgY3R4KTsJXAo+ICsJCQlpZiAocmV0ID09IC1FREVBRExLKSB7CQkJCVwK PiArCQkJCXd3X211dGV4X3VubG9ja19mb3JfZWFjaChsb29wLCBwb3MsCVwKPiArCQkJCQkJCSBj b250ZW5kZWQpOwlcCj4gKwkJCQljb250ZW5kZWQgPSBFUlJfUFRSKC1FREVBRExLKTsJCVwKPiAr CQkJCWdvdG8gcmVsb2NrOwkJCQlcCj4gKwkJCX0JCQkJCQlcCj4gKwkJCWJyZWFrOwkJCQkJCVwK PiArbmV4dDoJCQkJCQkJCQlcCj4gKwkJCWNvbnRpbnVlOwkJCQkJXAo+ICsJCX0JCQkJCQkJXAo+ ICsJfSksIHJldCAhPSAtRU5PRU5UOykKPiArCgpZZWEgZ2F3ZHMsIHRoYXQncyBleWVibGVlZGlu ZyBiYWQsIGV2ZW4gZm9yIG1hY3JvcyA6LwoKSXQgYWxzbyBicmVha3Mgd2l0aCBwcmV0dHkgbXVj aCBhbGwgb3RoZXIgKmZvcl9lYWNoKigpIG1hY3JvcyBpbgpleGlzdGVuY2UgYnkgbm90IGFjdHVh bGx5IGluY2x1ZGluZyB0aGUgbG9vcCBpdHNlbGYgYnV0IGZhcm1pbmcgdGhhdCBvdXQKdG8gYW4g YXJndW1lbnQgc3RhdGVtZW50IChAbG9vcCksIHN1Z2dlc3RpbmcgdGhlc2UgcmVhbGx5IHNob3Vs ZCBub3QgYmUKY2FsbGVkIGZvcl9lYWNoLgoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3Rz LmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xp c3RpbmZvL2RyaS1kZXZlbA==