From nobody Fri Oct 3 15:34:25 2025 Received: from sender4-pp-f112.zoho.com (sender4-pp-f112.zoho.com [136.143.188.112]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 953B9223DDD; Thu, 28 Aug 2025 20:53:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.112 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756414394; cv=pass; b=isjCeQwo030cGwCuOWyn6nItzF4m24Omz/MotAAQcVvBYfNVAAdQzUIqzp7UQbY+Pe3lkHFbC8aQT9Qfz9ucxALbcDY0dEnfPkNIi4cbRsUxTIef1XYTfYR7+G82ptoYJHR8U06fCD86l1+nf3ESWyzbeA3gjtPHc0J4dAqD074= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756414394; c=relaxed/simple; bh=ml6FKS6NYtN5XzgKBC9OB62SYvKtyoW/Npz59dU9wDM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=pO9JT0eERMxbz5Ib2K3fb7HEjw6dog4JsOgzTuOSKCgbJMNtFC/nuAQBcKpeyEYkDy0E2N6qx/pUvq11GYfh0qqIBrn6swbngYdrhi79ebDltAmTCdZ68s2FUTqly18iJ1z+rRR6ndx9FVQNf3YcgSi/5D71XG77KaiAT1W3Yi0= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (1024-bit key) header.d=collabora.com header.i=daniel.almeida@collabora.com header.b=bryn2ljn; arc=pass smtp.client-ip=136.143.188.112 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=collabora.com header.i=daniel.almeida@collabora.com header.b="bryn2ljn" ARC-Seal: i=1; a=rsa-sha256; t=1756414372; cv=none; d=zohomail.com; s=zohoarc; b=JVp7avEZMEFFW8zvRIO/Jnp/uSAuYGbL3GZ0m0v9CtknFqh3Ffz5pwEuD8zuKEcR5vvlN5wjPV8HwZlNBzNPEJVwa+Y7SnGKK4bWpeMxDUKpjgtfD27+N1BnmZQ+k49DcFkts3eQ56CzY/djl7Z3c9RWbfuzwfFq5IUHDbKLAiM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756414372; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=avOuCwsXzd/3kp2rlCFI8ziT5ewR4e3wib7MI1JPpJA=; b=GCFHAnAgzx22FudQ/rW5FSmnY9O8kuq8KWU+Vwktz1OF9I9iGX+3yBCa0ys/9okP598EkJ71xIEir/2HM6M4LSPHVhhBaxQTkXq61jjbTrP44l46dVthZzoFsHF4sOnwV6yXCWDPkOex5E1QjBpIEYje7S86E2YGbD+DpFWecNE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=daniel.almeida@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1756414372; s=zohomail; d=collabora.com; i=daniel.almeida@collabora.com; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:References:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=avOuCwsXzd/3kp2rlCFI8ziT5ewR4e3wib7MI1JPpJA=; b=bryn2ljncdcU0SQW1DQQlhdRsAOKvM8PspT6ykvbfPR9rfzSiYBt81RGlEPxvWQA T297lfstWd1LvXhGVELicQJX21xCKDyslSvdsd1xzLdLB2WnettlxU9aeLHPeRTM2AC R1YgDZSfq9tjqaf60KilJHYmnoFYvyEnXNH8cgkQ= Received: by mx.zohomail.com with SMTPS id 1756414369613309.01930956826266; Thu, 28 Aug 2025 13:52:49 -0700 (PDT) From: Daniel Almeida Date: Thu, 28 Aug 2025 17:52:17 -0300 Subject: [PATCH v2 1/3] rust: lock: guard: add T: Unpin bound to DerefMut Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250828-lock-t-when-t-is-pinned-v2-1-b067c4b93fd6@collabora.com> References: <20250828-lock-t-when-t-is-pinned-v2-0-b067c4b93fd6@collabora.com> In-Reply-To: <20250828-lock-t-when-t-is-pinned-v2-0-b067c4b93fd6@collabora.com> To: Peter Zijlstra , Ingo Molnar , Will Deacon , Boqun Feng , Waiman Long , Miguel Ojeda , Alex Gaynor , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich Cc: linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, Daniel Almeida X-Mailer: b4 0.14.2 X-ZohoMailClient: External A core property of pinned types is not handing a mutable reference to the inner data in safe code, as this trivially allows that data to be moved. Enforce this condition by adding a bound on lock::Guard's DerefMut implementation, so that it's only implemented for pinning-agnostic types. Link: https://github.com/Rust-for-Linux/linux/issues/1181 Suggested-by: Benno Lossin Suggested-by: Boqun Feng Reviewed-by: Benno Lossin Reviewed-by: Alice Ryhl Signed-off-by: Daniel Almeida --- rust/kernel/sync/lock.rs | 5 ++++- rust/kernel/sync/lock/global.rs | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/rust/kernel/sync/lock.rs b/rust/kernel/sync/lock.rs index 27202beef90c88dda13c58bbea9e8d4ce8d314de..b482f34bf0ce817e70f7a0da934= 43f77dd19ea79 100644 --- a/rust/kernel/sync/lock.rs +++ b/rust/kernel/sync/lock.rs @@ -251,7 +251,10 @@ fn deref(&self) -> &Self::Target { } } =20 -impl core::ops::DerefMut for Guard<'_, T, B> { +impl core::ops::DerefMut for Guard<'_, T, B> +where + T: Unpin, +{ fn deref_mut(&mut self) -> &mut Self::Target { // SAFETY: The caller owns the lock, so it is safe to deref the pr= otected data. unsafe { &mut *self.lock.data.get() } diff --git a/rust/kernel/sync/lock/global.rs b/rust/kernel/sync/lock/global= .rs index d65f94b5caf2668586088417323496629492932f..38b44803279986275616eef499f= d40b8d4e97fdf 100644 --- a/rust/kernel/sync/lock/global.rs +++ b/rust/kernel/sync/lock/global.rs @@ -106,7 +106,10 @@ fn deref(&self) -> &Self::Target { } } =20 -impl core::ops::DerefMut for GlobalGuard { +impl core::ops::DerefMut for GlobalGuard +where + B::Item: Unpin, +{ fn deref_mut(&mut self) -> &mut Self::Target { &mut self.inner } --=20 2.50.1 From nobody Fri Oct 3 15:34:25 2025 Received: from sender4-pp-f112.zoho.com (sender4-pp-f112.zoho.com [136.143.188.112]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C29C42BE657; Thu, 28 Aug 2025 20:53:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.112 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756414397; cv=pass; b=k8s3qGnifhA/+6y7axArxTaVWt32wJb0wIpBfO+xoWEJtNF0BMFo2NTZiP4ysUubuHoHLj3Jrhq4QWqLdiz7A76heN+N0vJ4fxLn0K6miz/XKCyb5VL64+b3uSly2TPr0GJuUqDQg553KpCDT3qTb4wr9kvNjNdaf/35KJqbT2I= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756414397; c=relaxed/simple; bh=WDRbJYm871uH+OrlgNlxMdnRAU5LMEkdNaazRPXmx6E=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PK1W3BvRtEkQ0XHxc5MkuBDHAkNLufXIRsr66YmcWdkDNLTfWc7afKy8mnRa3zWFnNOH58ANr+DUIh419lwDA/lcfMklR2eS7LjhHMORkdqGhUXRmQWQkwDTXd90hrURGbQktBKix3hZPCOvjgMwERUC8pisLMs5J8anzr2j7QI= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (1024-bit key) header.d=collabora.com header.i=daniel.almeida@collabora.com header.b=Ep4rG9Vi; arc=pass smtp.client-ip=136.143.188.112 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=collabora.com header.i=daniel.almeida@collabora.com header.b="Ep4rG9Vi" ARC-Seal: i=1; a=rsa-sha256; t=1756414376; cv=none; d=zohomail.com; s=zohoarc; b=kMEUC2W4vp+bF2QM0UYYfLsqd+YYDSILGHpcxp3bC7Xzqp4iyI7R2/BQHrOGBDBpYC8kVlOKt7tIjY9Xznnuh115FFJMW6fiXFeVF8pTvTeymAIz1b0f/MktdXPhendUuVU+lxaODX9BIoYJYHaL5q9z7cQx1RG6zef7Sv9MVco= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756414376; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=PinYmgq8QkJDg0lGjMIO4YiGjSjM42rzhkNkyt4VEgM=; b=bUc3byhpdyjmBTylR38KHVs0g4I1vFq1qi12R4t388dbsVm88+MYjFqpaP3P3NXD9EXqE8ecxwmKu/CnvyJ9N0hvTG47X6KAHrSJEQYHZrIXKCJ6qwzH7Abt3vxru9KlyX/9Ziss2rOTlhJIO53T3M/UZHKQqQeuW3mXMUkQ1iU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=daniel.almeida@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1756414376; s=zohomail; d=collabora.com; i=daniel.almeida@collabora.com; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:References:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=PinYmgq8QkJDg0lGjMIO4YiGjSjM42rzhkNkyt4VEgM=; b=Ep4rG9VikSsGgIYqFY+Hi14ETp9YWRsIg6F4q+u5aPqZRxcw0gTGtqc2TuBnHfoQ DDtsHk62UIHczcoREcoSEwy8AZGbPgsuPL+0ORZWJ+O+9yBBm/SVkf8lhcQagmgXr4s Kh+d2DEybiSWk9cxItOCExbIOquk0961uy2qHMbo= Received: by mx.zohomail.com with SMTPS id 1756414373847768.3675238134108; Thu, 28 Aug 2025 13:52:53 -0700 (PDT) From: Daniel Almeida Date: Thu, 28 Aug 2025 17:52:18 -0300 Subject: [PATCH v2 2/3] rust: lock: pin the inner data Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250828-lock-t-when-t-is-pinned-v2-2-b067c4b93fd6@collabora.com> References: <20250828-lock-t-when-t-is-pinned-v2-0-b067c4b93fd6@collabora.com> In-Reply-To: <20250828-lock-t-when-t-is-pinned-v2-0-b067c4b93fd6@collabora.com> To: Peter Zijlstra , Ingo Molnar , Will Deacon , Boqun Feng , Waiman Long , Miguel Ojeda , Alex Gaynor , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich Cc: linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, Daniel Almeida X-Mailer: b4 0.14.2 X-ZohoMailClient: External In preparation to support Lock where T is pinned, the first thing that needs to be done is to structurally pin the 'data' member. This switches the 't' parameter in Lock::new() to take in an impl PinInit instead of a plain T. This in turn uses the blanket implementation "impl PinInit for T". Subsequent patches will touch on Guard. Link: https://github.com/Rust-for-Linux/linux/issues/1181 Suggested-by: Benno Lossin Suggested-by: Boqun Feng Reviewed-by: Benno Lossin Reviewed-by: Alice Ryhl Signed-off-by: Daniel Almeida --- rust/kernel/sync/lock.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/rust/kernel/sync/lock.rs b/rust/kernel/sync/lock.rs index b482f34bf0ce817e70f7a0da93443f77dd19ea79..9242790d15dbf65d66518d060a8= a777aac558cfc 100644 --- a/rust/kernel/sync/lock.rs +++ b/rust/kernel/sync/lock.rs @@ -11,7 +11,7 @@ types::{NotThreadSafe, Opaque, ScopeGuard}, }; use core::{cell::UnsafeCell, marker::PhantomPinned, pin::Pin}; -use pin_init::{pin_data, pin_init, PinInit}; +use pin_init::{pin_data, pin_init, PinInit, Wrapper}; =20 pub mod mutex; pub mod spinlock; @@ -115,6 +115,7 @@ pub struct Lock { _pin: PhantomPinned, =20 /// The data protected by the lock. + #[pin] pub(crate) data: UnsafeCell, } =20 @@ -127,9 +128,13 @@ unsafe impl Sync for Loc= k {} =20 impl Lock { /// Constructs a new lock initialiser. - pub fn new(t: T, name: &'static CStr, key: Pin<&'static LockClassKey>)= -> impl PinInit { + pub fn new( + t: impl PinInit, + name: &'static CStr, + key: Pin<&'static LockClassKey>, + ) -> impl PinInit { pin_init!(Self { - data: UnsafeCell::new(t), + data <- UnsafeCell::pin_init(t), _pin: PhantomPinned, // SAFETY: `slot` is valid while the closure is called and bot= h `name` and `key` have // static lifetimes so they live indefinitely. --=20 2.50.1 From nobody Fri Oct 3 15:34:25 2025 Received: from sender4-pp-f112.zoho.com (sender4-pp-f112.zoho.com [136.143.188.112]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DB32A2BF000; Thu, 28 Aug 2025 20:53:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.112 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756414398; cv=pass; b=q+UtJkfPTWlDvXJ3JTGNamJxkwa9ZpZ/LxlXdLEAnfBMfkkIMcN52tqGzhWkvQ5M2KF93RTPg79xDkH0b848iCgbYu9VRoXvwbRmBAhJdRlgWImJU/6CU1m3jt3VghPp9dliprBgfLAL9+0AaDLk5GN9PIIE7LlOaLUqRrG8pPc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756414398; c=relaxed/simple; bh=GTVuonu0/uE2rIWB+P+bMJZTKdHKPh2gT6A2Rhl0a/U=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nlm2WAkswU2PuzRLnNvruqNkiZ60HrgD7Xq2B5WQUxSCddiXZeoVibBGXQQCeIp39CYmilDpFUJ8hz6vWQACj0QUY3YZWJS4KwzqgFNLAedWqFQjWXQFww9RIU9TpT9VkPjP8iy48pjuJ3UBJ22Zx2gnovHRtN5pr8vrvSJl4BI= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (1024-bit key) header.d=collabora.com header.i=daniel.almeida@collabora.com header.b=isl68s1V; arc=pass smtp.client-ip=136.143.188.112 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=collabora.com header.i=daniel.almeida@collabora.com header.b="isl68s1V" ARC-Seal: i=1; a=rsa-sha256; t=1756414380; cv=none; d=zohomail.com; s=zohoarc; b=R40GSdGmB3SzvxgafPwPNlHufS5jrO0hltIGELYl0aIA85yALWxm78OOO3IisRbHWtmIwUe6iV+OIsh3ts8WksBRzD0avd5aOo//VZCl8wD6gaHTHSTEhz9mttiX1V9Mxq2bSMPHqrSCgiowMhad6bxoSGP34fAshGXH6FYoovQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756414380; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=Z4SAoqxRMjjOfknNP5rCeR0jEaPb2gogwRcBkklwXRs=; b=jNiX7y78xR815pcI1c2c1R+hy4OiTyOm81hJ7FEYHmalSeomVX/067C8BrDRz4xz621tZGW9xsAq1IYkLqRxG/rAm/LAoNHx32MWFuFwk6SeHGY5I5Uf5XkytGtCisO1T8b1AyTLqP3S8mionmjSrea+xxHE4I9qknlOArGpF2M= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=daniel.almeida@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1756414380; s=zohomail; d=collabora.com; i=daniel.almeida@collabora.com; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:References:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=Z4SAoqxRMjjOfknNP5rCeR0jEaPb2gogwRcBkklwXRs=; b=isl68s1VfEPGznUqx9LvUWD6Pd7C4R4lBSV0m5j40c1ozTCOXebcUfI7qgswHWfk BDDwcXPOpTADUXW+gd07WxdcvlZfcmgT0QClE4Sd9VlFLq933CCu3EyMAc+MlLAjsqZ OJUciCmm8AsAsZs2zc+z+kzoRSBD1wzUh+di3o1Y= Received: by mx.zohomail.com with SMTPS id 1756414378215841.1326014020718; Thu, 28 Aug 2025 13:52:58 -0700 (PDT) From: Daniel Almeida Date: Thu, 28 Aug 2025 17:52:19 -0300 Subject: [PATCH v2 3/3] rust: lock: add a Pin<&mut T> accessor Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250828-lock-t-when-t-is-pinned-v2-3-b067c4b93fd6@collabora.com> References: <20250828-lock-t-when-t-is-pinned-v2-0-b067c4b93fd6@collabora.com> In-Reply-To: <20250828-lock-t-when-t-is-pinned-v2-0-b067c4b93fd6@collabora.com> To: Peter Zijlstra , Ingo Molnar , Will Deacon , Boqun Feng , Waiman Long , Miguel Ojeda , Alex Gaynor , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich Cc: linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, Daniel Almeida X-Mailer: b4 0.14.2 X-ZohoMailClient: External In order for callers to be able to access the inner T safely if T: !Unpin, there needs to be a way to get a Pin<&mut T>. Add this accessor and a corresponding example to tell users how it works. This is not useful on its own for now, because we do not support pin projections yet. This means that the following is not going to compile: let mut data: MutexGuard<'_, Data> =3D mutex.lock(); let mut data: Pin<&mut Data> =3D data.as_mut(); let foo =3D &mut data.foo; A future patch can enable the behavior above by implementing support for pin projections. Said patch is in the works already and will possibly land on 6.18. Link: https://github.com/Rust-for-Linux/linux/issues/1181 Suggested-by: Benno Lossin Suggested-by: Boqun Feng Reviewed-by: Alice Ryhl Signed-off-by: Daniel Almeida Reviewed-by: Benno Lossin --- rust/kernel/sync/lock.rs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/rust/kernel/sync/lock.rs b/rust/kernel/sync/lock.rs index 9242790d15dbf65d66518d060a8a777aac558cfc..7191804a244da05db74294fdec5= 98f1a4732682c 100644 --- a/rust/kernel/sync/lock.rs +++ b/rust/kernel/sync/lock.rs @@ -245,6 +245,31 @@ pub(crate) fn do_unlocked(&mut self, cb: impl FnOnc= e() -> U) -> U { =20 cb() } + + /// Returns a pinned mutable reference to the protected data. + /// + /// The guard implements [`DerefMut`] when `T: Unpin`, so for [`Unpin`] + /// types [`DerefMut`] should be used instead of this function. + /// + /// [`DerefMut`]: core::ops::DerefMut + /// [`Unpin`]: core::marker::Unpin + /// + /// # Examples + /// + /// ``` + /// # use kernel::sync::{Mutex, MutexGuard}; + /// # use core::pin::Pin; + /// struct Data; + /// + /// fn example(mutex: &Mutex) { + /// let mut data: MutexGuard<'_, Data> =3D mutex.lock(); + /// let mut data: Pin<&mut Data> =3D data.as_mut(); + /// } + /// ``` + pub fn as_mut(&mut self) -> Pin<&mut T> { + // SAFETY: `self.lock.data` is structurally pinned. + unsafe { Pin::new_unchecked(&mut *self.lock.data.get()) } + } } =20 impl core::ops::Deref for Guard<'_, T, B> { --=20 2.50.1