From nobody Sat Jun 13 20:56:04 2026 Received: from mail-ed1-f74.google.com (mail-ed1-f74.google.com [209.85.208.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 D2587477992 for ; Tue, 5 May 2026 13:29:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777987797; cv=none; b=GCPj4XJJttHbS+aeZrLkWXVI+iHkCwFs/OVav6FdpoPfDZuohEDb4GyP93KeACDQuRBkkbREyTFESiYv8FBh6IDVKOjWhZKiDOz3Pefz4ZtRIv/U4OS/oO8tcK/vFP1UhZ07wU6djCGKeMyVhIbMpNb5hzzj63qo0s99SH5ZYao= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777987797; c=relaxed/simple; bh=aQO08rGPJzhHvd6//hl71M6W8VT/35kSkZVff4mCPx0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Tkqj7iACAK1TccLaZuDR3KBnB9tCsgQpdRm3DBa8KYAO+PLmsLk+UCvol0qmYWQYQhWWRhXEJn9msXodTfbAtdO0AOmsMISQW5xY7yUdYcU/3eKoAc7v8NA1Ad+ZPlMIDNVY51kgKr0bJabNZdnblvrI4lN1BM4ih2qUjcR8VR8= 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=qAqCDf0d; arc=none smtp.client-ip=209.85.208.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="qAqCDf0d" Received: by mail-ed1-f74.google.com with SMTP id 4fb4d7f45d1cf-6763c34cf60so6399735a12.0 for ; Tue, 05 May 2026 06:29:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1777987793; x=1778592593; 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=CpepGuKXgfvFMmQ+T342/Rhe0BYRQCqXBCcIl4WlfVw=; b=qAqCDf0d0ikix5wF2tuUSdA5O9IErdUYpPm4MfXSY5WK4Ard3k/pHlWtD5qaMAnlc0 92sVmZzEftbx4/Bu2RqeHbtSsNoQK5vWwLaiiGOeYb5PswzW+r8jdFYj0LKBcjP7rInx pwahQrxZpfzH5iRzlzbrHNW3zeOtpIwNXfZ9bRx7xYOf6RIdzhNWzJ76uQ2ew6gG1uJj 2ivdK94npcP5RQySP2Bqr4Xmj4jB93UT5GltIT7AWdWThJqOYzaMtaTJQz2oyVFsEPv7 5+1ax/gFQ4V4PtJaQYyqiZ5SGo+S921gixekW5Xu5SAJci22kSdJx82OCoexmCGRghp/ WWJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777987793; x=1778592593; 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=CpepGuKXgfvFMmQ+T342/Rhe0BYRQCqXBCcIl4WlfVw=; b=hR4guCnsz3F6jbk6CiCpbFd5dLHE8oGQz2CzKgvuGADNoq+UZwni8ib8X63NnA/NJW vjQPApMg8AkpjeEgyWu1y/b4x+N8bVKIT5h/axsULxjj3JHw8UhdktoQIJfQUv1+ZloP jLZ7k8BLWHyHLq842FIaLVxF29VSe3XvrY9R0y2QF4M5cuI3P8fj+g7yAgeMu43/jvq0 lljQZhHBOUJ/DRJGs6sllk5r+s3WA//7DTqnfv4fQBv/w+kkILvq3Jigjd47lG0DXy/f //SLgtllukfaV0fymrgtI3cazoWqbKP2/W60ENzkJvcJWNJfaGeT68G66Ik+fs4eHccm kz0g== X-Forwarded-Encrypted: i=1; AFNElJ+fsg9fCauevag3AwZqoOr38v8YvsSUweXGsXQNv9pKZxJG8xEwegbfP5Y9onoFd1oT/Bpn29qqQD+RR/I=@vger.kernel.org X-Gm-Message-State: AOJu0YzYj/WCBA15mTbD4n7GPGvGhJBNrllLGAIFNo7Pfo6Xvyfyot4i UXzd/af12Nv+TaWKH90/faMO1wz8QWes3SwxP/1AbTxW2pHv3+Wub6kMCFA7IBb43VI9qEbiGDw ZClrM6ujARCsAGIkYuw== X-Received: from edt4.prod.google.com ([2002:a05:6402:4544:b0:674:91ac:5f8d]) (user=aliceryhl job=prod-delivery.src-stubby-dispatcher) by 2002:aa7:d549:0:b0:67c:89f2:ae27 with SMTP id 4fb4d7f45d1cf-67cc392dd47mr1230899a12.9.1777987792212; Tue, 05 May 2026 06:29:52 -0700 (PDT) Date: Tue, 05 May 2026 13:29:36 +0000 In-Reply-To: <20260505-gpuvm-drm-exec-v1-0-958306ded36e@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260505-gpuvm-drm-exec-v1-0-958306ded36e@google.com> X-Developer-Key: i=aliceryhl@google.com; a=openpgp; fpr=49F6C1FAA74960F43A5B86A1EE7A392FDE96209F X-Developer-Signature: v=1; a=openpgp-sha256; l=2384; i=aliceryhl@google.com; h=from:subject:message-id; bh=qNt2YdF4x2/LkeE3v0aanKcghsBitoEfdGwCtuzYJG8=; b=owEBbQKS/ZANAwAKAQRYvu5YxjlGAcsmYgBp+fDN5yfDPclhyo9aW/ZKlIgjXm3Vd+w2m/7ka jLF9JvKgy2JAjMEAAEKAB0WIQSDkqKUTWQHCvFIvbIEWL7uWMY5RgUCafnwzQAKCRAEWL7uWMY5 RtbXD/9h1m28gW+XzDUCixlmkFA9bVKmREih8TMXWDOjzdNd64jBqUuL7J0kBuPnFTOR2e/BQgs 56VQrHNqszkoPsZ55YDJZ9Abk7+3Zv8CTNL/lQG6KSFQDZ9CG3MJ30VTUZq94BBbKVsC/D9tf44 MlMgbxRQWEOyM7YAlzO2nouLO1zVG0lip/j/UFiFbktLb8o16a/eTtikKYhR7zw+fPfprLnqNSR zh+w18CDNl9aL2T+/8ba4NZxvaZ/gFHPMD6jr34ORM/jGHN6P39kUe4iZgqIp93OC527T6+AuhY 6kowv1GJx7/uQ/+T8RfnPCsL2rTWLe+7MXv6CKu+VE7bzSHR1MPi678g+SNAETbk47xGGF5MRbz j6u4Vs9vzeJ4u84Q5f4uN16zzxRx+RV8/clqcOzRCsCXFr0T0EFaSHEQ8xsPu880DSu37lVTX6J Lh2VsMV6fTByQpYSU+8sFQRwhkKu4hVPvSHNaL8hIxtTmHL9ikQ4CDj74y2sGKeWKea0bIaZbSv FwvtauuGjX461Xw7NaS+xQguhgvXvAQWgGCc1fSfwc01LLg+9dU8l9BCNTzxhI2OQ7nhsFAda9v URTWkLpyAspRgQ4unH6xm4eOe7HkCr7tnTEzAvE9K4trHFjVGLOQvTwhGnl7lRuO9nsMiaWoMfG ah5N6vB46gV7/qg== X-Mailer: b4 0.14.3 Message-ID: <20260505-gpuvm-drm-exec-v1-1-958306ded36e@google.com> Subject: [PATCH 1/2] rust: dma_buf: add stub dma_fence abstraction From: Alice Ryhl To: Danilo Krummrich , Matthew Brost , "=?utf-8?q?Thomas_Hellstr=C3=B6m?=" , Daniel Almeida , Boris Brezillon , Gary Guo , "=?utf-8?q?Onur_=C3=96zkan?=" , Philipp Stanner Cc: Sumit Semwal , "=?utf-8?q?Christian_K=C3=B6nig?=" , Miguel Ojeda , Boqun Feng , "=?utf-8?q?Bj=C3=B6rn_Roy_Baron?=" , Benno Lossin , Andreas Hindborg , Trevor Gross , linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, dri-devel@lists.freedesktop.org, Alice Ryhl Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Philipp Stanner This adds a trivial DMA Fence type for use in other abstractions that need to take a DMA fence as a parameter. For now, the type is a stub, but may be used with fences defined by C. Signed-off-by: Philipp Stanner Signed-off-by: Alice Ryhl --- This stub is included only for completeness. Most likely we will land this on top of the Philipp's patch that actually adds Fence for real, and this stub commit will not be necessary. Taken from: https://gitlab.freedesktop.org/pstanner/linux-drm-work/-/merge_requests/1 --- rust/kernel/dma_buf/dma_fence.rs | 32 ++++++++++++++++++++++++++++++++ rust/kernel/dma_buf/mod.rs | 7 +++++++ rust/kernel/lib.rs | 1 + 3 files changed, 40 insertions(+) diff --git a/rust/kernel/dma_buf/dma_fence.rs b/rust/kernel/dma_buf/dma_fen= ce.rs new file mode 100644 index 000000000000..135df74013db --- /dev/null +++ b/rust/kernel/dma_buf/dma_fence.rs @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Copyright (C) 2025, 2026 Red Hat Inc.: +// - Philipp Stanner + +//! DMA Fence support. +//! +//! Reference: +//! +//! C header: [`include/linux/dma-fence.h`](srctree/include/linux/dma-fenc= e.h) + +use crate::{ + bindings, + prelude::*, + types::Opaque, // +}; + +/// A dma fence. +#[pin_data] +#[repr(transparent)] +pub struct Fence { + #[pin] + inner: Opaque, +} + +impl Fence { + /// Access the raw dma fence. + #[inline] + pub fn as_raw(&self) -> *mut bindings::dma_fence { + self.inner.get() + } +} diff --git a/rust/kernel/dma_buf/mod.rs b/rust/kernel/dma_buf/mod.rs new file mode 100644 index 000000000000..b66e747c35ad --- /dev/null +++ b/rust/kernel/dma_buf/mod.rs @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0 OR MIT + +//! DMA-buf subsystem abstractions. + +pub mod dma_fence; + +pub use self::dma_fence::Fence; diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs index b72b2fbe046d..a05ccaa7598c 100644 --- a/rust/kernel/lib.rs +++ b/rust/kernel/lib.rs @@ -63,6 +63,7 @@ pub mod device_id; pub mod devres; pub mod dma; +pub mod dma_buf; pub mod driver; #[cfg(CONFIG_DRM =3D "y")] pub mod drm; --=20 2.54.0.545.g6539524ca2-goog From nobody Sat Jun 13 20:56:04 2026 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 39E1A36604C for ; Tue, 5 May 2026 13:29:55 +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=1777987799; cv=none; b=fsUHdnlCKKWTOhTI5GQvCoC0CrvgrZOPQM5ZXtrTTYFoyjcaCQ06W4fXYTTucAWBs4RTrwCbBV7347WjfocG+//gA3/HtyQAo7npqLl4u6UGlLJdUqlnr9gOXFWDqWz7CNVSdX0+RLp7AK1JcNVcmBT53u3oh2++Y0matZasa60= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777987799; c=relaxed/simple; bh=D38IP4eDNtMMI0IcGktFlp2eQ3DhTGlCsra4pFAIzVw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=pK5xtzlpNIW6OEjU2MZR9VlBX5aytlaSzM6mR+H9t5soUWMKqtm7FwS2zLjrE17JD503p2LbdFexNs7VzXYbCMWjCPlPEhnpPsj/aS3UStC9XpsjzN2Yja81WTFyvwicSa0KjkKvOWaZF5QSSUnNZbVeszl0Sr/pKNtWm2gH2TM= 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=mDEiVabX; 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="mDEiVabX" Received: by mail-wr1-f74.google.com with SMTP id ffacd0b85a97d-44a71109b94so3289647f8f.3 for ; Tue, 05 May 2026 06:29:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1777987794; x=1778592594; 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=h2RGX6Vwv6i9Ia+V/bXwK0J5Boae0O+Cfqmb25x4+UY=; b=mDEiVabXt9owy/Xi7AcDk89uOSF0/YD9+v9mziwyj+B1RaycEe5gY4jkQB60u+TNq/ //dn6YuWSssbwRBeBxRL5R39l53/sgu3FZ5C2BY4NIEqGBEJ2p6U1Oi4XeQQJVAYfhSM gCpKPLooWKScQBx8sTpt7KtmHZc2+ZXgnkR9zW1oHqLWf8BBDTM6hxLd2ODtSfCPmni5 LkYBTbqloh19GNRDTRN5sQ25qc/zDTqB3Cf0lbLq7c3edRvyBZ1Dytpvz/7ebOpVKEfF fm6HKry/Y85E/DbciTT9eqDAy2hsJwfaWrtsL+qwmo8eSU9ZK1RpmMa03zVq1rsKq641 zfIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777987794; x=1778592594; 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=h2RGX6Vwv6i9Ia+V/bXwK0J5Boae0O+Cfqmb25x4+UY=; b=pt7gUVoo1P88667ixtdUJI4/+ZoBepIsNmFAp/p/U/Y0xlKmwYBK7hG0sv5hbTA110 HBS1hVaafvE1GmZGeBj/Q0tdYk+PcgURBESmJ7psO8foJDophxnPLLudAsXXdBnBxS/m mlzqVjP4ZvEIh88GrpGK3rdiFTjWo3pChVdMEvh5wOdESotdeT/NJuCn/YRdKRevZs6s va0iF2NwUXSMZiVDKMguH3wX+xUn30IPfSWRai+R8xsqcZTmrqcShdgNhPrlXuvnZ1+9 waO5EebTCd3vhVtcc6813z4m+5LRed6xzPFJt6/wnSHpvhbOpOX3aksyS7nrXQc/efZs XrFw== X-Forwarded-Encrypted: i=1; AFNElJ+JveDSWRmOMs5XP6tvNRwLGv72Y/S0BYHdIgzpTFezmDaSsKap74lDxBGUT33kYpegBxkyS+aMrlcaWNI=@vger.kernel.org X-Gm-Message-State: AOJu0YxZ0Xp2zSczbArNZ+0Oyl8VEqMOgT+Fo4o0LzM+GQUuuRbPtiO3 htV//PWIwI35GQfcdlaGIBmRGdKx5oraABSmbjuKlte0sDW1kYLv87itLkYgV6EhDe4S4xA+Ule 0MsJ8KXkgj38CB/EPMQ== X-Received: from wrbes25.prod.google.com ([2002:a05:6000:44d9:b0:44a:70d3:31fd]) (user=aliceryhl job=prod-delivery.src-stubby-dispatcher) by 2002:a5d:444c:0:b0:44b:d58b:6a01 with SMTP id ffacd0b85a97d-44bd59aada4mr15775676f8f.1.1777987793893; Tue, 05 May 2026 06:29:53 -0700 (PDT) Date: Tue, 05 May 2026 13:29:37 +0000 In-Reply-To: <20260505-gpuvm-drm-exec-v1-0-958306ded36e@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260505-gpuvm-drm-exec-v1-0-958306ded36e@google.com> X-Developer-Key: i=aliceryhl@google.com; a=openpgp; fpr=49F6C1FAA74960F43A5B86A1EE7A392FDE96209F X-Developer-Signature: v=1; a=openpgp-sha256; l=6284; i=aliceryhl@google.com; h=from:subject:message-id; bh=D38IP4eDNtMMI0IcGktFlp2eQ3DhTGlCsra4pFAIzVw=; b=owEBbQKS/ZANAwAKAQRYvu5YxjlGAcsmYgBp+fDNU9ynbvS3XqymbWEIFFSYVxq4nVooOCqAz 8ojvGQzQrSJAjMEAAEKAB0WIQSDkqKUTWQHCvFIvbIEWL7uWMY5RgUCafnwzQAKCRAEWL7uWMY5 RhxWEACUfl0Spaz0xAbL0EstZcKnvjGq70NJR0uHyy/8h4gZQYldwrE+tFVx9pa6WzyND2y5gbL +29uPSTOfRxUfwtkr/WVnPlBvxGxJWZ6YWd6VV8cLqmy7hZwUSI3SyD6zTVsTKfC8J64OkcoTCK aQRz7zUqG0aFmaL55YE0pZB4L5pAeyM64FL6NTLJ9KK5kWt9MVfmJARTrjNYuo4x0cGHWQG76c/ ftxOTAjFr1EFv/+dQYO7Jau+YFAgywBT+AO+aaWQcOOE2YOphCykKAxv2X7Ll0bR+D1JijF9Snb mn2RCFCU2VAA4v2Rr6c7DoRxY1bEaZl4ovdMo0dEvKqT1xOK8i5qIMmpUXN1TyS7/tRMixWlxyR b+EzeVH/TjKWDo8i3W6kcXXm2wRG6or/q1YFNQLgowdcy0nFuQDTYr52FAw5NoWftLY/mNIjVSI jeVI2lsO3Xm1YCIERvFheCpBFOiwx6mtsNMH2LmSdeI4DalQDf0eaoW1ACHsI1g7NqjBmyxXTjl X2mt6gmE8/Z/JAF/itemiWpj4TRo/tF9FoxhGh0KYmPpTzlJVprRCl+4EEazKwbHwuUxLnEg8RN AKgpGFxsO+YpgrytwrriLKkSPAMmFoobSQNe6P7fNu1v0W7hgNvwe0VMgTMXC8zd8Cloj/GtzeC STnjuONyxsqk9QQ== X-Mailer: b4 0.14.3 Message-ID: <20260505-gpuvm-drm-exec-v1-2-958306ded36e@google.com> Subject: [PATCH 2/2] drm/gpuvm: rust: add drm_gpuvm_exec support From: Alice Ryhl To: Danilo Krummrich , Matthew Brost , "=?utf-8?q?Thomas_Hellstr=C3=B6m?=" , Daniel Almeida , Boris Brezillon , Gary Guo , "=?utf-8?q?Onur_=C3=96zkan?=" , Philipp Stanner Cc: Sumit Semwal , "=?utf-8?q?Christian_K=C3=B6nig?=" , Miguel Ojeda , Boqun Feng , "=?utf-8?q?Bj=C3=B6rn_Roy_Baron?=" , Benno Lossin , Andreas Hindborg , Trevor Gross , linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, dri-devel@lists.freedesktop.org, Alice Ryhl Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable This adds support for simple usage of drm_gpuvm_exec() for locking all of the dma reservations and adding fences to them. For more complex usage that does not involve locking all reservations, it is expected that the ww-mutex abstractions will be used instead. Signed-off-by: Alice Ryhl --- rust/bindings/bindings_helper.h | 2 ++ rust/helpers/drm_gpuvm.c | 6 ++++ rust/kernel/dma_buf/mod.rs | 17 ++++++++++ rust/kernel/drm/gpuvm/mod.rs | 71 +++++++++++++++++++++++++++++++++++++= ++++ 4 files changed, 96 insertions(+) diff --git a/rust/bindings/bindings_helper.h b/rust/bindings/bindings_helpe= r.h index 1124785e210b..3978682a6f2e 100644 --- a/rust/bindings/bindings_helper.h +++ b/rust/bindings/bindings_helper.h @@ -151,6 +151,8 @@ const vm_flags_t RUST_CONST_HELPER_VM_MIXEDMAP =3D VM_M= IXEDMAP; const vm_flags_t RUST_CONST_HELPER_VM_HUGEPAGE =3D VM_HUGEPAGE; const vm_flags_t RUST_CONST_HELPER_VM_NOHUGEPAGE =3D VM_NOHUGEPAGE; =20 +const u32 RUST_CONST_HELPER_DRM_EXEC_INTERRUPTIBLE_WAIT =3D DRM_EXEC_INTER= RUPTIBLE_WAIT; + #if IS_ENABLED(CONFIG_GPU_BUDDY) const unsigned long RUST_CONST_HELPER_GPU_BUDDY_RANGE_ALLOCATION =3D GPU_B= UDDY_RANGE_ALLOCATION; const unsigned long RUST_CONST_HELPER_GPU_BUDDY_TOPDOWN_ALLOCATION =3D GPU= _BUDDY_TOPDOWN_ALLOCATION; diff --git a/rust/helpers/drm_gpuvm.c b/rust/helpers/drm_gpuvm.c index 4130b6325213..30fb1777fbf2 100644 --- a/rust/helpers/drm_gpuvm.c +++ b/rust/helpers/drm_gpuvm.c @@ -23,4 +23,10 @@ bool rust_helper_drm_gpuvm_is_extobj(struct drm_gpuvm *g= puvm, return drm_gpuvm_is_extobj(gpuvm, obj); } =20 +__rust_helper +void rust_helper_drm_gpuvm_exec_unlock(struct drm_gpuvm_exec *vm_exec) +{ + drm_gpuvm_exec_unlock(vm_exec); +} + #endif // CONFIG_RUST_DRM_GPUVM diff --git a/rust/kernel/dma_buf/mod.rs b/rust/kernel/dma_buf/mod.rs index b66e747c35ad..234936ba8265 100644 --- a/rust/kernel/dma_buf/mod.rs +++ b/rust/kernel/dma_buf/mod.rs @@ -5,3 +5,20 @@ pub mod dma_fence; =20 pub use self::dma_fence::Fence; + +/// How the fences from a `dma_resv` obj are used. +/// +/// Please see [the C-side documentation][dma_resv_usage] for more details. +/// +/// [dma_resv_usage]: https://docs.kernel.org/driver-api/dma-buf.html#c.dm= a_resv_usage +#[repr(u32)] +pub enum DmaResvUsage { + /// For in kernel memory management only (e.g. copying, clearing memor= y). + Kernel =3D bindings::dma_resv_usage_DMA_RESV_USAGE_KERNEL, + /// Implicit write synchronization for userspace submissions. + Write =3D bindings::dma_resv_usage_DMA_RESV_USAGE_WRITE, + /// Implicit read synchronization for userspace submissions. + Read =3D bindings::dma_resv_usage_DMA_RESV_USAGE_READ, + /// No implicit sync (e.g. preemption fences, page table updates, TLB = flushes). + Bookkeep =3D bindings::dma_resv_usage_DMA_RESV_USAGE_BOOKKEEP, +} diff --git a/rust/kernel/drm/gpuvm/mod.rs b/rust/kernel/drm/gpuvm/mod.rs index ae58f6f667c1..a52fb25f22ff 100644 --- a/rust/kernel/drm/gpuvm/mod.rs +++ b/rust/kernel/drm/gpuvm/mod.rs @@ -16,6 +16,7 @@ Flags as AllocFlags, // }, bindings, + dma_buf::{DmaResvUsage, Fence}, drm, drm::gem::IntoGEMObject, error::to_result, @@ -216,6 +217,30 @@ pub fn obtain( Ok(GpuVmBoAlloc::new(self, obj, data)?.obtain()) } =20 + /// Prepare this GPUVM. + /// + /// The parameter indicates how many fences to preallocate space for. + #[inline] + pub fn prepare(&self, num_fences: u32) -> impl PinInit, Error> { + try_pin_init!(GpuVmExec { + exec <- Opaque::try_ffi_init(|exec: *mut bindings::drm_gpuvm_e= xec| { + // SAFETY: exec is valid but unused memory, so we can writ= e. + unsafe { + ptr::write_bytes(exec, 0u8, 1usize); + ptr::write(&raw mut (*exec).vm, self.as_raw()); + ptr::write(&raw mut (*exec).flags, bindings::DRM_EXEC_= INTERRUPTIBLE_WAIT); + ptr::write(&raw mut (*exec).num_fences, num_fences); + } + + // SAFETY: If successful, this `struct drm_gpuvm_exec` rem= ains valid until this is + // unlocked because it's pinned and unlocks it in drop. Th= e contained pointer to + // `self` remains valid because `GpuVmExec` borrows from `= self`. + to_result(unsafe { bindings::drm_gpuvm_exec_lock(exec) }) + }), + _gpuvm: PhantomData, + }) + } + /// Clean up buffer objects that are no longer used. #[inline] pub fn deferred_cleanup(&self) { @@ -326,3 +351,49 @@ fn deref(&self) -> &GpuVm { &self.0 } } + +/// The exec token for preparing the objects. +/// +/// # Invariants +/// +/// Owns a GPUVM exec context. +#[pin_data(PinnedDrop)] +pub struct GpuVmExec<'vm, T: DriverGpuVm> { + #[pin] + exec: Opaque, + _gpuvm: PhantomData<&'vm mut GpuVm>, +} + +impl<'vm, T: DriverGpuVm> GpuVmExec<'vm, T> { + /// Add a fence. + /// + /// The caller must ensure that the preallocated space for fences is s= ufficient. + #[inline] + pub fn resv_add_fence( + &self, + fence: &Fence, + private_usage: DmaResvUsage, + extobj_usage: DmaResvUsage, + ) { + // SAFETY: This method takes a refcount on the fence, so it's only= required to be valid for + // the duration of this method. If there is not enough space for t= he pre-allocated fence, + // then this leads to a BUG_ON() but does not trigger UB. + unsafe { + bindings::drm_gpuvm_resv_add_fence( + (*self.exec.get()).vm, + &raw mut (*self.exec.get()).exec, + fence.as_raw(), + private_usage as u32, + extobj_usage as u32, + ) + } + } +} + +#[pinned_drop] +impl<'vm, T: DriverGpuVm> PinnedDrop for GpuVmExec<'vm, T> { + fn drop(self: Pin<&mut Self>) { + // SAFETY: We hold the lock, so it's safe to unlock. + unsafe { bindings::drm_gpuvm_exec_unlock(self.exec.get()) }; + } +} --=20 2.54.0.545.g6539524ca2-goog