From nobody Sat Apr 11 02:20:40 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id CB04BC25B08 for ; Wed, 17 Aug 2022 07:02:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238557AbiHQHCO (ORCPT ); Wed, 17 Aug 2022 03:02:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39728 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229502AbiHQHCG (ORCPT ); Wed, 17 Aug 2022 03:02:06 -0400 X-Greylist: delayed 63 seconds by postgrey-1.37 at lindbergh.monkeyblade.net; Wed, 17 Aug 2022 00:02:05 PDT Received: from us-smtp-delivery-110.mimecast.com (us-smtp-delivery-110.mimecast.com [170.10.129.110]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2A4D578BEB for ; Wed, 17 Aug 2022 00:02:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=globallogic.com; s=mimecast20210517; t=1660719723; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=pH7OvNNPsm5VQKGPpzNsRUdrZIopXa5V2ADSxMuiVQs=; b=mERMMUr1Y/Rh6Xobv06ZHhtldZSc5N6BoAeVJg5XDsam/5qR9wOpqwZTogDpLS0S5/Isl9 ceshlDgJnUw7QRANYMvdabug0zbnBNnYYMG3EHo5M8fhGgxa9TpoOLRJX/X/BGl0T7f46a KyCSDg7SVyN8JlmGIrJjOWDKwHK4wljYNPHfdy8LZ0PvnLzqFAmik1MsK0cKPCVQ5hXcbU VhRcsVautFCtdRJxbu4dQfKEGv37v51qRq/sO4Ehj2ip5c5AQY5E056h/52zm3wz/dVXH7 0fnC0RNNnEffh4SMwXDITlR/jpghNCFT9maNy53yt054t+OqI2zNU6scKcRifg== Received: from mail-lj1-f198.google.com (mail-lj1-f198.google.com [209.85.208.198]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-267-vScHbiWYNuiILC-2SwC5GQ-1; Wed, 17 Aug 2022 03:00:58 -0400 X-MC-Unique: vScHbiWYNuiILC-2SwC5GQ-1 Received: by mail-lj1-f198.google.com with SMTP id w21-20020a2e9595000000b0025ec9280923so3827507ljh.8 for ; Wed, 17 Aug 2022 00:00:58 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc; bh=1exQ5qdkhCvVq2PBAzpRU9G+dzwvsJeddbBUdhaFhX8=; b=WlkuI1Q5R1i/LHaTd9X2Xf7cMDuBE9mljfzP1RETFam/y7IO5nyNHK0/8ya/HVZyCF 7Fa6qRo8YB+OTdriDuSnPhoudSSE5BDV7935c5h2rU7zG8KdYZNOCFKygXdKI+rmKl+g L0i6dmDHXfFMj8iu+GAVX/npiU+0C4e6hvENylxjpLi66ontvelkxuY2ZTdeXKR1H43w GyPBDFfl0rZVKBuQDOngz4TTHNg5zL+X4oxrz3UGHXV6KmsXAxPzd/8LN5j1z1z9QPY7 QY8Q5Y5cufZrspDymbRPOqQjYvz9u8EGfzJyODkKhpKDfJbB0uxXzPul2hA0KDhcmjQ/ f/ig== X-Gm-Message-State: ACgBeo0qgBIgql4k9CGLXWyy7g5VB5r+vzLciooh5OtkK40+5h+4A5zA L17mlY63jSGcXQYU0Bbb7/rZUjMwp0YUtuf/si5QthDVxm3kdsnCiPPLuD4KrTZgvQywQb0pSUe gp1XQGS5i+Z0xjxqcFeyFtrM= X-Received: by 2002:ac2:4562:0:b0:48b:2a91:e59 with SMTP id k2-20020ac24562000000b0048b2a910e59mr8050286lfm.91.1660719657145; Wed, 17 Aug 2022 00:00:57 -0700 (PDT) X-Google-Smtp-Source: AA6agR6a7nMNBiNK6k+E8U2fEcZfWVKJGSibaw9CkQYQp99t+6R5gMnJO2+WyETeLUoo4et3K4AZng== X-Received: by 2002:ac2:4562:0:b0:48b:2a91:e59 with SMTP id k2-20020ac24562000000b0048b2a910e59mr8050281lfm.91.1660719656896; Wed, 17 Aug 2022 00:00:56 -0700 (PDT) Received: from localhost.localdomain ([91.245.79.37]) by smtp.googlemail.com with ESMTPSA id o18-20020a05651205d200b0048a91266268sm1592278lfo.232.2022.08.17.00.00.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Aug 2022 00:00:56 -0700 (PDT) From: Sviatoslav Peleshko Cc: Sviatoslav Peleshko , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , David Airlie , Daniel Vetter , Maarten Lankhorst , =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Subject: [PATCH] drm/i915: Fix random -ENOSPC eviction errors due to locked vma objects Date: Wed, 17 Aug 2022 09:55:41 +0300 Message-Id: <20220817065541.30101-1-sviatoslav.peleshko@globallogic.com> X-Mailer: git-send-email 2.37.1 MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: globallogic.com Content-Transfer-Encoding: quoted-printable To: unlisted-recipients:; (no To-header on input) Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8"; x-default="true" The i915_gem_object_trylock we had in the grab_vma() makes it return false when the vma->obj is already locked. In this case we'll skip this vma during eviction, and eventually might be forced to return -ENOSPC even though we could've evicted this vma if we waited for the lock a bit. To fix this, replace the i915_gem_object_trylock with i915_gem_object_lock. And because we have to worry about the potential deadlock now, bubble-up the error code, so it will be correctly handled by the WW mechanism. This fixes the issue https://gitlab.freedesktop.org/drm/intel/-/issues/6564 Fixes: 7e00897be8bf ("drm/i915: Add object locking to i915_gem_evict_for_no= de and i915_gem_evict_something, v2.") Signed-off-by: Sviatoslav Peleshko --- drivers/gpu/drm/i915/i915_gem_evict.c | 69 ++++++++++++++++++--------- 1 file changed, 46 insertions(+), 23 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_gem_evict.c b/drivers/gpu/drm/i915/i= 915_gem_evict.c index f025ee4fa526..9d43f213f68f 100644 --- a/drivers/gpu/drm/i915/i915_gem_evict.c +++ b/drivers/gpu/drm/i915/i915_gem_evict.c @@ -55,49 +55,58 @@ static int ggtt_flush(struct intel_gt *gt) return intel_gt_wait_for_idle(gt, MAX_SCHEDULE_TIMEOUT); } =20 -static bool grab_vma(struct i915_vma *vma, struct i915_gem_ww_ctx *ww) +static int grab_vma(struct i915_vma *vma, struct i915_gem_ww_ctx *ww) { + int ret =3D 0; + /* * We add the extra refcount so the object doesn't drop to zero until * after ungrab_vma(), this way trylock is always paired with unlock. */ if (i915_gem_object_get_rcu(vma->obj)) { - if (!i915_gem_object_trylock(vma->obj, ww)) { + ret =3D i915_gem_object_lock(vma->obj, ww); + if (ret) i915_gem_object_put(vma->obj); - return false; - } } else { /* Dead objects don't need pins */ atomic_and(~I915_VMA_PIN_MASK, &vma->flags); } =20 - return true; + return ret; } =20 -static void ungrab_vma(struct i915_vma *vma) +static void ungrab_vma(struct i915_vma *vma, struct i915_gem_ww_ctx *ww) { if (dying_vma(vma)) return; =20 - i915_gem_object_unlock(vma->obj); + if (!ww) + i915_gem_object_unlock(vma->obj); + i915_gem_object_put(vma->obj); } =20 -static bool +static int mark_free(struct drm_mm_scan *scan, struct i915_gem_ww_ctx *ww, struct i915_vma *vma, unsigned int flags, struct list_head *unwind) { + int err; + if (i915_vma_is_pinned(vma)) - return false; + return -ENOSPC; =20 - if (!grab_vma(vma, ww)) - return false; + err =3D grab_vma(vma, ww); + if (err) + return err; =20 list_add(&vma->evict_link, unwind); - return drm_mm_scan_add_block(scan, &vma->node); + if (!drm_mm_scan_add_block(scan, &vma->node)) + return -ENOSPC; + + return 0; } =20 static bool defer_evict(struct i915_vma *vma) @@ -150,6 +159,7 @@ i915_gem_evict_something(struct i915_address_space *vm, enum drm_mm_insert_mode mode; struct i915_vma *active; int ret; + int err =3D 0; =20 lockdep_assert_held(&vm->mutex); trace_i915_gem_evict(vm, min_size, alignment, flags); @@ -210,17 +220,23 @@ i915_gem_evict_something(struct i915_address_space *v= m, continue; } =20 - if (mark_free(&scan, ww, vma, flags, &eviction_list)) + err =3D mark_free(&scan, ww, vma, flags, &eviction_list); + if (!err) goto found; + if (err =3D=3D -EDEADLK) + break; } =20 /* Nothing found, clean up and bail out! */ list_for_each_entry_safe(vma, next, &eviction_list, evict_link) { ret =3D drm_mm_scan_remove_block(&scan, &vma->node); BUG_ON(ret); - ungrab_vma(vma); + ungrab_vma(vma, ww); } =20 + if (err =3D=3D -EDEADLK) + return err; + /* * Can we unpin some objects such as idle hw contents, * or pending flips? But since only the GGTT has global entries @@ -267,7 +283,7 @@ i915_gem_evict_something(struct i915_address_space *vm, __i915_vma_pin(vma); } else { list_del(&vma->evict_link); - ungrab_vma(vma); + ungrab_vma(vma, ww); } } =20 @@ -277,17 +293,21 @@ i915_gem_evict_something(struct i915_address_space *v= m, __i915_vma_unpin(vma); if (ret =3D=3D 0) ret =3D __i915_vma_unbind(vma); - ungrab_vma(vma); + ungrab_vma(vma, ww); } =20 while (ret =3D=3D 0 && (node =3D drm_mm_scan_color_evict(&scan))) { vma =3D container_of(node, struct i915_vma, node); =20 /* If we find any non-objects (!vma), we cannot evict them */ - if (vma->node.color !=3D I915_COLOR_UNEVICTABLE && - grab_vma(vma, ww)) { - ret =3D __i915_vma_unbind(vma); - ungrab_vma(vma); + if (vma->node.color !=3D I915_COLOR_UNEVICTABLE) { + ret =3D grab_vma(vma, ww); + if (!ret) { + ret =3D __i915_vma_unbind(vma); + ungrab_vma(vma, ww); + } else if (ret !=3D -EDEADLK) { + ret =3D -ENOSPC; + } } else { ret =3D -ENOSPC; } @@ -382,8 +402,11 @@ int i915_gem_evict_for_node(struct i915_address_space = *vm, break; } =20 - if (!grab_vma(vma, ww)) { - ret =3D -ENOSPC; + ret =3D grab_vma(vma, ww); + if (ret) { + if (ret !=3D -EDEADLK) + ret =3D -ENOSPC; + break; } =20 @@ -405,7 +428,7 @@ int i915_gem_evict_for_node(struct i915_address_space *= vm, if (ret =3D=3D 0) ret =3D __i915_vma_unbind(vma); =20 - ungrab_vma(vma); + ungrab_vma(vma, ww); } =20 return ret; --=20 2.37.1