From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-yb1-f201.google.com (mail-yb1-f201.google.com [209.85.219.201]) (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 603C019307B for ; Tue, 30 Jul 2024 13:06:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722344800; cv=none; b=UWJJENkKhco2j7pFkiOx1DVJgDSxDlTgidxF7aIEkwgnUNqyqO4rgjnmiQcz73TKTSO5SDPowy8UiixvWHTwMt1dYo4nYJ8fCsKw3FFvmX9j767XY/N+EsauiP49WOqCAx7JPE7jKsykwSbCcfIMtLUHQIcwJnmhaT6ZDu23DIs= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722344800; c=relaxed/simple; bh=jEounkARTWSXuP9TGoR+2S+iU6PCZFgHt6WY+kyo3Tg=; h=Date:Mime-Version:Message-ID:Subject:From:To:Cc:Content-Type; b=iydIP+/fLYpCcohObT4Eaas3Z6XFNQPC73msAdrKd74cZtaK7UjtlSmtwXU982+Uk5u3hTof519HWTVGIUchCM0VXLaX1TB4FxMvNtqBLqsQ/pqN+pbW1q7NHfG6jY0A7uDlkMZvX2GxR9tStygAPC5weNFIIzxOTZrp76n5rI8= 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=kybJt7r8; arc=none smtp.client-ip=209.85.219.201 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="kybJt7r8" Received: by mail-yb1-f201.google.com with SMTP id 3f1490d57ef6-e0baf2a2ed1so153416276.1 for ; Tue, 30 Jul 2024 06:06:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1722344798; x=1722949598; darn=vger.kernel.org; h=cc:to:from:subject:message-id:mime-version:date:from:to:cc:subject :date:message-id:reply-to; bh=LpK9lTVBIoGCidPfD5yJsiZKmR1svodGEUYQV6xMuaU=; b=kybJt7r8H8E96x0H9WiDTicUI+oAFTwdEgtv5I82U2VWP61pRUTwp/5f339EeRVNf5 +Xc1xXQxZIqByqvOgzW6x1hb82RfmJytTCJo1H026ApSWPfLFRDXSRyA1eeKhGwRkYuQ kIlNrediDKInfu6YZd29NeMcoqr1EVOp0m9cT4pNe0jcAD1cXG0AMdpNudXtnzfYhyw4 ptwoZ/QWZ8uWhod73qALT+bnbB9Tt+AC2J4doJe6K7R0Z9RYY8hC8jaeLbSluzXIHpy0 LHLq8qo+747Ix8lO1RYDPomupMfIfBoZ+vO6uWFhIpFeMcHZtSQCNOhRdOSg6+MlBUi7 mobw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1722344798; x=1722949598; h=cc:to:from:subject:message-id:mime-version:date:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=LpK9lTVBIoGCidPfD5yJsiZKmR1svodGEUYQV6xMuaU=; b=pU7janZk+Z7MCFjYUrPrfXAGfmJ9+2Q1H8iKojaN9D+BJGTzC1d/5ozAUDW06/uU8n A0/M9UBsfXxZ8WMTJ++d9GnFK5HOvJO62ax0uWgWuWaQVw3kdt+eJ0ZIBQE8CO/hsUxy kftwVh+hGMdUeAF7sTWEpKEbje2pDb6YDIxguGWHWqGMXmClvbuZErp3n/WgEehLEayX sDljc1sV5lo2O83sPcNfmaYY1HyV0NsQG2PilZBpC33+6WqP02f1IhNgdNr7Z6hT6aru LTU2A1OaZqwDfGncJSO9K00pyAmBZBcSJ12G6cBnWN0ywoMm5AH+Brjk+qVFFWtaTBoz 5A4w== X-Forwarded-Encrypted: i=1; AJvYcCUaa2KALfVf09a9jq2iIPPk6ci3CDAjlS0XDAk5Fw2rQCfSitHXN6xi7jMtm9yUt3G4kfiy02OYZool/BHIvzPINK+F/nYDOTf2McOdGZY= X-Gm-Message-State: AOJu0YyI01VQ9prFG7uO+2umTNlaG96tLcCzdX/8EpX6O4Uo+gRjyP6B wDbAU1JHSlwd/qYPbu79q5SqFZOGM+CXf/MJO7yg+nB5sPlc788mK34DLvdiKc4BnHP5Z2Rr0zg w1ohwvLIY/88KRw== X-Google-Smtp-Source: AGHT+IGSTd2Faw/xxTTIOFcjZU6XoSywzCymMkcL6RSxc1cWkvGesZw83sqTekVWN+hk1GX/DwF4g1RUgZ89YD0= X-Received: from aliceryhl.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:35bd]) (user=aliceryhl job=sendgmr) by 2002:a05:6902:707:b0:e05:a1df:5644 with SMTP id 3f1490d57ef6-e0b9e101779mr28879276.2.1722344798181; Tue, 30 Jul 2024 06:06:38 -0700 (PDT) Date: Tue, 30 Jul 2024 13:06:32 +0000 Precedence: bulk X-Mailing-List: rust-for-linux@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 X-B4-Tracking: v=1; b=H4sIAFflqGYC/x3MTQqAIBBA4avErBuwH5G6SrQoG2sgxlAoQbp70 vJbvJchUmCKMFYZAt0c2UtBU1dgj0V2Qt6KoVVtr0yn0PlAvAv6R5b1JLxYcPUJdaOtM4MajLF Q6iuQ4/Sfp/l9P2hCtGVpAAAA X-Developer-Key: i=aliceryhl@google.com; a=openpgp; fpr=49F6C1FAA74960F43A5B86A1EE7A392FDE96209F X-Developer-Signature: v=1; a=openpgp-sha256; l=2220; i=aliceryhl@google.com; h=from:subject:message-id; bh=jEounkARTWSXuP9TGoR+2S+iU6PCZFgHt6WY+kyo3Tg=; b=owEBbQKS/ZANAwAKAQRYvu5YxjlGAcsmYgBmqOVZaPfq/TmW8akkNQvdByFITNP/lMpGaX6Zx JhrqcG47RSJAjMEAAEKAB0WIQSDkqKUTWQHCvFIvbIEWL7uWMY5RgUCZqjlWQAKCRAEWL7uWMY5 RiBqEACwAHfImZQ54ckAVJtY5E9fGjzziUgR4Gd9ZthH66+Z5UOeLhcesS9HPsqg4xydZG/eyic yQCmPBqQWnfhtEFnyG1fbukZEp2OBESnuk+Ekl8ohEKN2tvG7Gw9yOBHuqyNsZzG7riYWWn25bZ EvsbQLN8EKWvBkq+1XSATeQs64TMP/2m0gHHpoRizoVn2JnmJqlfckknB6umXmtJuAJUWcG4KpQ 2najbjqBjtBxgnccklGhlHYcMcHMTfhi09kbWYsfb8umxH5KfMQfD/9l2m5LAeMHm8OB+iMjJiU c68aKE52janaL8/oQMM7As+4bMNEmW44mLcvfh3bvAMRV+urM8FLIjME2LyPV0QFEGRU4+UJYrg E3x8LPcgK1Y7DlmtEmDc9gxdHP+uFuWrJCV6Y3SLco7QvENs5Z0TwWT9Nzes04PxWPpKXeJBqqp Nage0XOU2YC/eN/L3XzXUWT6wWQfi4hvjFuAw9Qy5lcpXjRPKfwQm9GkekXSdaBe5Bo9+Gpay7+ DKhlZtpoX31taLcQHuGKmFiERb1jCR/NcSF6yYgl+h4WGPhVufweDV6eaowfE1TNfbYTUAA0BnZ eGJ1pLgurxVWwSAIvj9TZhV1oFfZdK/lVt9GMLVI+h+nwE4qZVO4gcRd1SC/IW1LlM4oCkof7Xe NLIB1AZE2VtVayQ== X-Mailer: b4 0.13.0 Message-ID: <20240730-foreign-ownable-pin-box-v1-1-b1d70cdae541@google.com> Subject: [PATCH] rust: implement ForeignOwnable for Pin> From: Alice Ryhl To: Miguel Ojeda Cc: Alex Gaynor , Wedson Almeida Filho , Boqun Feng , Gary Guo , "=?utf-8?q?Bj=C3=B6rn_Roy_Baron?=" , Benno Lossin , Andreas Hindborg , rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Alice Ryhl Content-Type: text/plain; charset="utf-8" We already implement ForeignOwnable for Box, but it may be useful to store pinned data in a ForeignOwnable container. This patch makes that possible. This will be used together with upcoming miscdev abstractions, which Binder will use when binderfs is disabled. Signed-off-by: Alice Ryhl --- rust/kernel/types.rs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/rust/kernel/types.rs b/rust/kernel/types.rs index bd189d646adb..132ca1113083 100644 --- a/rust/kernel/types.rs +++ b/rust/kernel/types.rs @@ -9,6 +9,7 @@ marker::{PhantomData, PhantomPinned}, mem::MaybeUninit, ops::{Deref, DerefMut}, + pin::Pin, ptr::NonNull, }; @@ -89,6 +90,32 @@ unsafe fn from_foreign(ptr: *const core::ffi::c_void) -> Self { } } +impl ForeignOwnable for Pin> { + type Borrowed<'a> = Pin<&'a T>; + + fn into_foreign(self) -> *const core::ffi::c_void { + // SAFETY: We are still treating the box as pinned. + Box::into_raw(unsafe { Pin::into_inner_unchecked(self) }) as _ + } + + unsafe fn borrow<'a>(ptr: *const core::ffi::c_void) -> Pin<&'a T> { + // SAFETY: The safety requirements for this function ensure that the object is still alive, + // so it is safe to dereference the raw pointer. + // The safety requirements of `from_foreign` also ensure that the object remains alive for + // the lifetime of the returned value. + let r = unsafe { &*ptr.cast() }; + + // SAFETY: This pointer originates from a `Pin>`. + unsafe { Pin::new_unchecked(r) } + } + + unsafe fn from_foreign(ptr: *const core::ffi::c_void) -> Self { + // SAFETY: The safety requirements of this function ensure that `ptr` comes from a previous + // call to `Self::into_foreign`. + unsafe { Pin::new_unchecked(Box::from_raw(ptr as _)) } + } +} + impl ForeignOwnable for () { type Borrowed<'a> = (); --- base-commit: 8400291e289ee6b2bf9779ff1c83a291501f017b change-id: 20240730-foreign-ownable-pin-box-515cf790977c Best regards, -- Alice Ryhl