Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp945120ybi; Fri, 14 Jun 2019 06:06:47 -0700 (PDT) X-Google-Smtp-Source: APXvYqxscavbL0Vc7nPlrWhDAsZqWxd556mkF2E/K0L2Ud9qmZSUgomu6Cnh3FEtNX0hygrXnmQD X-Received: by 2002:a63:6981:: with SMTP id e123mr11722427pgc.136.1560517607300; Fri, 14 Jun 2019 06:06:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1560517607; cv=none; d=google.com; s=arc-20160816; b=wjBT3j5lBBdopjd+xTFjS00qyt2//7iCElkVAH9YlsKU3B7aibhWZrLolXI/gK5Vf2 B9se5iN6Lw43f5MbnjKfsumNjcN3jQSldLp/ih1i/wlQYEziIJZ7bN39ovSqwupndt0U t33hpcOs8Y0QSmbi4AUzMHSwME50W2FGBpbHph6C07H0ZizFW7ScVHvOkw73kLgB5BBW hUO2kBxNxhIHvCCyXBgJj4Af+87KKzdrzbjb+AxeaXEH+z5EtW2O0/T1jvAOVkaAJ0Vp 0Qa+qoYq1mC/56y/Jz/QEp4dOtNri0h1QNGR/LDr8RSFF4r45Ebrvqg0q3O4nKN8Ghm9 SfaA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-language :content-transfer-encoding:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:reply-to:dkim-signature; bh=nTZn4SPyaDhTYZFH09HWgAuSrH1KouQZuk7dsEDnlqQ=; b=bF5ZVZ/atElGZCxSpBbRTLtMC0bfBjAgH723mMvdcMJ0zCLpgwD1zcvkT4jatBG/Au TtGE6voHj2Wg3dypSNV9xXdb9YflR1nbJtJdx/k6BZw3pU2J+D/0MMes3ZP+Fu15k5qp ahgBcd7dNBv9u+wcHeqQYvBS10wRg1dg9UgmXQXE7e3eNTCjl+aoR5e7jEPIynhXmMGA SiDLFbwDBz8YmVh7cEjXpU7TkdpfYNJPGFyXX77wBXS3FFcGsmITrSuYxPzc79T99Ld4 KaE2os4a0oxYAZZQwyvnwWRJ1VUxyMP8GH8NhqolaM5AbgXLnShlK1UKrhAOKh0Gegzh G7fw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=uISqou4L; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id o39si2390450pje.28.2019.06.14.06.06.30; Fri, 14 Jun 2019 06:06:47 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=uISqou4L; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727926AbfFNNGP (ORCPT + 99 others); Fri, 14 Jun 2019 09:06:15 -0400 Received: from mail-wr1-f66.google.com ([209.85.221.66]:37176 "EHLO mail-wr1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726874AbfFNNGO (ORCPT ); Fri, 14 Jun 2019 09:06:14 -0400 Received: by mail-wr1-f66.google.com with SMTP id v14so2479556wrr.4 for ; Fri, 14 Jun 2019 06:06:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=reply-to:subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding:content-language; bh=nTZn4SPyaDhTYZFH09HWgAuSrH1KouQZuk7dsEDnlqQ=; b=uISqou4LxLmTnnqWGFBqhAPO23d6mu/AW9eI3GyVLhFvndewDRgAq3Z3hihsyOV6nw PAyJ22JEJgAhKt/b6bITbIuyIyHqgOdW/xO1MaGFlUV42mE8kBzJFPE/VuMtqupIIs+F Yip+tv9YQSVjxWIUyPSxtR5yljKyAR3M3aad7xGy6TnEuuJ5HjTZu7u0UiPuWO/TEu4D 3bcQfE6QxvixdTHZDw57Z0EUDmb81DbAz9zP28yEOXC4GZ1/A67W23wqJcbeg4voQCxe mXp1HY0/EhcGBQArOTP+V+dtGh1JqDezG0AhaJQjojdbC9In9I6u06mtqnFRxe7Dubda Mo2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:reply-to:subject:to:cc:references:from :message-id:date:user-agent:mime-version:in-reply-to :content-transfer-encoding:content-language; bh=nTZn4SPyaDhTYZFH09HWgAuSrH1KouQZuk7dsEDnlqQ=; b=QYoejdx7NUU0jF3D5vP/xOfmEqKXt9nclTxiDHu0RLM18KO1LW1FEsPiEJDwLik6ZA I8cay+Nzn2yyWYtXwNpTrLDjmKvzB1Bs5nfQp0lDIkhHClGk19OnkI0VA8pu4uXWjvOK q6ciWES/5MPSaJZmtZ0yxYnf6IZ1sEix8MWsQbUMGJujY2KTUVELO5k1fXP5D8/uvCkM 47UCj1VOA4D5dLf+r3sDHYuBZa4Fc4C4Jw5PjYRhNMSS1RUuY/m7TfdRcC6eue6GocUY NYTbJpxlk5XyPuWDAGC5kYpbFZJKgZI3neo5xdIyagpABvMVzysw/mKCmNW3niEIj+aK ESnQ== X-Gm-Message-State: APjAAAVu1CkmfxdT3QTGBHdY9iigtobBiSW5fF9ULJGruxFD5k7PK2Wa O4PXMMzPNDSVePQHNUko6Mc= X-Received: by 2002:adf:8044:: with SMTP id 62mr16770652wrk.20.1560517572880; Fri, 14 Jun 2019 06:06:12 -0700 (PDT) Received: from ?IPv6:2a02:908:1252:fb60:be8a:bd56:1f94:86e7? ([2a02:908:1252:fb60:be8a:bd56:1f94:86e7]) by smtp.gmail.com with ESMTPSA id w2sm1692473wrr.31.2019.06.14.06.06.10 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 14 Jun 2019 06:06:12 -0700 (PDT) Reply-To: christian.koenig@amd.com Subject: Re: [PATCH 3/6] drm/gem: use new ww_mutex_(un)lock_for_each macros To: Peter Zijlstra 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 References: <20190614124125.124181-1-christian.koenig@amd.com> <20190614124125.124181-4-christian.koenig@amd.com> <20190614125940.GP3436@hirez.programming.kicks-ass.net> From: =?UTF-8?Q?Christian_K=c3=b6nig?= Message-ID: <6f2084ae-61d5-8cb9-c975-901456eed7e3@gmail.com> Date: Fri, 14 Jun 2019 15:06:10 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.7.0 MIME-Version: 1.0 In-Reply-To: <20190614125940.GP3436@hirez.programming.kicks-ass.net> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Am 14.06.19 um 14:59 schrieb Peter Zijlstra: > On Fri, Jun 14, 2019 at 02:41:22PM +0200, Christian König wrote: >> Use the provided macros instead of implementing deadlock handling on our own. >> >> Signed-off-by: Christian König >> --- >> drivers/gpu/drm/drm_gem.c | 49 ++++++++++----------------------------- >> 1 file changed, 12 insertions(+), 37 deletions(-) >> >> diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c >> index 50de138c89e0..6e4623d3bee2 100644 >> --- a/drivers/gpu/drm/drm_gem.c >> +++ b/drivers/gpu/drm/drm_gem.c >> @@ -1307,51 +1307,26 @@ int >> drm_gem_lock_reservations(struct drm_gem_object **objs, int count, >> struct ww_acquire_ctx *acquire_ctx) >> { >> - int contended = -1; >> + struct ww_mutex *contended; >> int i, ret; >> >> ww_acquire_init(acquire_ctx, &reservation_ww_class); >> >> -retry: >> - if (contended != -1) { >> - struct drm_gem_object *obj = objs[contended]; >> - >> - ret = ww_mutex_lock_slow_interruptible(&obj->resv->lock, >> - acquire_ctx); >> - if (ret) { >> - ww_acquire_done(acquire_ctx); >> - return ret; >> - } >> - } >> - >> - for (i = 0; i < count; i++) { >> - if (i == contended) >> - continue; >> - >> - ret = ww_mutex_lock_interruptible(&objs[i]->resv->lock, >> - acquire_ctx); >> - if (ret) { >> - int j; >> - >> - for (j = 0; j < i; j++) >> - ww_mutex_unlock(&objs[j]->resv->lock); >> - >> - if (contended != -1 && contended >= i) >> - ww_mutex_unlock(&objs[contended]->resv->lock); >> - >> - if (ret == -EDEADLK) { >> - contended = i; >> - goto retry; > retry here, starts the whole locking loop. > >> - } >> - >> - ww_acquire_done(acquire_ctx); >> - return ret; >> - } >> - } > +#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); \ > + } \ > + } > + > > +#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; \ > > while relock here continues where it left of and doesn't restart @loop. > Or am I reading this monstrosity the wrong way? contended = ERR_PTR(-EDEADLK) makes sure that the whole loop is restarted after retrying to acquire the lock. See the "if" above "loop". Christian. > > + } \ > + break; \ > +next: \ > + continue; \ > + } \ > + }), ret != -ENOENT;) > + > >> + ww_mutex_lock_for_each(for (i = 0; i < count; i++), >> + &objs[i]->resv->lock, contended, ret, true, >> + acquire_ctx) >> + if (ret) >> + goto error; >> >> ww_acquire_done(acquire_ctx); >> >> return 0; >> + >> +error: >> + ww_mutex_unlock_for_each(for (i = 0; i < count; i++), >> + &objs[i]->resv->lock, contended); >> + ww_acquire_done(acquire_ctx); >> + return ret; >> } >> EXPORT_SYMBOL(drm_gem_lock_reservations);