From nobody Fri Oct 3 16:46:05 2025 Received: from mail-wm1-f74.google.com (mail-wm1-f74.google.com [209.85.128.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 031E3352FE6 for ; Wed, 27 Aug 2025 13:38:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756301931; cv=none; b=b5Iu9Xy6UpsTzlM5qoeu3Xq0zTZtI+tphNENBgcCzvatgShB7tsEH29jT3COjCSE1GRqDnS43ZcXszpjSDHgP9mHVPmTmCQVm5dTDTyMpjXbtpH5cPw2g9+PgtmVdOkjqNKNBD1aN8xu+SkxW3dysnB4NhXUYhGvQebSpuiEFnY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756301931; c=relaxed/simple; bh=KwFYll6+s4nlGHPxUp1+qnAKQ5iyOSPmtnFxynZNuFE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=I0kaZLJ1pZy5NYYddF8LJi+6c7ehObjBdovs8TDsk2jT40Q9fpoDsQGv0MQFEN5uGkNScTQjHWxAfkyfp/ZQktoPaoLY4rsSBHjHX2MuhtPH9Y40ub8DFdQgBoeL83pYZLB0WpIiVDmuNzBWgx9F5CMjbgmN1v5+mNbfaxd/0Gw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--aliceryhl.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=B2NA3t2J; arc=none smtp.client-ip=209.85.128.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--aliceryhl.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="B2NA3t2J" Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-45a1b05d8d0so48033495e9.1 for ; Wed, 27 Aug 2025 06:38:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1756301928; x=1756906728; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=bQfNPALqYK2vuHk+KHixItNQWnKvg0esLykXcwvhImI=; b=B2NA3t2JgcGh3ZF1ImF0Cq/buQFMLtsJ2zx4Mz2Xmdq2Ajhkiul4uHu7GQqaZ+Dl+K sVucPuEE5HaBCMkoRU3lkpTahvzLu2WwLAAlVFmnwOiJ2L+ZOT+YP+hZkacFXII2VU0X 3ANBJiPLJNmCXm1XUH/R57mUpQvqHfY/BigH1do4hfb/c+BqM5tiJnEUWwrYrjxkKfxI dMJyPbj1lnQcNB2q5xgdHxKBn5V1Df8QdiFKHpwIm5Buy76RIcw/yq8iNWbvBnrgaRMK 7bLWmYkNjJBDq4i/cKrWlBNdKBpKiZIZNVHqVEdEljiDl9ynpu6z68WluUTJeI55xiUb ppng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756301928; x=1756906728; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=bQfNPALqYK2vuHk+KHixItNQWnKvg0esLykXcwvhImI=; b=mM7vLlzWuB2mj2UoNnvyyUg/n6H8C9/iLUp2h69sgni/Mn5cnWuMjLfqL/TV7q3CQO EiPLkp6JjK9vOAQAhRxRUY8ypotGlg0mYCtuEBPscocy0ZJkv07PI6DhNOygakrLEgVA Jj5daKF4cQi3C1z86VlWiFpNCUzdKBb05ZfoCI4x6BVpfN+wvz5JGUXkSut/UAiPTlV4 7DDFNYTMqWiXUULvi4nvF/CEAS+qlK107lsrbODGv7HnA1DbLc5yvbCVH7lmrAvZEPKk YeZpq7LRD8v46qDvh1jr63u9XfDdfmNPxPmPwFuiMns9rNawsld1vbRSGHL7PP4YMVJA hWQw== X-Forwarded-Encrypted: i=1; AJvYcCWW3Bjzh6at3tn9UmoANjEBDZPKvZVxbcgRLDoJfxV7AKtznemF/VyR4qSAVAgcE4iTelu4VoGSPfae0Jc=@vger.kernel.org X-Gm-Message-State: AOJu0YxOWqnd0kTTE7RzkBQtfjjHMiBEMYiZ3fPdIpfyqQXNdA87gk/7 4Flo4UO2MuSWoFmDTGifaHlQDx3K1sZi6LdNaovmQaRwpVTuZQQLPHXHKq1kkbMtox2LroxHh1k Ii6as4oDrqAZ5Cd9WOg== X-Google-Smtp-Source: AGHT+IFPZWyvgMauxlJCBZKG51BQuD0rK7uUxpmPXaWTo5px4hek1IeITTzy5FZDFZFtg2EjVIQLfDcGnZLxnBQ= X-Received: from wmnj6.prod.google.com ([2002:a05:600c:746:b0:45b:7243:7e17]) (user=aliceryhl job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:3b93:b0:459:d780:3604 with SMTP id 5b1f17b1804b1-45b75d6049dmr1493745e9.3.1756301928171; Wed, 27 Aug 2025 06:38:48 -0700 (PDT) Date: Wed, 27 Aug 2025 13:38:37 +0000 In-Reply-To: <20250827-gpuva-mutex-in-gem-v3-0-bd89f5a82c0d@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250827-gpuva-mutex-in-gem-v3-0-bd89f5a82c0d@google.com> X-Developer-Key: i=aliceryhl@google.com; a=openpgp; fpr=49F6C1FAA74960F43A5B86A1EE7A392FDE96209F X-Developer-Signature: v=1; a=openpgp-sha256; l=4138; i=aliceryhl@google.com; h=from:subject:message-id; bh=KwFYll6+s4nlGHPxUp1+qnAKQ5iyOSPmtnFxynZNuFE=; b=owEBbQKS/ZANAwAKAQRYvu5YxjlGAcsmYgBorwplavqOFRjfJ447BgNpHjo5GjbzOko8NDcjI d/+jyDq8cGJAjMEAAEKAB0WIQSDkqKUTWQHCvFIvbIEWL7uWMY5RgUCaK8KZQAKCRAEWL7uWMY5 Rn15D/4zkmBMFMYN9f5D+2qu/UJz9DT56FDBe3we7NrQJKXSuwUTQUHFM1tv5Y3Pqrblw9eg5ZE U1pWxrWMVemYlF6yGvoddGUjFyOxrj8pMPk2vcsHX+F3DoiW12+Ld+s1eXpdj5KgbLcrMVQsvVU E/Ny8EUKE7BCyT60NveKnu9DyrPFhXJpjOQ384isZJaOzboz07gXy6WYkctg0lniNhjQN1eMyGY zA8KK1WNI5dDeuc1M6C497NoKEtGW+DXpG+KtK9LM/S/NJRjwW9hiGtHXtOs/nRKWSbrI+tV6lK SCfb3cgqSdNz4Wo/bdSAFY2u5mr5EYCZKj3FUvKOLiDTCwprdzRX6QwXwVs+pC6xb0S/lmv2jG1 IjDVdjYmSiz9kna2EvWy//9iCciKF9J0t4FK/wED5QHhvOB4kzerg646JonH4ehsKzDNHk1uOhb xayI8vCoeYFHzwFcWwnHwlRbw3lUwd9tFzsdBgw8xOtdw9G8pKcWXFAqwon7YArrPUQRg9qgCbq FcR1MEh6ELJXo85P/JMIsF8NWAK2E+bRaMZDRSarZtTrie6ulS4h9Gn7mq9XDXz1Jf4QjLIwsb/ zQhybh4eEiHCYo9dRoeOUFLaTdJ5ZItfXH2aGB7/qITwCXI9O/QyviGsZUZ2purEpx26JNovAkG MW9kxFiag2/Uq8g== X-Mailer: b4 0.14.2 Message-ID: <20250827-gpuva-mutex-in-gem-v3-1-bd89f5a82c0d@google.com> Subject: [PATCH v3 1/3] drm_gem: add mutex to drm_gem_object.gpuva From: Alice Ryhl To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Danilo Krummrich , Boris Brezillon , Daniel Almeida , Steven Price , Liviu Dudau , Rob Clark , Rob Herring Cc: Miguel Ojeda , Boqun Feng , Gary Guo , "=?utf-8?q?Bj=C3=B6rn_Roy_Baron?=" , Benno Lossin , Andreas Hindborg , Trevor Gross , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, Alice Ryhl Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable There are two main ways that GPUVM might be used: * staged mode, where VM_BIND ioctls update the GPUVM immediately so that the GPUVM reflects the state of the VM *including* staged changes that are not yet applied to the GPU's virtual address space. * immediate mode, where the GPUVM state is updated during run_job(), i.e., in the DMA fence signalling critical path, to ensure that the GPUVM and the GPU's virtual address space has the same state at all times. Currently, only Panthor uses GPUVM in immediate mode, but the Rust drivers Tyr and Nova will also use GPUVM in immediate mode, so it is worth to support both staged and immediate mode well in GPUVM. To use immediate mode, the GEMs gpuva list must be modified during the fence signalling path, which means that it must be protected by a lock that is fence signalling safe. For this reason, a mutex is added to struct drm_gem_object that is intended to achieve this purpose. Adding it directly in the GEM object both makes it easier to use GPUVM in immediate mode, but also makes it possible to take the gpuva lock from core drm code. As a follow-up, another change that should probably be made to support immediate mode is a mechanism to postpone cleanup of vm_bo objects, as dropping a vm_bo object in the fence signalling path is problematic for two reasons: * When using DRM_GPUVM_RESV_PROTECTED, you cannot remove the vm_bo from the extobj/evicted lists during the fence signalling path. * Dropping a vm_bo could lead to the GEM object getting destroyed. The requirement that GEM object cleanup is fence signalling safe is dubious and likely to be violated in practice. Panthor already has its own custom implementation of postponing vm_bo cleanup. Reviewed-by: Boris Brezillon Signed-off-by: Alice Ryhl --- drivers/gpu/drm/drm_gem.c | 2 ++ include/drm/drm_gem.h | 24 ++++++++++++++++++------ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index 4a89b6acb6af39720451ac24033b89e144d282dc..8d25cc65707d5b44d931beb0207= c9d08a3e2de5a 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c @@ -187,6 +187,7 @@ void drm_gem_private_object_init(struct drm_device *dev, kref_init(&obj->refcount); obj->handle_count =3D 0; obj->size =3D size; + mutex_init(&obj->gpuva.lock); dma_resv_init(&obj->_resv); if (!obj->resv) obj->resv =3D &obj->_resv; @@ -210,6 +211,7 @@ void drm_gem_private_object_fini(struct drm_gem_object = *obj) WARN_ON(obj->dma_buf); =20 dma_resv_fini(&obj->_resv); + mutex_destroy(&obj->gpuva.lock); } EXPORT_SYMBOL(drm_gem_private_object_fini); =20 diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h index d3a7b43e2c637b164eba5af7cc2fc8ef09d4f0a4..a995c0c1b63c5946b1659cec08c= 360a5bb9e9fba 100644 --- a/include/drm/drm_gem.h +++ b/include/drm/drm_gem.h @@ -398,16 +398,28 @@ struct drm_gem_object { struct dma_resv _resv; =20 /** - * @gpuva: - * - * Provides the list of GPU VAs attached to this GEM object. - * - * Drivers should lock list accesses with the GEMs &dma_resv lock - * (&drm_gem_object.resv) or a custom lock if one is provided. + * @gpuva: Fields used by GPUVM to manage mappings pointing to this GEM o= bject. */ struct { + /** + * @gpuva.list: list of GPUVM mappings attached to this GEM object. + * + * Drivers should lock list accesses with either the GEMs + * &dma_resv lock (&drm_gem_object.resv) or the + * &drm_gem_object.gpuva.lock mutex. + */ struct list_head list; =20 + /** + * @gpuva.lock: lock protecting access to &drm_gem_object.gpuva.list + * when the resv lock can't be used. + * + * Should only be used when the VM is being modified in a fence + * signalling path, otherwise you should use &drm_gem_object.resv to + * protect accesses to &drm_gem_object.gpuva.list. + */ + struct mutex lock; + #ifdef CONFIG_LOCKDEP struct lockdep_map *lock_dep_map; #endif --=20 2.51.0.261.g7ce5a0a67e-goog From nobody Fri Oct 3 16:46:05 2025 Received: from mail-wr1-f74.google.com (mail-wr1-f74.google.com [209.85.221.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0C5A33568EF for ; Wed, 27 Aug 2025 13:38:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756301933; cv=none; b=ilzlNDi8Yt3jkHnUUlGm7jfgZ+ms5vVZ0yu7gIzBGdAhkuzT4WYNzlTNbeBhs9d63ZLdccj0lWLdit1sB3OP2tZ/evOST8+4QT2v6A7WNWgGzIDzcMaMd6ZOYrnXLMia87Mgz3xF1vo0+rSkVsyNDp3zFc/39v0jelpxkqp+IOo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756301933; c=relaxed/simple; bh=fxqCLepdjJoG2i/XMA26WTvgMhHanXo5UFmP/6SmsUc=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=C+aIledu2sqncLQSDALwSSgvz8IF4l61MMdYs5iCtOfuVQ39TKrKp8ZfdLl5sHmu5T+uImiytxE3+A+JVE/VGiu+ojad84uioAdHhTzFaSshM3Ruc5ClhlbfGhG+A5UIrjl+S36hgsMcvjrkiNOg/6DlJOPqnUYf7KgV+39rJvA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--aliceryhl.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=PndUlE39; arc=none smtp.client-ip=209.85.221.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--aliceryhl.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="PndUlE39" Received: by mail-wr1-f74.google.com with SMTP id ffacd0b85a97d-3c79f0a6084so1617292f8f.0 for ; Wed, 27 Aug 2025 06:38:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1756301929; x=1756906729; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=H0LUjaJNCERfnIpEXLt7qPeqC8Z8QMcmQ0x5DWubTsE=; b=PndUlE39BLn0MR5UT41jXfhA6+YitDW++i5WOOxAM6KgHELU1ZuRJCd9pqIe0sxhaj 630gRgde0uylLNirJ17TvB0oNWkNX7PvwEVGRIkQVzduKG8GOlyf3d4UB6ljf0gP2+/4 Av3l3HciBt28EomslByC0u8j0qIvN9sg9iEXrYzJ+XFTj36EZAOhYWRozyRqNWe7dwAX 7RdZMzZVkehmFxqDzP2tPh6h2c9pdnEj90VtkI1VVY4H/aPFDzwcb4SN0jS5ts/LGLSQ 2F5R4pIXf5KaiKEVdejkgYBLeRHgbBcK0UjJS5EZ8u19Nn0wXdLNBQ9Colni0Zfvxg1c Cmhw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756301929; x=1756906729; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=H0LUjaJNCERfnIpEXLt7qPeqC8Z8QMcmQ0x5DWubTsE=; b=UUEmw/fsv8DPDTFQcQ+JHEiFOhrPO4hKfuicEj5hDlRDMR7uGSjIm2ecIJdgy9dB7k uxcUjz7wIbtJS37omDhlfAWxo5+pm2cxAxJgpcHNuPTtbm4HBpYVBpjBM0KvXhvbFgik +VAXR2ZPk+OvXRkXd+QurURB1VbACwK6HF8dR6uSbSwrYwX0Xq9B1oGhM8nH/JNXbXbx WH5jd2sur2U42hWR8AZRLT/yvTNw4SxQPoV4SCq6JrotFpXGLO1A0+TtEOFivzROHYdB cwIEB/mkk0fakCRo3DmY2But0TTsACt4dbYCnnwYAt6bN2AAnkE8LMHktawNnOgw+8CK Wq9w== X-Forwarded-Encrypted: i=1; AJvYcCXYrvNFGXEhr5cknBJcg9Kz63VhPSAOb4aH6vtobmZNUsOUAQfQwL6alUcy++g/nDMNVVGw6YkOijwMTjc=@vger.kernel.org X-Gm-Message-State: AOJu0YyPz6ZTEjCfIk2AHpXFRLJWkW13EYdOB2pp0COWxK7CZ6q1ct1t YApGrRUdtQIISVyqlJ2EfYo3gL4JLp/suMFEdGYuRpNI6Hk7lg/NJ3pEq95CD4DBJMkhDvEFb7a J3p73kZoGHNMMBQJ0Rw== X-Google-Smtp-Source: AGHT+IGVa7PVy7PXjMz+41KLvLfZ57z1pdtrUqa1nAKHnMHdUPl5XgMWkTXVPv1ZKDQNau4tVBq+F8KPCgsVFPo= X-Received: from wrsa14.prod.google.com ([2002:adf:face:0:b0:3bb:8d5d:f554]) (user=aliceryhl job=prod-delivery.src-stubby-dispatcher) by 2002:adf:f249:0:b0:3cd:4936:7222 with SMTP id ffacd0b85a97d-3cd49367a57mr844329f8f.32.1756301929456; Wed, 27 Aug 2025 06:38:49 -0700 (PDT) Date: Wed, 27 Aug 2025 13:38:38 +0000 In-Reply-To: <20250827-gpuva-mutex-in-gem-v3-0-bd89f5a82c0d@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250827-gpuva-mutex-in-gem-v3-0-bd89f5a82c0d@google.com> X-Developer-Key: i=aliceryhl@google.com; a=openpgp; fpr=49F6C1FAA74960F43A5B86A1EE7A392FDE96209F X-Developer-Signature: v=1; a=openpgp-sha256; l=4667; i=aliceryhl@google.com; h=from:subject:message-id; bh=fxqCLepdjJoG2i/XMA26WTvgMhHanXo5UFmP/6SmsUc=; b=owEBbQKS/ZANAwAKAQRYvu5YxjlGAcsmYgBorwplBwqLgr6P1T9aVSwRfXFaYBCf/imiAkWRB GK0A7i8iw+JAjMEAAEKAB0WIQSDkqKUTWQHCvFIvbIEWL7uWMY5RgUCaK8KZQAKCRAEWL7uWMY5 Rj52D/wLX0TgtsFem9qRKwgampx8gBAoARjToXXgEsXq4iETGWCHsmsHkLXw15V6qgAz8heVyjb gQA417sWwug0le+2dg/dYL5wpWsEFZfC0xAQuWW0LBORi9EWfww3IFU5Ek3R6Z3FME/7cqcJr0P ecKJbLGlOeDS4+OrMkfgNsOOzQbXoJuojnlWn2aMDbOnSV2TZvIbZzEn2dbtpVHh2uI+u0+8WvL 4Nq+GwThibopA8/vsa1W64m03ys0skYBrhRk/z/F4RIDQaWigH8N8NaA9yEG0zQTaqi2sADSgYI ktfDbR8tikcbRyPG7IO+nQHtRpxSh5avxWYxfX8nmaPCMyGT/MW8ptpNZZ/YTS2PGPuCnwt/pco 02tgrWzHzZaf/6SDLjexaadzjgzyrPqRp1YIcaf73NOL+oAnx0PiQa932dn3aK9uJzrjGm221di AZjWf6KajMziBCDDb+OhyhLtHCvHdQoMxs2V10I3NdvM78EosQoQieMMs7UYsrjStlVF7PoM7zg 6A/QfckmicXhdRxmj1k9Z1porMrNMq7W/RHkV0Hrz1xgwCeexTww+OavJUZkHHFpn/nV074vFRK s3RWXt6MknVJc+YWFwK5/qJBQlQd129OOlAHBoiupO01wH+25GCYe83ihVJGn04NjJX6AQZSDeW TEUQbFa9rodBQiw== X-Mailer: b4 0.14.2 Message-ID: <20250827-gpuva-mutex-in-gem-v3-2-bd89f5a82c0d@google.com> Subject: [PATCH v3 2/3] panthor: use drm_gem_object.gpuva.lock instead of gpuva_list_lock From: Alice Ryhl To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Danilo Krummrich , Boris Brezillon , Daniel Almeida , Steven Price , Liviu Dudau , Rob Clark , Rob Herring Cc: Miguel Ojeda , Boqun Feng , Gary Guo , "=?utf-8?q?Bj=C3=B6rn_Roy_Baron?=" , Benno Lossin , Andreas Hindborg , Trevor Gross , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, Alice Ryhl Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Now that drm_gem_object has a dedicated mutex for the gpuva list that is intended to be used in cases that must be fence signalling safe, use it in Panthor. Reviewed-by: Boris Brezillon Signed-off-by: Alice Ryhl --- drivers/gpu/drm/panthor/panthor_gem.c | 4 +--- drivers/gpu/drm/panthor/panthor_gem.h | 12 ------------ drivers/gpu/drm/panthor/panthor_mmu.c | 16 ++++++++-------- 3 files changed, 9 insertions(+), 23 deletions(-) diff --git a/drivers/gpu/drm/panthor/panthor_gem.c b/drivers/gpu/drm/pantho= r/panthor_gem.c index a123bc740ba1460f96882206f598b148b64dc5f6..c654a3377903cf7e067becdb481= fb14895a4eaa5 100644 --- a/drivers/gpu/drm/panthor/panthor_gem.c +++ b/drivers/gpu/drm/panthor/panthor_gem.c @@ -74,7 +74,6 @@ static void panthor_gem_free_object(struct drm_gem_object= *obj) mutex_destroy(&bo->label.lock); =20 drm_gem_free_mmap_offset(&bo->base.base); - mutex_destroy(&bo->gpuva_list_lock); drm_gem_shmem_free(&bo->base); drm_gem_object_put(vm_root_gem); } @@ -246,8 +245,7 @@ struct drm_gem_object *panthor_gem_create_object(struct= drm_device *ddev, size_t =20 obj->base.base.funcs =3D &panthor_gem_funcs; obj->base.map_wc =3D !ptdev->coherent; - mutex_init(&obj->gpuva_list_lock); - drm_gem_gpuva_set_lock(&obj->base.base, &obj->gpuva_list_lock); + drm_gem_gpuva_set_lock(&obj->base.base, &obj->base.base.gpuva.lock); mutex_init(&obj->label.lock); =20 panthor_gem_debugfs_bo_init(obj); diff --git a/drivers/gpu/drm/panthor/panthor_gem.h b/drivers/gpu/drm/pantho= r/panthor_gem.h index 8fc7215e9b900ed162e03aebeae999fda00eeb7a..80c6e24112d0bd0f1561ae4d222= 4842afb735a59 100644 --- a/drivers/gpu/drm/panthor/panthor_gem.h +++ b/drivers/gpu/drm/panthor/panthor_gem.h @@ -79,18 +79,6 @@ struct panthor_gem_object { */ struct drm_gem_object *exclusive_vm_root_gem; =20 - /** - * @gpuva_list_lock: Custom GPUVA lock. - * - * Used to protect insertion of drm_gpuva elements to the - * drm_gem_object.gpuva.list list. - * - * We can't use the GEM resv for that, because drm_gpuva_link() is - * called in a dma-signaling path, where we're not allowed to take - * resv locks. - */ - struct mutex gpuva_list_lock; - /** @flags: Combination of drm_panthor_bo_flags flags. */ u32 flags; =20 diff --git a/drivers/gpu/drm/panthor/panthor_mmu.c b/drivers/gpu/drm/pantho= r/panthor_mmu.c index 2003b91a84097d419484c284c2d6241a82b5cde2..2881942ab5115686803fb9d9036= bc059d56b7fa3 100644 --- a/drivers/gpu/drm/panthor/panthor_mmu.c +++ b/drivers/gpu/drm/panthor/panthor_mmu.c @@ -1107,9 +1107,9 @@ static void panthor_vm_bo_put(struct drm_gpuvm_bo *vm= _bo) * GEM vm_bo list. */ dma_resv_lock(drm_gpuvm_resv(vm), NULL); - mutex_lock(&bo->gpuva_list_lock); + mutex_lock(&bo->base.base.gpuva.lock); unpin =3D drm_gpuvm_bo_put(vm_bo); - mutex_unlock(&bo->gpuva_list_lock); + mutex_unlock(&bo->base.base.gpuva.lock); dma_resv_unlock(drm_gpuvm_resv(vm)); =20 /* If the vm_bo object was destroyed, release the pin reference that @@ -1282,9 +1282,9 @@ static int panthor_vm_prepare_map_op_ctx(struct panth= or_vm_op_ctx *op_ctx, * calling this function. */ dma_resv_lock(panthor_vm_resv(vm), NULL); - mutex_lock(&bo->gpuva_list_lock); + mutex_lock(&bo->base.base.gpuva.lock); op_ctx->map.vm_bo =3D drm_gpuvm_bo_obtain_prealloc(preallocated_vm_bo); - mutex_unlock(&bo->gpuva_list_lock); + mutex_unlock(&bo->base.base.gpuva.lock); dma_resv_unlock(panthor_vm_resv(vm)); =20 /* If the a vm_bo for this combination exists, it already @@ -2036,10 +2036,10 @@ static void panthor_vma_link(struct panthor_vm *vm, { struct panthor_gem_object *bo =3D to_panthor_bo(vma->base.gem.obj); =20 - mutex_lock(&bo->gpuva_list_lock); + mutex_lock(&bo->base.base.gpuva.lock); drm_gpuva_link(&vma->base, vm_bo); drm_WARN_ON(&vm->ptdev->base, drm_gpuvm_bo_put(vm_bo)); - mutex_unlock(&bo->gpuva_list_lock); + mutex_unlock(&bo->base.base.gpuva.lock); } =20 static void panthor_vma_unlink(struct panthor_vm *vm, @@ -2048,9 +2048,9 @@ static void panthor_vma_unlink(struct panthor_vm *vm, struct panthor_gem_object *bo =3D to_panthor_bo(vma->base.gem.obj); struct drm_gpuvm_bo *vm_bo =3D drm_gpuvm_bo_get(vma->base.vm_bo); =20 - mutex_lock(&bo->gpuva_list_lock); + mutex_lock(&bo->base.base.gpuva.lock); drm_gpuva_unlink(&vma->base); - mutex_unlock(&bo->gpuva_list_lock); + mutex_unlock(&bo->base.base.gpuva.lock); =20 /* drm_gpuva_unlink() release the vm_bo, but we manually retained it * when entering this function, so we can implement deferred VMA --=20 2.51.0.261.g7ce5a0a67e-goog From nobody Fri Oct 3 16:46:05 2025 Received: from mail-wm1-f73.google.com (mail-wm1-f73.google.com [209.85.128.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A9311356900 for ; Wed, 27 Aug 2025 13:38:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756301935; cv=none; b=J7jOw/jBA+00fu7/mtNvvMqNxnWubz5FiOdClKDp+3Zl5sglHtoYPowct8AlxXN0Sh2uZ/K9DbBA9a2QAfDlubsHW3qEnzNYChkb7el7VyeOHlUxT1luyUjjaJQn2GIwlxzWN5lhSmjtwqh/v5O8OGcnAGxdholIUkEPmGAMX+c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756301935; c=relaxed/simple; bh=0L5MN7VLrW13EBhcSJi1X2pbD/XrBvsXZWa3W9t+9eA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=KjoaHgcyFnN8zZ8UXW6MA9kMu6d3tt+fkZF0bqH2v3040VQCL/8xmlKMt6kzGjCka+vc9GcFAr8sTjK1z31ztKPeyE05S99XAzyjBGQOrbNmc1GvfvoXb7emlqRhTAuwni9CAjeKKa11BocAb8BPf81puokgNhgFztD3IZL0eHA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--aliceryhl.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=OkKj6aAB; arc=none smtp.client-ip=209.85.128.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--aliceryhl.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="OkKj6aAB" Received: by mail-wm1-f73.google.com with SMTP id 5b1f17b1804b1-45a1b0cfbafso43120485e9.2 for ; Wed, 27 Aug 2025 06:38:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1756301931; x=1756906731; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=5NR1f1V0qJQoAZC32JpbQQDn0jnSX+Eb3gQ3cjs7iX0=; b=OkKj6aAB029wP8lPWo79mlb2JyBH5hQyxQBSf19s2XKJ4bshaEbol4TVRYBMO1AYFY d7SGkk5EbgQXKTaqxdJbER9yPt3RDThzgqFz+Bu2sRDbC1w4CiVrGLu2UK1RsVT9yQZc TThZUqyMm1Bix43v0T65Mcpy1MI8tjE6W7A59FTDxBgT09+bocQFlganGzjz/XGc+dox oZd+uk7l0LFJ0DqReq8oENPK0WzoH1wLNpsOZXxUJ74+UcU02CbsmyEW0B5wqu+aj32C kr6iWcEVzJP9scn5S2M7vnMM40BB+chCI1/0lls1c2WQ171+a8yZSYMeWtAAaml7jrFb 9Gxw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756301931; x=1756906731; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=5NR1f1V0qJQoAZC32JpbQQDn0jnSX+Eb3gQ3cjs7iX0=; b=iRVglIxLNodPQtUJEYnYYjMbRrYLrdvvY9B2JDVsxiI+XVItzI6OvhriDPH0RYaZlp AmttuCcFRqpCszuMDtJKQlywxhKQXQ9lU+QcFnCAJOAozhSvD98WK8x6YxuGZ1bBeJ2s jRaTAICefOPnTZKekJH2K+HpZSclcPtUV5hWrqMt2vDegZdf1ihyryFNStkpM6EjsoVr n4g2HZwTvbfpncE6dcs4S76pokxW/rZc6m/HLH3cIPDSUJ2PybXIaQHenu44lNxubOFe ev/IzbCNUyal0tdpG6FqFeMYZe9lO7zhPtMGE46CdQGqk4bQvVe1si0M4Uzvd/kU3hyS ci0w== X-Forwarded-Encrypted: i=1; AJvYcCU1u8pSB7+w+b3yCQWWnFZCwTfUsZaXPWEFlUVfb4x98qCVWMJZr4QlGgfCEPpw2qNNI5vSQl3v91JCnO0=@vger.kernel.org X-Gm-Message-State: AOJu0YxURjq6pq01fvNfP6oJK7Z452kjouFNCnguDaKg2Ss5ZmH3RDU1 qKT8QIzrPtwtpnALuomHa5q3285H4aGLPqze8eN2jrQxTdfx63B21rtk0NzVAE19UW8RZDK+gJO OoQc+6yiF9FttVJZ70A== X-Google-Smtp-Source: AGHT+IFafGlP8UFqOxDnT4Yuf1Es+Hvy3FyMKmTpfS06X1hgk36wVUBbP6/S61siqr7xDliXKPIBZu+fKI/tOkQ= X-Received: from wmbea5.prod.google.com ([2002:a05:600c:6745:b0:45b:4777:8063]) (user=aliceryhl job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:3b23:b0:45b:47e1:f600 with SMTP id 5b1f17b1804b1-45b517dc59bmr170516715e9.36.1756301930996; Wed, 27 Aug 2025 06:38:50 -0700 (PDT) Date: Wed, 27 Aug 2025 13:38:39 +0000 In-Reply-To: <20250827-gpuva-mutex-in-gem-v3-0-bd89f5a82c0d@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250827-gpuva-mutex-in-gem-v3-0-bd89f5a82c0d@google.com> X-Developer-Key: i=aliceryhl@google.com; a=openpgp; fpr=49F6C1FAA74960F43A5B86A1EE7A392FDE96209F X-Developer-Signature: v=1; a=openpgp-sha256; l=12017; i=aliceryhl@google.com; h=from:subject:message-id; bh=0L5MN7VLrW13EBhcSJi1X2pbD/XrBvsXZWa3W9t+9eA=; b=owEBbQKS/ZANAwAKAQRYvu5YxjlGAcsmYgBorwplYbAcdiliRpBBT2QIxKVqMqUGR0RUIpvla 8hVDTugYNSJAjMEAAEKAB0WIQSDkqKUTWQHCvFIvbIEWL7uWMY5RgUCaK8KZQAKCRAEWL7uWMY5 Rqr4D/9MGT4tqnMGQjdUfHmVfVdREPNuTUPIZSoetgv8+tMy2zoPRVzB7MC+qiaH14b6g8rWz8p lTm7bPzCsw8/PEq+VQtQPhUnQEiOelg50xefigjWY6PC1+NPKSqZSXLJ9wIRxGJWZ3xes0yHe6F u9fJjBYyE1SSpC3ZrCaxsRyVVRis3+mW+LqbdeCdHZ1EV4hdOOMLfbhcHyFdEOkvWrF2LAyfzok bkz1SqJ3gCNl01D0mhidXbRtMjXURqR/4OVxHh4weI+dH1eR3+X7dYyD2B/XZDOnnfjpwKj26eA 4sJXLTwd/NhzAd7UO/9zNv20ijg6c5X7ristIWhOfznBYbFB+TKCbh5YAv5gbxg411vWDv4f8Vg Gg2ZAVodpk6+uQgzjoUWd3ttXxdcdhxI7zFSzf7nG0cXBNQfFcNwEfnv2SgLvGi7nI9hzYR2t4a sVseb6Ds8zSenQBX1YEvD4T7m2TbiZaVrJB+kOo0k0oE8XC2PbGKkU3C+4Lxe8eqH0tFGIWqStl VfhiIVYZQ7KeNzf1Ad0nKmoBRuMnN6R5016QsboI4NIlHYRvjOHezZ+fkrs7umQj2OV4RlpEtQ8 DY5+EfJRbURVze+UTXwAHn8L4qziXGIo8dvX9hL3UlW8dkRM2iGEfnR/GdqO+nMW10H66Ymaq+k u/RowLSTFcUbIUA== X-Mailer: b4 0.14.2 Message-ID: <20250827-gpuva-mutex-in-gem-v3-3-bd89f5a82c0d@google.com> Subject: [PATCH v3 3/3] gpuvm: remove gem.gpuva.lock_dep_map From: Alice Ryhl To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Danilo Krummrich , Boris Brezillon , Daniel Almeida , Steven Price , Liviu Dudau , Rob Clark , Rob Herring Cc: Miguel Ojeda , Boqun Feng , Gary Guo , "=?utf-8?q?Bj=C3=B6rn_Roy_Baron?=" , Benno Lossin , Andreas Hindborg , Trevor Gross , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, Alice Ryhl Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Since all users of gem.gpuva.lock_dep_map now rely on the mutex directly in gpuva, we may remove it. Whether the mutex is used is now tracked by a flag in gpuvm rather than by whether lock_dep_map is null. Note that a GEM object may not be pushed to multiple gpuvms that disagree on the value of this new flag. But that's okay because a single driver should use the same locking scheme everywhere, and a GEM object is driver specific (when a GEM is exported with prime, a new GEM object instance is created from the backing dma-buf). The flag is present even with CONFIG_LOCKDEP=3Dn because the intent is that the flag will also cause vm_bo cleanup to become deferred. However, that will happen in a follow-up patch. Reviewed-by: Boris Brezillon Signed-off-by: Alice Ryhl --- drivers/gpu/drm/drm_gpuvm.c | 30 ++++++++++++------------- drivers/gpu/drm/panthor/panthor_gem.c | 1 - drivers/gpu/drm/panthor/panthor_mmu.c | 5 +++-- include/drm/drm_gem.h | 41 +++++++++++++------------------= ---- include/drm/drm_gpuvm.h | 30 ++++++++++++++++++++++--- 5 files changed, 59 insertions(+), 48 deletions(-) diff --git a/drivers/gpu/drm/drm_gpuvm.c b/drivers/gpu/drm/drm_gpuvm.c index d6bea8a4fffd7613fb9b9ed5c795df373da2e7b6..78a1a4f095095e9379bdf604d58= 3f6c8b9863ccb 100644 --- a/drivers/gpu/drm/drm_gpuvm.c +++ b/drivers/gpu/drm/drm_gpuvm.c @@ -497,8 +497,7 @@ * DRM GPUVM also does not take care of the locking of the backing * &drm_gem_object buffers GPU VA lists and &drm_gpuvm_bo abstractions by * itself; drivers are responsible to enforce mutual exclusion using eithe= r the - * GEMs dma_resv lock or alternatively a driver specific external lock. Fo= r the - * latter see also drm_gem_gpuva_set_lock(). + * GEMs dma_resv lock or the GEMs gpuva.lock mutex. * * However, DRM GPUVM contains lockdep checks to ensure callers of its API= hold * the corresponding lock whenever the &drm_gem_objects GPU VA list is acc= essed @@ -1582,7 +1581,7 @@ drm_gpuvm_bo_destroy(struct kref *kref) drm_gpuvm_bo_list_del(vm_bo, extobj, lock); drm_gpuvm_bo_list_del(vm_bo, evict, lock); =20 - drm_gem_gpuva_assert_lock_held(obj); + drm_gem_gpuva_assert_lock_held(gpuvm, obj); list_del(&vm_bo->list.entry.gem); =20 if (ops && ops->vm_bo_free) @@ -1603,7 +1602,8 @@ drm_gpuvm_bo_destroy(struct kref *kref) * If the reference count drops to zero, the &gpuvm_bo is destroyed, which * includes removing it from the GEMs gpuva list. Hence, if a call to this * function can potentially let the reference count drop to zero the calle= r must - * hold the dma-resv or driver specific GEM gpuva lock. + * hold the lock that the GEM uses for its gpuva list (either the GEM's + * dma-resv or gpuva.lock mutex). * * This function may only be called from non-atomic context. * @@ -1627,7 +1627,7 @@ __drm_gpuvm_bo_find(struct drm_gpuvm *gpuvm, { struct drm_gpuvm_bo *vm_bo; =20 - drm_gem_gpuva_assert_lock_held(obj); + drm_gem_gpuva_assert_lock_held(gpuvm, obj); drm_gem_for_each_gpuvm_bo(vm_bo, obj) if (vm_bo->vm =3D=3D gpuvm) return vm_bo; @@ -1686,7 +1686,7 @@ drm_gpuvm_bo_obtain(struct drm_gpuvm *gpuvm, if (!vm_bo) return ERR_PTR(-ENOMEM); =20 - drm_gem_gpuva_assert_lock_held(obj); + drm_gem_gpuva_assert_lock_held(gpuvm, obj); list_add_tail(&vm_bo->list.entry.gem, &obj->gpuva.list); =20 return vm_bo; @@ -1722,7 +1722,7 @@ drm_gpuvm_bo_obtain_prealloc(struct drm_gpuvm_bo *__v= m_bo) return vm_bo; } =20 - drm_gem_gpuva_assert_lock_held(obj); + drm_gem_gpuva_assert_lock_held(gpuvm, obj); list_add_tail(&__vm_bo->list.entry.gem, &obj->gpuva.list); =20 return __vm_bo; @@ -1894,8 +1894,7 @@ EXPORT_SYMBOL_GPL(drm_gpuva_remove); * reference of the latter is taken. * * This function expects the caller to protect the GEM's GPUVA list against - * concurrent access using either the GEMs dma_resv lock or a driver speci= fic - * lock set through drm_gem_gpuva_set_lock(). + * concurrent access using either the GEM's dma-resv or gpuva.lock mutex. */ void drm_gpuva_link(struct drm_gpuva *va, struct drm_gpuvm_bo *vm_bo) @@ -1910,7 +1909,7 @@ drm_gpuva_link(struct drm_gpuva *va, struct drm_gpuvm= _bo *vm_bo) =20 va->vm_bo =3D drm_gpuvm_bo_get(vm_bo); =20 - drm_gem_gpuva_assert_lock_held(obj); + drm_gem_gpuva_assert_lock_held(gpuvm, obj); list_add_tail(&va->gem.entry, &vm_bo->list.gpuva); } EXPORT_SYMBOL_GPL(drm_gpuva_link); @@ -1930,8 +1929,7 @@ EXPORT_SYMBOL_GPL(drm_gpuva_link); * the latter is dropped. * * This function expects the caller to protect the GEM's GPUVA list against - * concurrent access using either the GEMs dma_resv lock or a driver speci= fic - * lock set through drm_gem_gpuva_set_lock(). + * concurrent access using either the GEM's dma-resv or gpuva.lock mutex. */ void drm_gpuva_unlink(struct drm_gpuva *va) @@ -1942,7 +1940,7 @@ drm_gpuva_unlink(struct drm_gpuva *va) if (unlikely(!obj)) return; =20 - drm_gem_gpuva_assert_lock_held(obj); + drm_gem_gpuva_assert_lock_held(va->vm, obj); list_del_init(&va->gem.entry); =20 va->vm_bo =3D NULL; @@ -2943,8 +2941,8 @@ EXPORT_SYMBOL_GPL(drm_gpuvm_prefetch_ops_create); * After the caller finished processing the returned &drm_gpuva_ops, they = must * be freed with &drm_gpuva_ops_free. * - * It is the callers responsibility to protect the GEMs GPUVA list against - * concurrent access using the GEMs dma_resv lock. + * This function expects the caller to protect the GEM's GPUVA list against + * concurrent access using either the GEM's dma-resv or gpuva.lock mutex. * * Returns: a pointer to the &drm_gpuva_ops on success, an ERR_PTR on fail= ure */ @@ -2956,7 +2954,7 @@ drm_gpuvm_bo_unmap_ops_create(struct drm_gpuvm_bo *vm= _bo) struct drm_gpuva *va; int ret; =20 - drm_gem_gpuva_assert_lock_held(vm_bo->obj); + drm_gem_gpuva_assert_lock_held(vm_bo->vm, vm_bo->obj); =20 ops =3D kzalloc(sizeof(*ops), GFP_KERNEL); if (!ops) diff --git a/drivers/gpu/drm/panthor/panthor_gem.c b/drivers/gpu/drm/pantho= r/panthor_gem.c index c654a3377903cf7e067becdb481fb14895a4eaa5..156c7a0b62a231219645095d601= 2a5b108130bbc 100644 --- a/drivers/gpu/drm/panthor/panthor_gem.c +++ b/drivers/gpu/drm/panthor/panthor_gem.c @@ -245,7 +245,6 @@ struct drm_gem_object *panthor_gem_create_object(struct= drm_device *ddev, size_t =20 obj->base.base.funcs =3D &panthor_gem_funcs; obj->base.map_wc =3D !ptdev->coherent; - drm_gem_gpuva_set_lock(&obj->base.base, &obj->base.base.gpuva.lock); mutex_init(&obj->label.lock); =20 panthor_gem_debugfs_bo_init(obj); diff --git a/drivers/gpu/drm/panthor/panthor_mmu.c b/drivers/gpu/drm/pantho= r/panthor_mmu.c index 2881942ab5115686803fb9d9036bc059d56b7fa3..ee9e94448b76ffd31a97d82a857= fa925c4cf0cb5 100644 --- a/drivers/gpu/drm/panthor/panthor_mmu.c +++ b/drivers/gpu/drm/panthor/panthor_mmu.c @@ -2420,8 +2420,9 @@ panthor_vm_create(struct panthor_device *ptdev, bool = for_mcu, * to be handled the same way user VMAs are. */ drm_gpuvm_init(&vm->base, for_mcu ? "panthor-MCU-VM" : "panthor-GPU-VM", - DRM_GPUVM_RESV_PROTECTED, &ptdev->base, dummy_gem, - min_va, va_range, 0, 0, &panthor_gpuvm_ops); + DRM_GPUVM_RESV_PROTECTED | DRM_GPUVM_IMMEDIATE_MODE, + &ptdev->base, dummy_gem, min_va, va_range, 0, 0, + &panthor_gpuvm_ops); drm_gem_object_put(dummy_gem); return vm; =20 diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h index a995c0c1b63c5946b1659cec08c360a5bb9e9fba..f197ed6b3dfa91b8e44c5fa8cc3= 08c7a09b0fb3b 100644 --- a/include/drm/drm_gem.h +++ b/include/drm/drm_gem.h @@ -399,6 +399,12 @@ struct drm_gem_object { =20 /** * @gpuva: Fields used by GPUVM to manage mappings pointing to this GEM o= bject. + * + * When DRM_GPUVM_IMMEDIATE_MODE is set, this list is protected by the + * mutex. Otherwise, the list is protected by the GEMs &dma_resv lock. + * + * Note that all entries in this list must agree on whether + * DRM_GPUVM_IMMEDIATE_MODE is set. */ struct { /** @@ -412,17 +418,14 @@ struct drm_gem_object { =20 /** * @gpuva.lock: lock protecting access to &drm_gem_object.gpuva.list - * when the resv lock can't be used. + * when DRM_GPUVM_IMMEDIATE_MODE is used. * - * Should only be used when the VM is being modified in a fence - * signalling path, otherwise you should use &drm_gem_object.resv to - * protect accesses to &drm_gem_object.gpuva.list. + * Only used when DRM_GPUVM_IMMEDIATE_MODE is set. It should be + * safe to take this mutex during the fence signalling path, so + * do not allocate memory while holding this lock. Otherwise, + * the &dma_resv lock should be used. */ struct mutex lock; - -#ifdef CONFIG_LOCKDEP - struct lockdep_map *lock_dep_map; -#endif } gpuva; =20 /** @@ -607,26 +610,12 @@ static inline bool drm_gem_is_imported(const struct d= rm_gem_object *obj) } =20 #ifdef CONFIG_LOCKDEP -/** - * drm_gem_gpuva_set_lock() - Set the lock protecting accesses to the gpuv= a list. - * @obj: the &drm_gem_object - * @lock: the lock used to protect the gpuva list. The locking primitive - * must contain a dep_map field. - * - * Call this if you're not proctecting access to the gpuva list with the - * dma-resv lock, but with a custom lock. - */ -#define drm_gem_gpuva_set_lock(obj, lock) \ - if (!WARN((obj)->gpuva.lock_dep_map, \ - "GEM GPUVA lock should be set only once.")) \ - (obj)->gpuva.lock_dep_map =3D &(lock)->dep_map -#define drm_gem_gpuva_assert_lock_held(obj) \ - lockdep_assert((obj)->gpuva.lock_dep_map ? \ - lock_is_held((obj)->gpuva.lock_dep_map) : \ +#define drm_gem_gpuva_assert_lock_held(gpuvm, obj) \ + lockdep_assert(drm_gpuvm_immediate_mode(gpuvm) ? \ + lock_is_held(&(obj)->gpuva.lock.dep_map) : \ dma_resv_held((obj)->resv)) #else -#define drm_gem_gpuva_set_lock(obj, lock) do {} while (0) -#define drm_gem_gpuva_assert_lock_held(obj) do {} while (0) +#define drm_gem_gpuva_assert_lock_held(gpuvm, obj) do {} while (0) #endif =20 /** diff --git a/include/drm/drm_gpuvm.h b/include/drm/drm_gpuvm.h index 4a22b9d848f7b3d5710ca554f5b01556abf95985..727b8f336fad0d853998e4379cb= d374155468e18 100644 --- a/include/drm/drm_gpuvm.h +++ b/include/drm/drm_gpuvm.h @@ -196,10 +196,20 @@ enum drm_gpuvm_flags { */ DRM_GPUVM_RESV_PROTECTED =3D BIT(0), =20 + /** + * @DRM_GPUVM_IMMEDIATE_MODE: use the locking scheme for GEMs designed + * for modifying the GPUVM during the fence signalling path + * + * When set, gpuva.lock is used to protect gpuva.list in all GEM + * objects associated with this GPUVM. Otherwise, the GEMs dma-resv is + * used. + */ + DRM_GPUVM_IMMEDIATE_MODE =3D BIT(1), + /** * @DRM_GPUVM_USERBITS: user defined bits */ - DRM_GPUVM_USERBITS =3D BIT(1), + DRM_GPUVM_USERBITS =3D BIT(2), }; =20 /** @@ -369,6 +379,19 @@ drm_gpuvm_resv_protected(struct drm_gpuvm *gpuvm) return gpuvm->flags & DRM_GPUVM_RESV_PROTECTED; } =20 +/** + * drm_gpuvm_immediate_mode() - indicates whether &DRM_GPUVM_IMMEDIATE_MOD= E is + * set + * @gpuvm: the &drm_gpuvm + * + * Returns: true if &DRM_GPUVM_IMMEDIATE_MODE is set, false otherwise. + */ +static inline bool +drm_gpuvm_immediate_mode(struct drm_gpuvm *gpuvm) +{ + return gpuvm->flags & DRM_GPUVM_IMMEDIATE_MODE; +} + /** * drm_gpuvm_resv() - returns the &drm_gpuvm's &dma_resv * @gpuvm__: the &drm_gpuvm @@ -742,9 +765,10 @@ drm_gpuvm_bo_gem_evict(struct drm_gem_object *obj, boo= l evict) { struct drm_gpuvm_bo *vm_bo; =20 - drm_gem_gpuva_assert_lock_held(obj); - drm_gem_for_each_gpuvm_bo(vm_bo, obj) + drm_gem_for_each_gpuvm_bo(vm_bo, obj) { + drm_gem_gpuva_assert_lock_held(vm_bo->vm, obj); drm_gpuvm_bo_evict(vm_bo, evict); + } } =20 void drm_gpuvm_bo_extobj_add(struct drm_gpuvm_bo *vm_bo); --=20 2.51.0.261.g7ce5a0a67e-goog