From nobody Fri Jun 12 21:38:20 2026 Received: from LO0P265CU003.outbound.protection.outlook.com (mail-uksouthazon11022118.outbound.protection.outlook.com [52.101.96.118]) (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 1D0D44C9005; Tue, 12 May 2026 12:10:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.96.118 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778587804; cv=fail; b=CgnCpdn4lZlvVT4OMktY4hBoZGCPW/wmnmFMuJku6ooJOy6la4I1kHugjOYwyvZuxH4x/s9mpe7KHh/ZBIWBihIMMrVzM0Wtf2Z9DE79lddkpJGpfLxh5fAltjbIU3uHpmm3sBxqeyLv8r3MHsBPEGypGuAc7ZjYiK3eppwUbIY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778587804; c=relaxed/simple; bh=u5LXXiEW9poXeDqRI0Vxq5VsTDSZs5/LBcHjil/3FBw=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=HtrV9012JU9I/1AZ5mMo5pTUpOn+nMJNs/xGda+8HYDh7OZtiNYzykPp/6gjJvjZdhHIikrrReab+8EkHBWs0eR2U8Q1Fc6FlSxGu/QvoWvg0cTQfxXTPWZz1nB2ryapXgLlpFKynk1OyK48Qk03KJD0McPqRFBO1hJEvppchaE= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=garyguo.net; spf=pass smtp.mailfrom=garyguo.net; dkim=pass (1024-bit key) header.d=garyguo.net header.i=@garyguo.net header.b=ZdTRUlOP; arc=fail smtp.client-ip=52.101.96.118 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=garyguo.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=garyguo.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=garyguo.net header.i=@garyguo.net header.b="ZdTRUlOP" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=hPZJngmiZZJYO4Fppe7LRvlOj9Y+oLA7IjbDEEocwzrJ6rGyEGgl3srEh1qBcY7BTMuV7yAL7DL0/SuH5bzNOH3fHUqT2XcpEdUl8FDS4rzXHaSFkLzX7y+VhB/oh99cxgBafq5EHA/DDDNolHE0zXwduxpz8WmdwAIEXvm6cvPLKq0tl/DZm0SyRmJvBqBZaE4dARv76+wG6GMyLyUJjqbCrM408xXep4exhzpu0uJnIpB5RlKMLrLUnO/4c4H36ccFRg/NKR6pfYBwthrSZJjYH/+9ZYKgE6gYatxHwCAeSKwT1mbndU1kiLOScTeHahtdGn3wP2SB10i4e2rlsw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=/Qkc22OKzw0wtA1+53+llsTIsMV2YHE9EINy6ztFj3E=; b=JzNoL0PREOW47gQnyUn/QKEq+hwzPmtbCqc/vz7uKmDMlhkinjR+88KDSdLh0IK1pT4QYX4M/QUh93BuQO804ZNvpavh4FTat0cxdeoQ0/BQToobyHDFzDKbceC+ahDxNzCFbfS2kMq3u2iPwoWoKegA3DiBLK09UhI6+aH7IJEqCAfPDAOei0IRpCZTUCPuplta6MTcZpXyPDOkgBvcqvL94t1Pu9cQ4F7Y/jALgCY4Ok0WbxdUn5DQSuQAqlTNSZC9cqnRcjv7wPFQg8tvBR6CTk9yGsFUE3MBsZL7bYcgONjn8AVOKv7NzBy0RPWTCsH15hrcV3ICYaqdXFR+LA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=garyguo.net; dmarc=pass action=none header.from=garyguo.net; dkim=pass header.d=garyguo.net; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=garyguo.net; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=/Qkc22OKzw0wtA1+53+llsTIsMV2YHE9EINy6ztFj3E=; b=ZdTRUlOPy8CA1PPFL4n46UPPqsn5eu7YrngTMjRaVyDdfQGsI/LQukywPiXKR1At8/qE34L+oVSvqkGhTcOIkyjVyg6Qe7aJT4G4kXd7DAgdpeJuapa5jM+02Ot1lLP7y/0fcp7j7gVr8wboHtGz9wK86ENZZcxYBgrK70E/IZ0= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=garyguo.net; Received: from LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:488::16) by CWLP265MB6214.GBRP265.PROD.OUTLOOK.COM (2603:10a6:400:184::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.23; Tue, 12 May 2026 12:09:55 +0000 Received: from LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM ([fe80::1c3:ceba:21b4:9986]) by LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM ([fe80::1c3:ceba:21b4:9986%4]) with mapi id 15.20.9913.009; Tue, 12 May 2026 12:09:55 +0000 From: Gary Guo Date: Tue, 12 May 2026 13:09:46 +0100 Subject: [PATCH 1/8] rust: pin-init: internal: pin_data: use closure for `handle_field` Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260512-pin-init-sync-v1-1-81963130dfbd@garyguo.net> References: <20260512-pin-init-sync-v1-0-81963130dfbd@garyguo.net> In-Reply-To: <20260512-pin-init-sync-v1-0-81963130dfbd@garyguo.net> To: Benno Lossin , Miguel Ojeda , Boqun Feng , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Gary Guo X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1778587794; l=7660; i=gary@garyguo.net; s=20221204; h=from:subject:message-id; bh=u5LXXiEW9poXeDqRI0Vxq5VsTDSZs5/LBcHjil/3FBw=; b=IEl6tZlIUNPEM0iYZXet0SF16T1RRtUIZR4YcA1j5KBFLBIgn08xXLVMhTL5bzSEvaEXKQoFm p7LR0IQu/vKDGWlb0OuSf9b9jGYTUg4wbRMggadDb8DuPMEQGKNX4rs X-Developer-Key: i=gary@garyguo.net; a=ed25519; pk=vB3uIX95SM4eVrIqo1DWNWKDKD2xzB+yLLLr0yOPYMo= X-ClientProxiedBy: LO4P265CA0185.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:311::14) To LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:488::16) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LOVP265MB8871:EE_|CWLP265MB6214:EE_ X-MS-Office365-Filtering-Correlation-Id: c734f7c0-0e0e-44c2-d0ee-08deb01f6129 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|7416014|10070799003|366016|18002099003|56012099003|22082099003; X-Microsoft-Antispam-Message-Info: IECAsPIbK1iubjixwSwgGH0LW9jnPseyvVVmr0t3YI1XK+ZcNbUu4kuhDriI99sFhSff4Uh0AZ94FqS6M16+tIU83TndeBKqpRUEO2S8d6EmS+V6sSm2ftg5yHvMKB6guQwYVWAo6J/l4wjM64Gfk9BMhsg2cDZVoMKtDtRuq/X9KwPyVSjQbMLSBPoO7pDyyoqMc0wnu/82QtizoTY6VwyAW2FdhXoBy/y6YpsJKNHU/KCdi+zGQpMvaN3wXd6ggbSwtj+6PbdSdpiYW6dpoJ2pZmmp0qn1lWU8dz6B4iol1wt+4Qi07sxW0w2Q5f10ANDCVmXehkMxDNXgByRVb+dq7Zhfpe0y6VPzSrg89jeI9BKMPTsfNdZ1cgnbf74MfOYNx9Zl5a0TXWidxXl36QHfsFCZQTpYxHIKnocaynQnsS8zzn7pvgIl21GT5/VSQC0EKATHzwc8J2/mScR1OdJQ1U5aw01pucNfYaAYU2hitWBVQWXxGToEAbF2nDyZNUPwq7HaW9i5IsI4tBmyiiGO7zMQZUECA2NTKVJYadq8JHqsa3vxkGWCh86zKdNDGJQmQdXFvAz6D7QYC8xb9BB4Ke4l1T3AlyRr3nN1raSvFV4228xD7C1jS/N98r/yYh/HLZorYwh24MfbK+mCCWaQjV8VSNbLqg1ndv3dVQs6fHhEAS2+VOTAKWAn9whV X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(7416014)(10070799003)(366016)(18002099003)(56012099003)(22082099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?b2Ywa2tlcDdtUS9BdllzZlJQNUpLQUNFVXc0aHRmZ0ZiNndJZmpOVXVwb2Ur?= =?utf-8?B?bTlKbWxuVnI1MjVKZXJIS1BNZGxjOVFSRzBPMjFJLzNiRVhtcXpFSW0wWGF0?= =?utf-8?B?QWxHa3hkWDY4V0dHN2hqQmVTaGx3eHMzTU9TZElOWjRQZFhwQmlEbGYvdjMv?= =?utf-8?B?bjhPbW5CemQ2NVZpTUZwajZiNnozUno3a0x2UU5FdmdRMUpDc0Y0VS95cTIy?= =?utf-8?B?WEhBTDdtL3MwdjFVWU5Ca1grK0x0dE1IRmV5ZnFBUEEzS1lSUzNjeXQzbzBT?= =?utf-8?B?Qkh0UmVCQWxWTWs2M3BPWnZ5eDJVNG9sU3Y0QzNVbWlIZTY2SWNBU3VwTVE0?= =?utf-8?B?SkIvY0svcVBtZFhCaWQxSDIyZUFqQVFUWmJ5TGt2dWpiWEFjYmUxK0VwUnho?= =?utf-8?B?TzRMTk1ueDB2cENHN3pWcmpYWWh6R0wrSkl0azUxZ1Y2ZWpsZkxJaFJ6YjJX?= =?utf-8?B?ajJwNitKRGZDc2YwSlFXdEIyYzZPMlZxMkE0QjRLaHFMdHRQblNXZEx4SUdB?= =?utf-8?B?VEppUEdCQmdwY2dObXVzR05ic2UrbktnTzZWRmN2ZXlONDJWYUFOR3gvTi9H?= =?utf-8?B?YnUrcFM1dkE4KzR5M0tUeVpBQXFyVmgyZ0JXaHgvRzV4clgxakJhK3pGUXl1?= =?utf-8?B?TWJ1NE5wUXVCSGxjSVFRamg0R0M4enVITGNpOWhvT0F1MFZPOGZHakdjQ1JG?= =?utf-8?B?M1M2SkFjQlB4TTZ3RTE5c3RlYy9sTzM3WjNVRGNmT0k1Ui9kNnM4STB6K3Yz?= =?utf-8?B?aHQ4MXY4R0JnMnRqTnlIa1FtUUYxTEdrRE1hWG5tUnJnL0pRK256cktUcTRY?= =?utf-8?B?WnhBbHFRQzUwSkJtazg0NnVZbis2Y3lNQkxWcUlxa1VkdWpWMmlVS1kxOFhQ?= =?utf-8?B?aCtyN1N1aEJqQk96RHQ5VUxiaVNWYW5lTFBGaVVFeGV5NnBnTG5kaFJTN29y?= =?utf-8?B?SzdlbDZCSjlaTXQzakFKUzdRSXNna2laMG1FS1JLc2toOG13RWRIa3lUVXJ5?= =?utf-8?B?QTZTdGlBMTlzSVVGUUdEeDhRaGwzTTVRQkxiV0J0V3ZBdHNUK0Z5cGV5QTJk?= =?utf-8?B?L0V5cmVmUzArT2NVV29PSktkZTlGbGRMRXhTK00xcEpmSEFzblFMOTZJRGNP?= =?utf-8?B?Uk9Zb1dZK05FWk8yL1hGUXZZZVhUTnVwVmVIQXFQQmhoZlhCOFc5K3J4aDYy?= =?utf-8?B?YjhVZmxaNE8wV3RCaWVrNndOd0pLZ1Uxb2gvaFdlRGpMWXljOHVTNlBPTmhE?= =?utf-8?B?OW9MVUpWdTdqTFJsOFZYUkUwOE1TdEtrS3c2REtZbTJYb0MvOUg5ZHBQTnkz?= =?utf-8?B?c1FTOWUrNXRHc1RBMTJEMS9aT0ZPL2hsYzE4OVJ3dXRxeGZ6Z004M2tVdUtR?= =?utf-8?B?eXozUHRKeDhUT210NDY1Wkc3Q1lXWURqSlRXdWQrbEQraEVkR2s3VTlmNHZn?= =?utf-8?B?aGxqb0JVMUw5R2dCR1V0Sko4TFNESUxZT1hDZ2hvN3BZTVhxVDE4SzhwUi9P?= =?utf-8?B?blBZUGdnT3I0ZlUrSkkzUWdtZ0JSd2VDc1ZXNGt3bmw5Rnk5N0J2TXR6WFEr?= =?utf-8?B?cTcrbjhIN2RUSXphYkR3a0ZrNW4rTkdFUDJta1l4dytzSjQySHNNRGRMVzNs?= =?utf-8?B?czJLdnpSNWphZG1RWnc2cDh5MWVEYjUwZGkzZEZkOFdjM3pReXdRZ1B4Umsr?= =?utf-8?B?ZHc5L0swMU9Bbkl3dHp2VXVDKzhIVXdHaTFnRno5YWZCaTBFSUdiVEh1Uy9P?= =?utf-8?B?ZFVvcisrVE1wOUVldjZzRVA1OFRTWThhMFpEaDNqUWdDcVpoS0J1bFdTWTc5?= =?utf-8?B?dU9hNzgwWnV1bGhIcWtacFNDV1c3MjRKV1ZFb21qWm1HQkxhRnI5ZUE4U0du?= =?utf-8?B?a2IwU2tHRVpZZHBwUHV1bnpFWEh0V2xxWGhDVStrVGpRenNNMWl4ekYxQzRX?= =?utf-8?B?REhDdHBzUDdzRldzUFl3WGRXeFJ0OXdQZFY1QzJzSGExSFNJT1lUajRmUnlB?= =?utf-8?B?dlRxMG1oYWFqazFzRUNwZHF0YmMwVWM3Y3ZDbW1RU3hhSHMrclJKUWo2Nk0r?= =?utf-8?B?UkdCVGxFUzh6ZTl2WVRLNjZxWnJ4NGIrK0o0V251NVJGUzVOejRvUGpBQ0xN?= =?utf-8?B?V0dTY3IvWVVJTU1DbTU4R1dUc205cm9vQmllb1FULzNjcjgxU0ZyWDVpQ2Yw?= =?utf-8?B?bks1RTVHOUx6Tm92YmxPdVhVUjQ0QUNTQVpKWVVlLzZ1cVhBRjJCS2lPQ01P?= =?utf-8?B?eFZaUVdkZU9WNVJobkRZbjdzeXNmQ1NkNEJqSUxrMnBDbHVoNW01NWpvU0hi?= =?utf-8?B?TjZ1VzM5TkY0NFJEdXRPWGJmdVg1MEVJSWhySEJhU2RPNGRZOHN0QT09?= X-OriginatorOrg: garyguo.net X-MS-Exchange-CrossTenant-Network-Message-Id: c734f7c0-0e0e-44c2-d0ee-08deb01f6129 X-MS-Exchange-CrossTenant-AuthSource: LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 May 2026 12:09:55.4523 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: bbc898ad-b10f-4e10-8552-d9377b823d45 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: zEuemvTZ028IgxyoRMfdGr3PrYifYFIbW10/dxEjuQQCQ4OviQd0/FI3YXbtHZVR1IdLGPkLtMNQsJpbnJSj5w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CWLP265MB6214 `handle_field` is currently a function, which precludes it from referencing things in the scope of the parent function. Given that it's only called once, inline its contents to the closure that invokes it instead, so it can directly reference `struct_name` without having to pass in as argument. Signed-off-by: Gary Guo --- rust/pin-init/internal/src/pin_data.rs | 144 ++++++++++++++++-------------= ---- 1 file changed, 70 insertions(+), 74 deletions(-) diff --git a/rust/pin-init/internal/src/pin_data.rs b/rust/pin-init/interna= l/src/pin_data.rs index be3d97a38225..1a7098a4c6e0 100644 --- a/rust/pin-init/internal/src/pin_data.rs +++ b/rust/pin-init/internal/src/pin_data.rs @@ -336,7 +336,7 @@ impl #impl_generics #ident #ty_generics =20 fn generate_the_pin_data( vis: &Visibility, - ident: &Ident, + struct_name: &Ident, generics: &Generics, fields: &[(bool, &Field)], ) -> TokenStream { @@ -347,78 +347,74 @@ fn generate_the_pin_data( // not structurally pinned, then it can be initialized via `Init`. // // The functions are `unsafe` to prevent accidentally calling them. - fn handle_field( - Field { - vis, - ident, - ty, - attrs, - .. - }: &Field, - struct_ident: &Ident, - pinned: bool, - ) -> TokenStream { - let ident =3D ident - .as_ref() - .expect("only structs with named fields are supported"); - let project_ident =3D format_ident!("__project_{ident}"); - let (init_ty, init_fn, project_ty, project_body, pin_safety) =3D i= f pinned { - ( - quote!(PinInit), - quote!(__pinned_init), - quote!(::core::pin::Pin<&'__slot mut #ty>), - // SAFETY: this field is structurally pinned. - quote!(unsafe { ::core::pin::Pin::new_unchecked(slot) }), - quote!( - /// - `slot` will not move until it is dropped, i.e. i= t will be pinned. - ), - ) - } else { - ( - quote!(Init), - quote!(__init), - quote!(&'__slot mut #ty), - quote!(slot), - quote!(), - ) - }; - let slot_safety =3D format!( - " `slot` points at the field `{ident}` inside of `{struct_iden= t}`, which is pinned.", - ); - quote! { - /// # Safety - /// - /// - `slot` is a valid pointer to uninitialized memory. - /// - the caller does not touch `slot` when `Err` is returned,= they are only permitted - /// to deallocate. - #pin_safety - #(#attrs)* - #vis unsafe fn #ident( - self, - slot: *mut #ty, - init: impl ::pin_init::#init_ty<#ty, E>, - ) -> ::core::result::Result<(), E> { - // SAFETY: this function has the same safety requirements = as the __init function - // called below. - unsafe { ::pin_init::#init_ty::#init_fn(init, slot) } - } - - /// # Safety - /// - #[doc =3D #slot_safety] - #(#attrs)* - #vis unsafe fn #project_ident<'__slot>( - self, - slot: &'__slot mut #ty, - ) -> #project_ty { - #project_body - } - } - } - let field_accessors =3D fields .iter() - .map(|(pinned, field)| handle_field(field, ident, *pinned)) + .map(|(pinned, field)| { + let Field { + vis, + ident, + ty, + attrs, + .. + } =3D field; + + let field_name =3D ident + .as_ref() + .expect("only structs with named fields are supported"); + let project_ident =3D format_ident!("__project_{field_name}"); + let (init_ty, init_fn, project_ty, project_body, pin_safety) = =3D if *pinned { + ( + quote!(PinInit), + quote!(__pinned_init), + quote!(::core::pin::Pin<&'__slot mut #ty>), + // SAFETY: this field is structurally pinned. + quote!(unsafe { ::core::pin::Pin::new_unchecked(slot) = }), + quote!( + /// - `slot` will not move until it is dropped, i.= e. it will be pinned. + ), + ) + } else { + ( + quote!(Init), + quote!(__init), + quote!(&'__slot mut #ty), + quote!(slot), + quote!(), + ) + }; + let slot_safety =3D format!( + " `slot` points at the field `{field_name}` inside of `{st= ruct_name}`, which is pinned.", + ); + quote! { + /// # Safety + /// + /// - `slot` is a valid pointer to uninitialized memory. + /// - the caller does not touch `slot` when `Err` is retur= ned, they are only + /// permitted to deallocate. + #pin_safety + #(#attrs)* + #vis unsafe fn #field_name( + self, + slot: *mut #ty, + init: impl ::pin_init::#init_ty<#ty, E>, + ) -> ::core::result::Result<(), E> { + // SAFETY: this function has the same safety requireme= nts as the __init function + // called below. + unsafe { ::pin_init::#init_ty::#init_fn(init, slot) } + } + + /// # Safety + /// + #[doc =3D #slot_safety] + #(#attrs)* + #vis unsafe fn #project_ident<'__slot>( + self, + slot: &'__slot mut #ty, + ) -> #project_ty { + #project_body + } + } + }) .collect::(); quote! { // We declare this struct which will host all of the projection fu= nction for our type. It @@ -428,7 +424,7 @@ fn handle_field( #whr { __phantom: ::core::marker::PhantomData< - fn(#ident #ty_generics) -> #ident #ty_generics + fn(#struct_name #ty_generics) -> #struct_name #ty_generics >, } =20 @@ -452,7 +448,7 @@ impl #impl_generics __ThePinData #ty_generics =20 // SAFETY: We have added the correct projection functions above to= `__ThePinData` and // we also use the least restrictive generics possible. - unsafe impl #impl_generics ::pin_init::__internal::HasPinData for = #ident #ty_generics + unsafe impl #impl_generics ::pin_init::__internal::HasPinData for = #struct_name #ty_generics #whr { type PinData =3D __ThePinData #ty_generics; @@ -466,7 +462,7 @@ unsafe fn __pin_data() -> Self::PinData { unsafe impl #impl_generics ::pin_init::__internal::PinData for __T= hePinData #ty_generics #whr { - type Datee =3D #ident #ty_generics; + type Datee =3D #struct_name #ty_generics; } } } --=20 2.51.2 From nobody Fri Jun 12 21:38:20 2026 Received: from LO0P265CU003.outbound.protection.outlook.com (mail-uksouthazon11022118.outbound.protection.outlook.com [52.101.96.118]) (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 2FC2139B978; Tue, 12 May 2026 12:10:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.96.118 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778587804; cv=fail; b=n0V/HbZ6sNT3kR8gdKPp9UIXPTIdRVZFF8chsYNwyR/uWDDoIdIYkp15mgiINwqiXD+z40SUV5Mov/Mo1UDKBDNgIetG/QM2uL/5AJXw9Xobyi8nhIZi25Es1PLINElVN+6agYDC0Sz3SNrh5Poz9RkIaTAnnL/H2gxyAZIRFyc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778587804; c=relaxed/simple; bh=5tXzIjm7vWZYhcCX3hCm0NvA1SrqH8UMKR0dasGIK9M=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=URLhqho5fFVohwalJZ4iN4HRgWvBI5TXNrRvlcWFsH/GmSe1L3V7KlVBTWMdwYGkZ68LFZmfgGMz6UckkO7qM7fb3Nwg62F/8CUUd6iJhpROc9e14LvNh5iJE7iuJwhU2xPoc+g/vMwtU9HfuRDNw46PkfDG+NIeC5eS9SsYnl8= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=garyguo.net; spf=pass smtp.mailfrom=garyguo.net; dkim=pass (1024-bit key) header.d=garyguo.net header.i=@garyguo.net header.b=tIVOyJkF; arc=fail smtp.client-ip=52.101.96.118 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=garyguo.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=garyguo.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=garyguo.net header.i=@garyguo.net header.b="tIVOyJkF" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=RvmZ0XTZ9+s104FDkNcXtQBZUr3hlynmN5oYpcp1G9O8EvS91uHSYIcNeTSw/eLnHvQGbGQfRO70faSyIlQ7FRfYUGm21MOP3tnvDm1OfTByISF72xYkmMG7MpP7QAf6Q+6BKG9dAjRlZvNh9pxDEv8+rqjz2QV9iEFMjE6dwdbC9xl2YTd0yY8+D40pY6jnvCSXFSyBTL3uq633oxhRvp4CjOpK1XLTFT867ElVU31f50pecDs45OrkD3Ra34pUVtodSnFCyGyDwGEWEj3oOWSq4M0WVOkymgCV1rmik1xrHXMcoLDZftCYigBODgmDooqA9B/gc6m0CGoCZ7yzJg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=4F/b/5LV+ok7+qe2BynuejyNmhsWxgW93/W6apEYbWw=; b=DiB8NJYOl7kV8/31woZkhwxIhw30RoAcyLLnPAFVtvDhUx16hCuTxF/pI9bIb87GoBKF7LIwdrhjC77/sThAUNyxLwyYI6A1oawelyWtRnF7Ch37KlvDMhVsU5oHvn781EmcztL8iad3CPllfEUtUU1K6/+lb7BN98a0s+a7wflapRU7UFhV/W+g8Bjdeg7oHtvM/3lo7jWa5TcgW8Bs/OUpRK4dlZ4Kbm/U91MDt6EQo5MIckZMS915MC0ZNLDsjFG6qc4Up2SoJfr4iS/7LqO+nFruFYCb8yhB+f/6dDTTGfE7yusKJX33KiiJC4KA+Dt23/ffgmTxQUg0qeEgxw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=garyguo.net; dmarc=pass action=none header.from=garyguo.net; dkim=pass header.d=garyguo.net; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=garyguo.net; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=4F/b/5LV+ok7+qe2BynuejyNmhsWxgW93/W6apEYbWw=; b=tIVOyJkFRGKwYpsAYDp5CqA7jEc5eohGCJTchOuU/SYF4NB9wYjuQjCmpuaDYTURejIkWnD0m79j7H+geWVFB+goCpss5rtG0CcmvWud5rCuKvfjLDu04CZ6lm/CEefHKD1e/+LtYsZ2SG5iaWySzi5qTyV6NZZeS8fwkDJm58I= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=garyguo.net; Received: from LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:488::16) by CWLP265MB6214.GBRP265.PROD.OUTLOOK.COM (2603:10a6:400:184::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.23; Tue, 12 May 2026 12:09:56 +0000 Received: from LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM ([fe80::1c3:ceba:21b4:9986]) by LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM ([fe80::1c3:ceba:21b4:9986%4]) with mapi id 15.20.9913.009; Tue, 12 May 2026 12:09:56 +0000 From: Gary Guo Date: Tue, 12 May 2026 13:09:47 +0100 Subject: [PATCH 2/8] rust: pin-init: internal: pin_data: add struct to record field info Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260512-pin-init-sync-v1-2-81963130dfbd@garyguo.net> References: <20260512-pin-init-sync-v1-0-81963130dfbd@garyguo.net> In-Reply-To: <20260512-pin-init-sync-v1-0-81963130dfbd@garyguo.net> To: Benno Lossin , Miguel Ojeda , Boqun Feng , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Gary Guo , Mohamad Alsadhan X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1778587794; l=6285; i=gary@garyguo.net; s=20221204; h=from:subject:message-id; bh=Mj4fG9PJEbprNRBl8PEHNEkHDoHd+pPyBnmpgd9DfJM=; b=IjYGVeUJsTxE/e3L4ZNubI3UnIxAIPODXcjo2eq0ynslE/PSEeYRrxEoFbqKshA+aMzZn41uK mF8bbBHkTDjClviwayFjFT45S/bIf6qjOFnrxaD3e2GUNDpZ+hIKHRC X-Developer-Key: i=gary@garyguo.net; a=ed25519; pk=vB3uIX95SM4eVrIqo1DWNWKDKD2xzB+yLLLr0yOPYMo= X-ClientProxiedBy: LO4P265CA0185.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:311::14) To LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:488::16) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LOVP265MB8871:EE_|CWLP265MB6214:EE_ X-MS-Office365-Filtering-Correlation-Id: 5da61a8b-b38d-41ca-3c90-08deb01f6155 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|7416014|10070799003|366016|3023799003|18002099003|56012099003|22082099003; X-Microsoft-Antispam-Message-Info: 02/mCMVbDxwPW7BZ+BliIKoZNGScZeasuHJbRs5K8MITJH64Knhua0opiOrGoE2cgyymfBhWoYfadGYDkdI+V1t5AHxXQcK9jZApzG59NjEPeM1bIKG08Vqz5bGd1coGmGfuNCziZOg2doQ9LOfjSHPlx6sHvtLqINUcVuaaIKgnPW03BO21OnHUzzROvy5e8iQ+emfAxS8KTmLWu3aR/ikULdHrWLhLzqnBwnF4USDX98jjm3IZkoYtg/mApdXuzpRyE0ktxjbOWX05K1Ij2/BeXwkcVuYno2jqbwSPDvMGI1KFoxTc61RdFFMd50FBZkDq6/NSWGzmI/645GQTsBhZIcblib6VmhxA+Q4m7B67x1KPMJZMhPawi4H6SYEIW33JgYv3XockvTGuP5CmUcAZkOEcbORrn+K7IA5fnPuEvip1uH/8C8iWWQqXzmT7Tnn4MKK/URn4tNKOikVOD+5Pfc/mhuERp33h/LJg4qLE2Cqkkbx+e142OT/tnn6q01n8vx62y221zupY3YEkDezq/gCpdpDP1Uanu+EQccRiricq7u4PxkEyb5rvDugyKHjVFHMB1Xwu4FW7bJC6malLfM8fu9GaY/H+9hOwmpvD0s5kXuBh+07frjoxUyy6xMlRf0FIT1V5C1bazTx6dPAKSISdw29+EF/xsqfpB3COPg1P2lHf0VbOmhvIydEc X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(7416014)(10070799003)(366016)(3023799003)(18002099003)(56012099003)(22082099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?T1dLRmYyRFVIVzBCcUFaU0xLM2FuMGpKbnJDc0ZPaEZCekFjOC83bG9xQ3RN?= =?utf-8?B?dktIUmZuMkEraHlaQkwvejVVQUZ5d1VlS2hQWFQyOExxS3R5YnJ5OVRQQ01X?= =?utf-8?B?L0JOZVlDTkg1OVBJUFArR0hxZm5yY0cxTWFXeERXeHM0SWdnVms4ZDJqVnNh?= =?utf-8?B?Z25yU1RtOTUvM1NXamFDdTE4UlFtZTFmNHJYUzBkVlRJRjRXY0NjOUs2THFG?= =?utf-8?B?Y0E4RkJPc3RKeXRoYmFSdVR0TXQxc2MxUG9TU1hKbUZtTFlFVGxyZElDQ0ZR?= =?utf-8?B?TFlDQjM5T2FxVmJoZlNtQnZ5RkxhakYvWFhZNHFTY3VQUDlkU1A4ZmxqRGFT?= =?utf-8?B?RENKTnRGYnZRUzdLODkrVllJZWQyTVc4UE92WWpYMVY5VTJwNnJEZC9Wcm5s?= =?utf-8?B?S3JmbURoMzlSMU5pRHd5U0RuQ1gyQW1odFJJdEVyQ1hhRDZHOVozeXRWbXRJ?= =?utf-8?B?a3NPOFI1OE9KeG5mc3E3VHBvNjQ5L2NFWVcvVEM4RTFURU1USDUwUG9ZWGUv?= =?utf-8?B?YnRIRllJc0laTGJZd1RNa3FUTytkcEI1U0U4Vy81SXJVOWY2ZkRPekFhTXVJ?= =?utf-8?B?M1AvVldFVHVQTzRvQjc5T3F6Y2h6T041NVlRZlZmZktTZDZORG9Vdm9PZFh1?= =?utf-8?B?L3BHYlJ6NEliakROcEdnQ2s2RVI1aU90c05DVUpmSjZISjRCUkUrcTJKZnBr?= =?utf-8?B?ZkNTbFpBeVFQRnlyZytKeXFZMVlCMVVhc010eW94ekhtcTNzRXdJTlRxWjdo?= =?utf-8?B?T0lXV20raUJ3ck9ONXo2NlpObEJVeE9LTDZKUngzRkhQRTZsOSsxZDdmSjZj?= =?utf-8?B?RVFPSXMrbUNpbk5KQkhFbE9teUF0anVVWWtid2YxS2kyT0FrSGZwcUk0ZmMr?= =?utf-8?B?aUZ6S21aYzBweEs3K1R3bktHOGg0NlY3NzZzZERJcVNqaWl4MmNWUEJ2cG1t?= =?utf-8?B?ZjBZQUtOcm5wcVRrZStNMFdPYVUxMmd5aDJmRG5hTG5BOERLNXlxTis1VXo5?= =?utf-8?B?akphTFFUSjYzQ1Jnb1FBVzlGSnR2N3pXOHAzb3ZwK1pkR3dZOVhDU005S25L?= =?utf-8?B?T1FqQ3JhbXprTjQ3Zlcvdy9hTEF5Wkd3aGIyeTRuWlQ3SHBrTC90Y3A0dFF2?= =?utf-8?B?cFhZVi9tZ2RVMEp4NU01SEI3Q3JhbEZ3RXZyd1lRdnFPS2RHWWRBVVpuV1dz?= =?utf-8?B?N0lvN3BVZllXTTJ2UUpYVDBhNFExK0czaVk3YzVPL3BkRmtoQnFQa3JYZDdr?= =?utf-8?B?WkRNVmlVWXFMOUhnWm9hRCtua2NtZnMzc2ZVem4vNTVvS1dnc2N0OU9LQWJq?= =?utf-8?B?WFJRdGFHcW5NMjNyYTRhd2lTcGVtN0FqR1NnQ2Vna1RyNW8rNm1uQis4a0lq?= =?utf-8?B?UWk1S2FKV3FzSWVJbStxb2VQcmNCdDY2aFFyN0l3V00zcUZKQWR5dmgzcklY?= =?utf-8?B?UUtIcTBYRktsRFhnZEdxZDBBaUNRdklEQ3FNVmJQaWx0c3dTeEpwYzFneTZO?= =?utf-8?B?NndZTkVJai9pc2p2Q0FRV0dzcVA1NnJreURPMS81VlV4d1kwMFF6ZTFYODJC?= =?utf-8?B?VzExYjFGQWJUaFJSTHlVVzV1Q2lzdGRwTDlZdmFKNXIwYW91NVNIS3Y1OVRK?= =?utf-8?B?K3pzS3ozKy9uV3ZrTjRlTVRSb28vT082UnI1NmJFSTdiVElFZ21ZSEdndi9w?= =?utf-8?B?VE1UeUhGbW12aW02b1BycWljY21UUGRrR1BmMCtSTmg3UFU5cWg1WHUxQTNJ?= =?utf-8?B?UkRvdFZobWc3TnJKZW8yRktBU0RPVm9LdXRUbURyeSt2SUZvZXU2b0NSN2J1?= =?utf-8?B?RnNyQ2pyaU54ODJVWE52ZHE1RFpQcUhOQzVtVFhQSUlLdkROR0FyNGFVVUo3?= =?utf-8?B?OFIyZFk5WW9lZXY1WVdHS1FremtTRzI3dXphaldiWXZzQkhpRlVxN0xtaFFk?= =?utf-8?B?UTFwazVoTVY1anBnaDcvYWF0Wk9lVWdEdFNVRTlZWjlWcndMUDlKNTBQU0p6?= =?utf-8?B?ZmlNbEFmU3hyTkxFeHpLdTBvUitTTUsySlZnZ3dJcmIxeGhoYW5sZjU2Yzli?= =?utf-8?B?cmNuZFROTDNMLzNFaWh3WmpYUFU4WEx5SU11OFY2K0tJZ3NnVnRoNmFzS3VR?= =?utf-8?B?RGk3WDRnUnNSM09oWUlBMGtMSlI1VU1HamdUTi9hWnh1eVlxbzIxQ2pJQXIv?= =?utf-8?B?UVRHMTNJUHFsYzMxMHRjak9IQXJadG9OVnd5Sjg4bmJ3VzJ2VlJudjAzdVlF?= =?utf-8?B?d01SYTducEY1ZFlFbVJvdUNXaFkvTTc2Rk5DeVRYZDdEVzBMWUZ4MFpzVDZW?= =?utf-8?B?eGlnaWgwUG1SUjllTlBLWFFTZ3EzeVk5RnJVcEpucGYzRzlkNGRRQT09?= X-OriginatorOrg: garyguo.net X-MS-Exchange-CrossTenant-Network-Message-Id: 5da61a8b-b38d-41ca-3c90-08deb01f6155 X-MS-Exchange-CrossTenant-AuthSource: LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 May 2026 12:09:55.7345 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: bbc898ad-b10f-4e10-8552-d9377b823d45 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: FFXNp8GhqIN/qt9JlJKoWbZNaI8ur0qjurqahHtir8weltTkUmvIziEI2k5jhvAcuztIdb5Ls50XslMvXeFurw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CWLP265MB6214 From: Mohamad Alsadhan Introduce `FieldInfo` struct to encapsulate field and other relevant data, instead of carrying a pair of `(pinned, field)` in all places. This allows us to add more information to the struct in the future. Signed-off-by: Mohamad Alsadhan Co-developed-by: Gary Guo Signed-off-by: Gary Guo --- rust/pin-init/internal/src/pin_data.rs | 53 ++++++++++++++++++++----------= ---- 1 file changed, 32 insertions(+), 21 deletions(-) diff --git a/rust/pin-init/internal/src/pin_data.rs b/rust/pin-init/interna= l/src/pin_data.rs index 1a7098a4c6e0..0199d0143308 100644 --- a/rust/pin-init/internal/src/pin_data.rs +++ b/rust/pin-init/internal/src/pin_data.rs @@ -35,6 +35,11 @@ fn parse(input: syn::parse::ParseStream<'_>) -> syn::Res= ult { } } =20 +struct FieldInfo<'a> { + field: &'a Field, + pinned: bool, +} + pub(crate) fn pin_data( args: Args, input: Item, @@ -73,24 +78,30 @@ pub(crate) fn pin_data( replacer.visit_generics_mut(&mut struct_.generics); replacer.visit_fields_mut(&mut struct_.fields); =20 - let fields: Vec<(bool, &Field)> =3D struct_ + let fields: Vec> =3D struct_ .fields .iter_mut() .map(|field| { let len =3D field.attrs.len(); field.attrs.retain(|a| !a.path().is_ident("pin")); - (len !=3D field.attrs.len(), &*field) + let pinned =3D len !=3D field.attrs.len(); + + FieldInfo { + field: &*field, + pinned, + } }) .collect(); =20 - for (pinned, field) in &fields { - if !pinned && is_phantom_pinned(&field.ty) { + for field in &fields { + let ident =3D field.field.ident.as_ref().unwrap(); + + if !field.pinned && is_phantom_pinned(&field.field.ty) { dcx.warn( - field, + field.field, format!( - "The field `{}` of type `PhantomPinned` only has an ef= fect \ + "The field `{ident}` of type `PhantomPinned` only has = an effect \ if it has the `#[pin]` attribute", - field.ident.as_ref().unwrap(), ), ); } @@ -143,7 +154,7 @@ fn is_phantom_pinned(ty: &Type) -> bool { fn generate_unpin_impl( ident: &Ident, generics: &Generics, - fields: &[(bool, &Field)], + fields: &[FieldInfo<'_>], ) -> TokenStream { let (_, ty_generics, _) =3D generics.split_for_impl(); let mut generics_with_pin_lt =3D generics.clone(); @@ -160,7 +171,7 @@ fn generate_unpin_impl( else { unreachable!() }; - let pinned_fields =3D fields.iter().filter_map(|(b, f)| b.then_some(f)= ); + let pinned_fields =3D fields.iter().filter(|f| f.pinned).map(|f| f.fie= ld); quote! { // This struct will be used for the unpin analysis. It is needed, = because only structurally // pinned fields are relevant whether the struct should implement = `Unpin`. @@ -238,7 +249,7 @@ fn generate_projections( vis: &Visibility, ident: &Ident, generics: &Generics, - fields: &[(bool, &Field)], + fields: &[FieldInfo<'_>], ) -> TokenStream { let (impl_generics, ty_generics, _) =3D generics.split_for_impl(); let mut generics_with_pin_lt =3D generics.clone(); @@ -249,21 +260,21 @@ fn generate_projections( =20 let (fields_decl, fields_proj): (Vec<_>, Vec<_>) =3D fields .iter() - .map(|(pinned, field)| { + .map(|field| { let Field { vis, ident, ty, attrs, .. - } =3D field; + } =3D &field.field; =20 let mut no_doc_attrs =3D attrs.clone(); no_doc_attrs.retain(|a| !a.path().is_ident("doc")); let ident =3D ident .as_ref() .expect("only structs with named fields are supported"); - if *pinned { + if field.pinned { ( quote!( #(#attrs)* @@ -291,12 +302,12 @@ fn generate_projections( .collect(); let structurally_pinned_fields_docs =3D fields .iter() - .filter_map(|(pinned, field)| pinned.then_some(field)) - .map(|Field { ident, .. }| format!(" - `{}`", ident.as_ref().unwra= p())); + .filter(|f| f.pinned) + .map(|f| format!(" - `{}`", f.field.ident.as_ref().unwrap())); let not_structurally_pinned_fields_docs =3D fields .iter() - .filter_map(|(pinned, field)| (!pinned).then_some(field)) - .map(|Field { ident, .. }| format!(" - `{}`", ident.as_ref().unwra= p())); + .filter(|f| !f.pinned) + .map(|f| format!(" - `{}`", f.field.ident.as_ref().unwrap())); let docs =3D format!(" Pin-projections of [`{ident}`]"); quote! { #[doc =3D #docs] @@ -338,7 +349,7 @@ fn generate_the_pin_data( vis: &Visibility, struct_name: &Ident, generics: &Generics, - fields: &[(bool, &Field)], + fields: &[FieldInfo<'_>], ) -> TokenStream { let (impl_generics, ty_generics, whr) =3D generics.split_for_impl(); =20 @@ -349,20 +360,20 @@ fn generate_the_pin_data( // The functions are `unsafe` to prevent accidentally calling them. let field_accessors =3D fields .iter() - .map(|(pinned, field)| { + .map(|f| { let Field { vis, ident, ty, attrs, .. - } =3D field; + } =3D f.field; =20 let field_name =3D ident .as_ref() .expect("only structs with named fields are supported"); let project_ident =3D format_ident!("__project_{field_name}"); - let (init_ty, init_fn, project_ty, project_body, pin_safety) = =3D if *pinned { + let (init_ty, init_fn, project_ty, project_body, pin_safety) = =3D if f.pinned { ( quote!(PinInit), quote!(__pinned_init), --=20 2.51.2 From nobody Fri Jun 12 21:38:20 2026 Received: from LO0P265CU003.outbound.protection.outlook.com (mail-uksouthazon11022118.outbound.protection.outlook.com [52.101.96.118]) (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 D4FAE4F7977; Tue, 12 May 2026 12:10:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.96.118 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778587814; cv=fail; b=I8zN1S7DkWwITimiKTA/Me8Z4TnlZJWptJ3rfuuCPWtTgLQam8McGNph/PEwGG2NWNJmBXfQAtwL/cNJcwnAWGiOkVgszHf9h5OJk/oF+HY+bMczqUTr3L/4XXsnysAUZVSffWwCCJ7cukStmQb8gBlhJyxG6f5RQvkf/1cz7rM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778587814; c=relaxed/simple; bh=wVe98eXdDbBiqkvIFwgq0mab2KO/KEhWVbjROTmm7YM=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=MiEbjj6ANd+rKOKDajcXpkge943c5TxLaPsl/A5gixPLpk1NA/j5wteIMZscdQFB3w5hSZZpPtH5aNYfnUwMTSBWw3WUY7iK3ka954Nv2+VATXy/uaSGeU94jmPH9+k/2JWLtei2euzyGdK9Rbe9wXd3zWtnCNsl/eM3sONa8B8= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=garyguo.net; spf=pass smtp.mailfrom=garyguo.net; dkim=pass (1024-bit key) header.d=garyguo.net header.i=@garyguo.net header.b=mgO5hkFP; arc=fail smtp.client-ip=52.101.96.118 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=garyguo.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=garyguo.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=garyguo.net header.i=@garyguo.net header.b="mgO5hkFP" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ZVnFyppKC/npGIc1hH+bxUUNHhwv6pO+7AGVPew/FSivEUUDjzEOS+/Wy3Dlm82KjEkjoozCH5ZGTswq7zr1aO88eA5fmMF5pcTnyxVmMbiu9PkQvkDyIclS1J7f508YkzmG5xiE6mmnq+JF2BkJcEtKJ6ELAaRfhzpf2vz4TigRPRfgudWAfaiEbwOay+Zao4f4pRMyG7M1HpIwRxqVexSZeIRKMtOtL+d3JaIIeXwpicfup7AvgISYO0e6DYFuawGf9drNFj8Kx0mTeyy5b1W2IrMQefs0WoQKh9oJPJDFJ9e10UwnQuP0q42K3CYsuSqrc8XJJDT5smJCVBDaXw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=mZt9c3ykUy4oOQ/U69funTbycjMwbRlAy2/Zv1F4+8o=; b=G+sJmr46IFT/VHkMSI90LiH1KyV56VNbdU0QiYr4v0R9cCgebTMrNjGTbyszw/YhzO2KOse4r3qG2GeEpMqbe8OCADHWK9fj1nz7LW83k2XjRhu5fV2fzPNasYqqHI23OnIQKD/E/7msa+5vBKxr45QoQynsPE0kABf3s+hS0qZ652bzFQzJ5caMCb38lUup0uQhy586HmLfHVYiJQMYT5JwhrRaUkcnFrdUBPZMN7EZkQEUSEcyT4kefsYHvQraoYHsG+afIxpc6X2o42BnhoJx9nYSUYhEHRqSPNudh9YikBbzHlschb9JX7A7a7fQOJyjhGBpAPrNexziOH5SqA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=garyguo.net; dmarc=pass action=none header.from=garyguo.net; dkim=pass header.d=garyguo.net; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=garyguo.net; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=mZt9c3ykUy4oOQ/U69funTbycjMwbRlAy2/Zv1F4+8o=; b=mgO5hkFPBNtysHs3drVUfCE1fAwuv4V0Ai/Dnao3sniYdfCJQAB9pBclPeATvqq5hIpqS23ng4IHT7Jld+eNY3qCFaNhgcPQrzW5GpmdJrAx9NUgAitrTaZ8Z2/6Bfy7XDTlXz+a+pPLBl5UdWo1FejMEQ0cvrlFvGDFcAoljLk= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=garyguo.net; Received: from LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:488::16) by CWLP265MB6214.GBRP265.PROD.OUTLOOK.COM (2603:10a6:400:184::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.23; Tue, 12 May 2026 12:09:56 +0000 Received: from LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM ([fe80::1c3:ceba:21b4:9986]) by LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM ([fe80::1c3:ceba:21b4:9986%4]) with mapi id 15.20.9913.009; Tue, 12 May 2026 12:09:56 +0000 From: Gary Guo Date: Tue, 12 May 2026 13:09:48 +0100 Subject: [PATCH 3/8] rust: pin-init: internal: add `PhantomInvariant` and `PhantomInvariantLifetime` Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260512-pin-init-sync-v1-3-81963130dfbd@garyguo.net> References: <20260512-pin-init-sync-v1-0-81963130dfbd@garyguo.net> In-Reply-To: <20260512-pin-init-sync-v1-0-81963130dfbd@garyguo.net> To: Benno Lossin , Miguel Ojeda , Boqun Feng , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Gary Guo X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1778587794; l=7961; i=gary@garyguo.net; s=20221204; h=from:subject:message-id; bh=wVe98eXdDbBiqkvIFwgq0mab2KO/KEhWVbjROTmm7YM=; b=6VFhocP9+Q5MEvNNpaHMdRtCljB6VDTBwYKUd2Clq/oUT1i3ht/PLXjgRBRTcdEKHrC+1EN0V 7sru98PRwp1AXlWYdy3ZI3qLH6KO7fAuV+kNj/+3BOpafe4UZmWZgf7 X-Developer-Key: i=gary@garyguo.net; a=ed25519; pk=vB3uIX95SM4eVrIqo1DWNWKDKD2xzB+yLLLr0yOPYMo= X-ClientProxiedBy: LO4P265CA0185.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:311::14) To LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:488::16) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LOVP265MB8871:EE_|CWLP265MB6214:EE_ X-MS-Office365-Filtering-Correlation-Id: d60cade4-ada1-4769-9c08-08deb01f617d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|7416014|10070799003|366016|18002099003|56012099003|22082099003; X-Microsoft-Antispam-Message-Info: sPkutFoMMil6ejwLjRcyCALiKgEPVMMiZew8gMReHS5Jts2fwS7VdUWYjcj540oDcFxoGSHzTP/Sv3QwD3e1t/m3Dy0JGSuFHdDgA/VlPLhwvN55O4vSRwYIlXKrl8Cry7xE80xPZ19d4mKx5Zc9LlM9yJ0EBlv62Fh/rQ3nQRRTS20jbRtVgH58ncWhNCWLoUmTgL3/OmmblxktV5+8jHry74YyEUt5ahE4MhmMZwos1efMcDO0WNTBbgk60DOYdCSFct7HVCJrpGV3s/E0JWKhZ/u5arS3lfsl+vux0BMpEmuEI9bAR1LhhY1cA9foCZhBpD+3jk3prLRY+cFErsdWZ43SNlLLCtGNv1BOSjnxiZjvkI+6W6EFwwmPKM36MK20yqVbn9pyzPeUtDdXfQ/XKP1csDzqIA5E7XPntBSlxbgwvfNVIv6pSriL9YkJlxlXQI+j4DlHpgScDnQ5BbpIY4DgLk7XBNonW9st4u2olcAtxOX/wZ4K7dKC7CWDaHafszSsk/ZBVvuCC2+1JR67FSp2zVhXzZ1Lsx5Eq8vCrPppncIzRe2bgT7LSu5twrOmYY6T9YFv6vFWIOt8LWVwKyCP8JoB2PMXULhs4tLSmqwPzehzxhS+Gb3EKIu7sQ9EBZrPYPpCTfLIpGhiqA== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(7416014)(10070799003)(366016)(18002099003)(56012099003)(22082099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?SWpnNzJQbUJQVktNNjRQcThpMlNpeStXS25lTHhBaGpKTWsrNWFKdnRNU0ZC?= =?utf-8?B?dG5ZRVNnbTduRmwrNmp3ZDU3K0U2S3hIMUQyOFF0bHV5K2dqQmNKajRKM0NO?= =?utf-8?B?cUlwdDdwNzlGcTlWN1QrUEhDOVVNc2t2UDRkY3ZFYTVmT0psd1NSRC9OQXMw?= =?utf-8?B?YjgxTXBGSjQycmlQYTlscHpPNlVtdGxzSGVUVm9rdUJ2Nk5ROFRNS2pVdmxP?= =?utf-8?B?bW9ZNnprU1Vnd1NORUVCWHRSYlF0dlp3Rmx2eFhIWm9SL2NqNFZHdDlvWEQx?= =?utf-8?B?NHBYN0lPTEpSSDIwTUFMOWFySFVlVVV2djlCZVZtT2Jwd25lWmN0OXZWaTdh?= =?utf-8?B?R05pREUySW1aeEpZNnBlTHpwN3ZzMkFnek9UY2QrckxQLzRLay92TnFZSGpj?= =?utf-8?B?TU53c3VNNGVxSDNLNW9hZ1Q5VndndlBNcVEydHFEWDQvOGYxWUtJTXU4RDN5?= =?utf-8?B?YjA2STBLY1p2REhZb2RhTDArUStqY2o5QlhBZEJZSGJKZSswSDVkajBudldK?= =?utf-8?B?TVNlcTl5U1cxZXNVa3ZQMURmaWFCY1RpWUNvNFRhTjJyNGVYdHJ0V2FtLzhR?= =?utf-8?B?Q2hkSFBvT3huS1VSc2dHL0pLSGpjWm90Nm1YVDJUenZJS2xGc2hTL2dlTzlO?= =?utf-8?B?bVNvanlMR2UvN2dKdysxNTNxZ3dwbE15Zm9CdjFMTXZWN3FvZ2hueURoRDFv?= =?utf-8?B?cElDOTFpanowZWVjS0hBcFVCOW50RkVNYmhNUE9OK3hDWkRkc2tENHBSWTBG?= =?utf-8?B?dmlDT2x3ei9BMkJJQXFDS3NjblVIT2NqVm1vZ3AvM1ZYY2xpOElFYlpmUmVp?= =?utf-8?B?SFlzdnc1cC9KYlhHa2JMMlVJQSthbFBkb1pDWUtKRUJQSFNsU2I4SU4wTlNr?= =?utf-8?B?LzR3VEFjZjY0b1F3L1g0MEs2ZVlwL1YzZlBCZUpUMTZCQm9BNVovY1Z1M3Zm?= =?utf-8?B?RmF6YVpGWmpkaXR3MmhsR3VtVlJYZ3JORFNoanp1NVl1RHJCS3lyMXhZdzQz?= =?utf-8?B?bjVQYkZzVWhGdTNWcFl4NHFhMnllVjRMdGRadTVvWjIyZWEwdll6d0Flajlk?= =?utf-8?B?bllFOGtkMW1CaXBEUktJU0tKeWs2eFhLSHFzdDhqcldnNTJrc3B6d0tvWUQv?= =?utf-8?B?SGVNKzlBcFRJbW0wamdxdHZCMVdYamYwM1VVWTdudE1jeUtZdEE0UnNONEhi?= =?utf-8?B?NCtTaW9sZ0VvdTREMlNnUGhyeWFTVWdBTWdlYWM1ajNSRUFoaXpQaEpnMmtV?= =?utf-8?B?am54bUxJU0dxMzhxd2tjTTBYRnFwN1pwdDlybGxrWkxCNkxvbFozRFNnM09Z?= =?utf-8?B?M0VGSDFNRTlJc0JBS2lQbExzNCt6TWUxeUJPTWFGY3BQK0orTWtkcHNYRnJN?= =?utf-8?B?TFF0Q1krd0ROeGdKZWdGTldOY1BsTUV1UnRxTEYyQVZFWjgyVEZlRFllRUVD?= =?utf-8?B?c2tDMTdlUTRsYU02QXJ0SkN2Z0xiOWEwd3RTSDRoLzRoOWd4NytlS0RmeVFH?= =?utf-8?B?blVvdXBlYXNXL2hHZVV1M242bWpJUzRBMDB4NE1QLzV0Z1R1aTZYbVZqZkxi?= =?utf-8?B?ZGFTVUk2cmpUYkhGejRUNElyUzl1RGNjUTlBR3h5K2VqMy9aUHQxaUhnd3hs?= =?utf-8?B?bFZsOExyaUtDK3VFV2x4eXNXcGFuOENZaFRlN2ZjVFVLTWRUTThHb3ZrUyt0?= =?utf-8?B?aktnR3pxa1dwb200RHR5QjRFWGNFY3NkK0NUWStzNE5qNGJwV0VDQ25qS0xJ?= =?utf-8?B?YlNwdG9UYVJvZ0xFYXJ5alk4ZEcvYjIyNy92Uk8rUmRsZEtQUWppbkpXckw1?= =?utf-8?B?YVRzbk53eUsyeTJGTU11QnY0b2pJYjVrV0ZSUnJyMUxvS01TM2NjWDdKbUVk?= =?utf-8?B?NTRjbkZRNXhTSHlTSEJJRHRMV0ZqTWE0YVFneXUvMmtDajllSWRSRXV0U2V0?= =?utf-8?B?Y2lsYlBobTRGcTRGbEJhbU55OEJoMVd2WE8rRktSUkdLanlNbXQweGFLU3pJ?= =?utf-8?B?T2tXd0QrT3ZOQThKN3RyNnUva1dMVEFsaGc5MythNHN0aHZoOFFsNm1WVkUy?= =?utf-8?B?WmxJNVpCQkpDb3pGdFhHMnZXRVpEclFiRW5wK3lGYUJHSFc5L1FPbGlUQjV3?= =?utf-8?B?MTI1YWdXTDVHRjBCY2d4T0tYS0I3THBXZnpwZisyanJPcXErT0N6Mk1objZq?= =?utf-8?B?V1dZaW1rRms3Y21mcDJ5TXRkQ3F2OWJBUUFwL1RPMmdvd2FYTWRXYnZHNm1T?= =?utf-8?B?eThrQXRyK0swVktiR2xjNEl4WHZNWEV5L2Uya0pMMmN3bEhBVklBVzRYcWsz?= =?utf-8?B?QWZpNDNUZzVSWm1uUFF6RTArTElEVys1OWZvUitoRUp1eks2RXRsdz09?= X-OriginatorOrg: garyguo.net X-MS-Exchange-CrossTenant-Network-Message-Id: d60cade4-ada1-4769-9c08-08deb01f617d X-MS-Exchange-CrossTenant-AuthSource: LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 May 2026 12:09:55.9967 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: bbc898ad-b10f-4e10-8552-d9377b823d45 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: kCJ55ptCauAB02hYIk60Wd6kakD5v20WH330+kUztoAA+8CJvTBiOiKItVvDBO/3ffsyqoXjth9NyA8XB4Vq+g== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CWLP265MB6214 Currently, the `pin_init` library has an `Invariant` type alias, and it is instantiated using `PhantomData`. Generated code from `pin_data` on the other hand cannot access the crate-local type alias, so it generates `PhantomData T>` directly. This is all very inconsistent, despite the exact same use case of ensuring invariance. Add `PhantomInvariant` and `PhantomInvariantLifetime` and switch all users that need to express the concept of invariance to use these. They're polyfills of unstable types in the same names in the Rust standard library. Signed-off-by: Gary Guo --- rust/pin-init/internal/src/pin_data.rs | 12 +++----- rust/pin-init/src/__internal.rs | 56 +++++++++++++++++++++++++++++-= ---- rust/pin-init/src/lib.rs | 12 ++++---- 3 files changed, 59 insertions(+), 21 deletions(-) diff --git a/rust/pin-init/internal/src/pin_data.rs b/rust/pin-init/interna= l/src/pin_data.rs index 0199d0143308..44d0bd18e4ae 100644 --- a/rust/pin-init/internal/src/pin_data.rs +++ b/rust/pin-init/internal/src/pin_data.rs @@ -180,10 +180,8 @@ struct __Unpin #generics_with_pin_lt #where_token #predicates { - __phantom_pin: ::core::marker::PhantomData &= '__pin ()>, - __phantom: ::core::marker::PhantomData< - fn(#ident #ty_generics) -> #ident #ty_generics - >, + __phantom_pin: ::pin_init::__internal::PhantomInvariantLifetim= e<'__pin>, + __phantom: ::pin_init::__internal::PhantomInvariant<#ident #ty= _generics>, #(#pinned_fields),* } =20 @@ -434,9 +432,7 @@ fn generate_the_pin_data( #vis struct __ThePinData #generics #whr { - __phantom: ::core::marker::PhantomData< - fn(#struct_name #ty_generics) -> #struct_name #ty_generics - >, + __phantom: ::pin_init::__internal::PhantomInvariant<#struct_na= me #ty_generics>, } =20 impl #impl_generics ::core::clone::Clone for __ThePinData #ty_gene= rics @@ -465,7 +461,7 @@ unsafe impl #impl_generics ::pin_init::__internal::HasP= inData for #struct_name # type PinData =3D __ThePinData #ty_generics; =20 unsafe fn __pin_data() -> Self::PinData { - __ThePinData { __phantom: ::core::marker::PhantomData } + __ThePinData { __phantom: ::pin_init::__internal::PhantomI= nvariant::new() } } } =20 diff --git a/rust/pin-init/src/__internal.rs b/rust/pin-init/src/__internal= .rs index 5720a621aed7..e54d90a4742e 100644 --- a/rust/pin-init/src/__internal.rs +++ b/rust/pin-init/src/__internal.rs @@ -7,20 +7,62 @@ =20 use super::*; =20 -/// See the [nomicon] for what subtyping is. See also [this table]. +/// Zero-sized type used to mark a type as invariant. +/// +/// This is a polyfill for the [unstable type] in the standard library of = the same name. /// -/// The reason for not using `PhantomData<*mut T>` is that that type never= implements [`Send`] and -/// [`Sync`]. Hence `fn(*mut T) -> *mut T` is used, as that type always im= plements them. +/// See the [nomicon] for what subtyping is. See also [this table]. /// +/// [unstable type]: https://doc.rust-lang.org/nightly/std/marker/struct.P= hantomInvariant.html /// [nomicon]: https://doc.rust-lang.org/nomicon/subtyping.html /// [this table]: https://doc.rust-lang.org/nomicon/phantom-data.html#tabl= e-of-phantomdata-patterns -pub(crate) type Invariant =3D PhantomData *mut T>; +#[repr(transparent)] +pub struct PhantomInvariant(PhantomData T>); + +impl Clone for PhantomInvariant { + #[inline(always)] + fn clone(&self) -> Self { + *self + } +} + +impl Copy for PhantomInvariant {} + +impl Default for PhantomInvariant { + #[inline(always)] + fn default() -> Self { + Self::new() + } +} + +impl PhantomInvariant { + #[inline(always)] + pub const fn new() -> Self { + Self(PhantomData) + } +} + +/// Zero-sized type used to mark a lifetime as invariant. +/// +/// This is a polyfill for the [unstable type] in the standard library of = the same name. +/// +/// [unstable type]: https://doc.rust-lang.org/nightly/std/marker/struct.P= hantomInvariantLifetime.html +#[repr(transparent)] +#[derive(Clone, Copy, Default)] +pub struct PhantomInvariantLifetime<'a>(PhantomInvariant<&'a ()>); + +impl PhantomInvariantLifetime<'_> { + #[inline(always)] + pub const fn new() -> Self { + Self(PhantomInvariant::new()) + } +} =20 /// Module-internal type implementing `PinInit` and `Init`. /// /// It is unsafe to create this type, since the closure needs to fulfill t= he same safety /// requirement as the `__pinned_init`/`__init` functions. -pub(crate) struct InitClosure(pub(crate) F, pub(crate) In= variant<(E, T)>); +pub(crate) struct InitClosure(pub(crate) F, pub(crate) Ph= antomInvariant<(E, T)>); =20 // SAFETY: While constructing the `InitClosure`, the user promised that it= upholds the // `__init` invariants. @@ -126,7 +168,7 @@ fn make_closure(self, f: F) -> F } } =20 -pub struct AllData(Invariant); +pub struct AllData(PhantomInvariant); =20 impl Clone for AllData { fn clone(&self) -> Self { @@ -146,7 +188,7 @@ unsafe impl HasInitData for T { type InitData =3D AllData; =20 unsafe fn __init_data() -> Self::InitData { - AllData(PhantomData) + AllData(PhantomInvariant::new()) } } =20 diff --git a/rust/pin-init/src/lib.rs b/rust/pin-init/src/lib.rs index 80c476e605f7..4098c65d63c3 100644 --- a/rust/pin-init/src/lib.rs +++ b/rust/pin-init/src/lib.rs @@ -947,12 +947,12 @@ fn pin_chain(self, f: F) -> ChainPinInit where F: FnOnce(Pin<&mut T>) -> Result<(), E>, { - ChainPinInit(self, f, PhantomData) + ChainPinInit(self, f, __internal::PhantomInvariant::new()) } } =20 /// An initializer returned by [`PinInit::pin_chain`]. -pub struct ChainPinInit(I, F, __internal::Invariant<(E= , T)>); +pub struct ChainPinInit(I, F, __internal::PhantomInvar= iant<(E, T)>); =20 // SAFETY: The `__pinned_init` function is implemented such that it // - returns `Ok(())` on successful initialization, @@ -1055,12 +1055,12 @@ fn chain(self, f: F) -> ChainInit where F: FnOnce(&mut T) -> Result<(), E>, { - ChainInit(self, f, PhantomData) + ChainInit(self, f, __internal::PhantomInvariant::new()) } } =20 /// An initializer returned by [`Init::chain`]. -pub struct ChainInit(I, F, __internal::Invariant<(E, T= )>); +pub struct ChainInit(I, F, __internal::PhantomInvarian= t<(E, T)>); =20 // SAFETY: The `__init` function is implemented such that it // - returns `Ok(())` on successful initialization, @@ -1108,7 +1108,7 @@ unsafe fn __pinned_init(self, slot: *mut T) -> Result= <(), E> { pub const unsafe fn pin_init_from_closure( f: impl FnOnce(*mut T) -> Result<(), E>, ) -> impl PinInit { - __internal::InitClosure(f, PhantomData) + __internal::InitClosure(f, __internal::PhantomInvariant::new()) } =20 /// Creates a new [`Init`] from the given closure. @@ -1127,7 +1127,7 @@ unsafe fn __pinned_init(self, slot: *mut T) -> Result= <(), E> { pub const unsafe fn init_from_closure( f: impl FnOnce(*mut T) -> Result<(), E>, ) -> impl Init { - __internal::InitClosure(f, PhantomData) + __internal::InitClosure(f, __internal::PhantomInvariant::new()) } =20 /// Changes the to be initialized type. --=20 2.51.2 From nobody Fri Jun 12 21:38:20 2026 Received: from LO0P265CU003.outbound.protection.outlook.com (mail-uksouthazon11022118.outbound.protection.outlook.com [52.101.96.118]) (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 E7E7B4F7971; Tue, 12 May 2026 12:10:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.96.118 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778587806; cv=fail; b=DjxhIJVdPvU4cKyi81b/Mo0k+2cxZkmhaV92oXtYZWy7P77IBuhvbATW443+JFxOK5sbmIMTP9hvwk4m82U5vlUoivRuW8GdRdc3PeT3YZhnk6qyuzFfhnXLGae05dWNOzy6zELwF9Hpw45m9XwOBFajqDnwQwLEtD9CbroiA9o= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778587806; c=relaxed/simple; bh=IW6WSZIeMslrlvz2i2TeL2a8P+0L/nbg/s7OdhOKlLM=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=lv/seidU8ftn3vb3B0sgI1U/gerVh3Bt8eXEa5E13R4uGcEhIir50tdkwCnBv3JWoyumG9JnPZnZwnOBw/2qcCxWIobPEsjAT1MSmEMQs3j4rvEc0UPHHEcagoAw13okk68UxMLySxenlGKLpoU3O/NhsgM1InF+ABNVQsqc97g= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=garyguo.net; spf=pass smtp.mailfrom=garyguo.net; dkim=pass (1024-bit key) header.d=garyguo.net header.i=@garyguo.net header.b=vAX4+oz0; arc=fail smtp.client-ip=52.101.96.118 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=garyguo.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=garyguo.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=garyguo.net header.i=@garyguo.net header.b="vAX4+oz0" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=XN97ZgyIl/2XAI2/Hw/itbAAD/jsaa38tHEnL2D3K8eoe2z0ddTNJtaCp5UIXFvIkT4zDlAkEkAnwdBgYEKHP1Ne1kaCg0ZRYg4yQ3e68cpTigFIriXhWokvULHhgS3it2/5qP7xfoXjp7bgAV9LIjSWsCFe/KShWLFVRez6kELthQGGBENbwrb/ggOKk7t4ji9vj9T/QUN9x0ziSZa7rQY6R11TeuAdblf7nQ5cH/B15DGBcmDsvq7DugbUkYSnzCsv/QxoCl67JKoaYe1c3sDRS/hhSDd18W465/ycTKCjrKKHa/FuPigXtD25ar/OGsEZLIe59fjLf7JjQ/9eeA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=m6QrgC3B4ZdrzfUI1M6XXW1LRggecbi8eIeUfyMSF8o=; b=b45k7VQZc2Z0Thms7H3ke609uNHli5L4oSzMXjO0ZoK3W81aNlCgVY+GU5qaFbWzamnjSFpVb8T3tkl7hSB2XyluMAiLkGfNjSSBYdwOfq8loygtMlHRmJPBSY2VJIuiOv90T9C+AKfU/HmM9xZuMziM3YoFM6yhwg60ojyo33oU8B2EMaOkKKdpf0pUA63pjyVGSVdLIjoRj8yYN96eMdxOZ8/TyuJha4C48dZOu01zZC2eH3ZjfTGHghjh6uTS2L2nkqRTpfvrot+MYRMOJxZSzSj+D3IlvhE240EL4sQL9iXO+Ut11D/RGR97+6RxHmAr5LL82eWTMhQ//QVOZQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=garyguo.net; dmarc=pass action=none header.from=garyguo.net; dkim=pass header.d=garyguo.net; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=garyguo.net; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=m6QrgC3B4ZdrzfUI1M6XXW1LRggecbi8eIeUfyMSF8o=; b=vAX4+oz04R3Ptn9f24zu0JVPhYOYgnF3I+TiQzHB0xwgaxsAjwAx6diDoUsrD42vxGVIYKos35BvysDjbeLfSBKl0he/WeMYwm8susP0LLXPGDa/CpJDIMa2DnCbywwSWfz6nENYP35ebeJaRAegIpHQOxNREcGZIorT8yftPfU= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=garyguo.net; Received: from LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:488::16) by CWLP265MB6214.GBRP265.PROD.OUTLOOK.COM (2603:10a6:400:184::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.23; Tue, 12 May 2026 12:09:56 +0000 Received: from LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM ([fe80::1c3:ceba:21b4:9986]) by LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM ([fe80::1c3:ceba:21b4:9986%4]) with mapi id 15.20.9913.009; Tue, 12 May 2026 12:09:56 +0000 From: Gary Guo Date: Tue, 12 May 2026 13:09:49 +0100 Subject: [PATCH 4/8] rust: pin-init: internal: init: handle code blocks early Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260512-pin-init-sync-v1-4-81963130dfbd@garyguo.net> References: <20260512-pin-init-sync-v1-0-81963130dfbd@garyguo.net> In-Reply-To: <20260512-pin-init-sync-v1-0-81963130dfbd@garyguo.net> To: Benno Lossin , Miguel Ojeda , Boqun Feng , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Gary Guo X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1778587794; l=5392; i=gary@garyguo.net; s=20221204; h=from:subject:message-id; bh=IW6WSZIeMslrlvz2i2TeL2a8P+0L/nbg/s7OdhOKlLM=; b=7qpVpDQf5SbdexCRaGCvepoJ7Tz7nfUwtCmQPrNYHn2w/3hyxCFJXeH5RykYR/UFI9/DWh43N ANHtVboGP5hDaESgnkea9lXpydY1Fy36vzUDarVbjPtS27vxoQ24/Bn X-Developer-Key: i=gary@garyguo.net; a=ed25519; pk=vB3uIX95SM4eVrIqo1DWNWKDKD2xzB+yLLLr0yOPYMo= X-ClientProxiedBy: LO4P265CA0185.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:311::14) To LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:488::16) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LOVP265MB8871:EE_|CWLP265MB6214:EE_ X-MS-Office365-Filtering-Correlation-Id: 0c5e4752-3232-4c6b-59a8-08deb01f61a8 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|7416014|10070799003|366016|18002099003|56012099003|22082099003; X-Microsoft-Antispam-Message-Info: IT9NrKVZsD4KKgOHtN3euOZ9ZIEu41mkvGeeo5ywjYNVaSHS+sVYXSrY1S7GReAochr77sIpoHt/J/nk55aCCXl3J+3egy6bHz62G/uzI4guqosibmMGmKsTS7QBdvEaEbUsv5ZuyRs8c4yDG0NrFxbCVU3r+q9vi+VTqpM+u6Jqihseag5loEmSzoarEB5bgHzS9HwnWl6izQvT4hbyfnUVCvPZX2G3V6FOX8ft7LmG/eDeeT0QlRNDNnpiFL2tPo/e7rmgMjnpKjELWWyAZ1cCwuZcrEtZl8LOJbvjBdpt2l7W0HeGwrkrLDGgDyAwgBaHxpVqBVqikkBFd+HSBme7/dBhtxhj4lxMjeF9I2qhvZqYiy6IUjqbZt2bpNXqCQ94j34SrNHlDWA1XUckbUo5TMh/Yf817wlu+Xn2akaZxa6cJ54nVQe8/nNi/K4FBBSOXpFjCJXlUWmL/Az0O4107Fdt8ydg12Ain9nrsup/ZxaTNufVkoU9+OPUfXuOyh16xnNZMXvBCoJOfJolq8pOF3XbaJzxje69bo9rhtpSPZa3BeF/b5bVmbAxrWLu80U9cOjhjTUyZDouTUoRnEuFFaqh9PbinkSt+Exeg0hHKNpQhyv4fAQHthro2o85XQ5UYiPWl3h/ZDyuuiCudTFuiyvVy/BFcjSKCw8w2acdQD4FUqFMzqUtemt7m5m8 X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(7416014)(10070799003)(366016)(18002099003)(56012099003)(22082099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?TlNvaWJNVC9oYlQzbkYyMEtzZ2YyK0NKYzJVa2VYMGNUc0U3VEYwM09pNjRL?= =?utf-8?B?emN6QVptRFFvTktlSW1tUkhEQmU4WE5KNGFlNDY1NVR2bkJ4WGFvQXBVM1Zr?= =?utf-8?B?TitLdDNEVHMrTUVMWncrbWZ6WTg2OUtwSVpPaldNRVRuZVpwc0tTOUNVWU9u?= =?utf-8?B?NFBkdXc2MElqc0xnSjhaT25rSUtiazV1SWRxZXNPT1pwRzh4ZnFZQmV6VmZT?= =?utf-8?B?cndmU2o4Y1dYUlJoTXJKOTVxb1ljNTVhWnM2ZWk0M0UyNmZnZ3RxWmVuUzE4?= =?utf-8?B?ckpRbGJEVHA3K3NUK1RnZlJXYzRNMVNSVERUT2lIaFliWldEdkJ6WDR0RzFz?= =?utf-8?B?bHpqTHdhUHFGZGVsNGtsYWJsc0N1WG1MQVpMVktNeGhiL0xRMkQ1dERodm1R?= =?utf-8?B?ZlExMlNMSXlqbU5IRFpEdFh6aVc0d0pieGR0QWhNci9vNnQ3RjBiNmQ5K0tM?= =?utf-8?B?WENmV1NhUm5lQzRpWDNCOEhGS2hvU1loY3RhWUsySGFjTmIweVZpRTlPSU5Y?= =?utf-8?B?TEVuNzFzQTE2eENMZVkxZTY0WmdYZWt0M0xPdmtuSUNwekF3cmc5QU5WUXFC?= =?utf-8?B?eGtUc1NBK2ZlMkxKZkcvRGJRUDV5WWJzMGVKRFhCL0owUWgvdHRLZ2FnTGw0?= =?utf-8?B?bHVLZkJHR2M2SFVkNkx6TmpuSzBOcXBtQXNDQXRqMlhDbXdFdlV2N1FnU2R1?= =?utf-8?B?UHk5eFByaHpRYlRsejY0TXlyVlNXd2V2MndZNWcxRHAva0VjTXkvVGRDNWls?= =?utf-8?B?ZHFkZVZqMXNHT2hUbEhLUm9hRWs3aEVIZUV2RDN5bEJDdzhRdWdvUTRaMkJo?= =?utf-8?B?cE5KOUFUaHhDeDMxeXZ2TnZJWVM1ZUhuQzZ6NE5qNHhxUzhlRDRtY1l1bnRy?= =?utf-8?B?a0tFQks1YTRsU1VmcnZjczJhYnNGdVpEUkgwaEhpTTV5UDhqbkcrVUJPMWVR?= =?utf-8?B?OXl0YStmN0Zrei9XOWVTYkVoM0REUnBITjB1ZnpVakxkRVZKcSswSHFDay81?= =?utf-8?B?V0pkdjhvd25MMzlON3ZZVG9SZlRaTW40VTIxRmxpMlJvc2xwQ0RnZUU1bXBS?= =?utf-8?B?M08vQlVaZjhTb0JSVDZCcGpCNjFPclJkVEFveUhxYUNJaFRGeXpSWi84YktG?= =?utf-8?B?N1NTK01IRzh4R053eEsrOGk1bVEvbFRRSGVLWTQwMGc3dHk1WkdxL2NSeWtZ?= =?utf-8?B?am1UVXgrb3U5STZ3dHY4UTJnVVNDSE1mMk0yd1ZtQk1WNnljQnJBalN2Wmgv?= =?utf-8?B?bW85MTRqUlpwUStoWE1wZzB1TTVpTml3SUlicWJ6blVsdnZGS0hBUnBGTy9Z?= =?utf-8?B?QzFreFpPb0RkRVJNVkVkclpvakZBZnNKUTcxMjN1T3lydEdoZmFMOEtzM2VH?= =?utf-8?B?b0tucm10MzVQc042cVlaQnpnSm1GVUkvaFZYL2JKekJyallFWUdWd0R4TCtF?= =?utf-8?B?K1B4VDlFRkI4VXNRYkpWYVhCYUtiUFhhS1d3TGhkT0RucXBYMzZZS3ljYnp6?= =?utf-8?B?TTBpK2c4eE1ya1Y5UFZYMmFUaHc0WmE5bVM5TzFSUGZHbkg2UEJQWFFLaWNl?= =?utf-8?B?TVpNVU9ZbFRtQWlEZEVzMU1NS1FsQmtsSExYL1M4R1lyZVVUQmNxUEtCNUVE?= =?utf-8?B?eEFBaW1ZeER3blY3S3p2amFQajd5ajMrM3VzeWVSVEVCc1pTd2ZUS1BHWThy?= =?utf-8?B?cTl3WVBkZlM3QXIxMDhYZUJISDlYUzg2SDhTWERidmxuclJRVkU3QXdNeUZI?= =?utf-8?B?RkZwUktzVEVZSFQralFDT1NtaGNFMTFwNmQwZUhPYjBXbzFUMC9Qa0Z4UXdv?= =?utf-8?B?Z0xrUCtuZEF4c1R2dENhcmZtUStJRklJZEMwNSsrbnUvYVhnSjBQbVlnSUpR?= =?utf-8?B?dUpLbm95MlRaNSttMFhFMXIvSXplamdXSGswdXkrR3haSGRvR1h3Y29waHY3?= =?utf-8?B?bGNjazFpaDdudG82ZitqOVBzT216VWo0cUg1LzBVUG9YNjZmdEZnNEtoS0Rm?= =?utf-8?B?TnZJQ2d0bGprcSt0aFBIa3ZrTGVBTUlEYUl0amtwa0JzL214OERjYzRrTjFs?= =?utf-8?B?aFh4R09NUWs4ZU9Ia3I5RXQ5cUYvTFNKN01jamJQemsxY2IwTkl3RVdEK3BS?= =?utf-8?B?ZmdGeFpIMU9TdFYvemFrQ2VGSkFpV1F6WGN0S0dpMDBoNVVxb3E0MDZFN2tn?= =?utf-8?B?U295N290eWZpNlFLcHU3NW9NQXZOekg5WEFUejRjT2ZKWm9Xa0oxaUR5WEtN?= =?utf-8?B?TkcrZTlFVmVZOUpTSTQzcTdDdzNHbkRBV2YwbXhBcExoZkdmdTZnVmRQYjMz?= =?utf-8?B?dE9Xc3d2MUtCQmMyb3lTdTZuVjVxeTVzZWpBOTZJaERDRmJnRE5wQT09?= X-OriginatorOrg: garyguo.net X-MS-Exchange-CrossTenant-Network-Message-Id: 0c5e4752-3232-4c6b-59a8-08deb01f61a8 X-MS-Exchange-CrossTenant-AuthSource: LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 May 2026 12:09:56.2840 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: bbc898ad-b10f-4e10-8552-d9377b823d45 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: INV0MvHhTIiBpYtCdB318pzS8p0VKDCahBU2DATjEb4kAeVZubOIrB99viF1iLzYDaBjh2gBcTn+QbA6w0wkYw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CWLP265MB6214 `InitializerKind::Code` is a special case where it does not initialize a field, and thus generate no guard and accessors. Handle it earlier and make the rest of the code more linear. Signed-off-by: Gary Guo --- rust/pin-init/internal/src/init.rs | 100 ++++++++++++++++++++-------------= ---- 1 file changed, 55 insertions(+), 45 deletions(-) diff --git a/rust/pin-init/internal/src/init.rs b/rust/pin-init/internal/sr= c/init.rs index b0bfe44695e1..7eda1bcf0f28 100644 --- a/rust/pin-init/internal/src/init.rs +++ b/rust/pin-init/internal/src/init.rs @@ -231,6 +231,20 @@ fn init_fields( cfgs.retain(|attr| attr.path().is_ident("cfg")); cfgs }; + + let ident =3D match kind { + InitializerKind::Value { ident, .. } =3D> ident, + InitializerKind::Init { ident, .. } =3D> ident, + InitializerKind::Code { block, .. } =3D> { + res.extend(quote! { + #(#attrs)* + #[allow(unused_braces)] + #block + }); + continue; + } + }; + let init =3D match kind { InitializerKind::Value { ident, value } =3D> { let mut value_ident =3D ident.clone(); @@ -283,55 +297,51 @@ fn init_fields( } } } - InitializerKind::Code { block: value, .. } =3D> quote! { - #(#attrs)* - #[allow(unused_braces)] - #value - }, + InitializerKind::Code { .. } =3D> unreachable!(), }; - res.extend(init); - if let Some(ident) =3D kind.ident() { - // `mixed_site` ensures that the guard is not accessible to th= e user-controlled code. - let guard =3D format_ident!("__{ident}_guard", span =3D Span::= mixed_site()); =20 - // NOTE: The reference is derived from the guard so that it on= ly lives as long as the - // guard does and cannot escape the scope. If it's created via= `&mut (*#slot).#ident` - // like the unaligned field guard, it will become effectively = `'static`. - let accessor =3D if pinned { - let project_ident =3D format_ident!("__project_{ident}"); - quote! { - // SAFETY: the initialization is pinned. - unsafe { #data.#project_ident(#guard.let_binding()) } - } - } else { - quote! { - #guard.let_binding() - } - }; + // `mixed_site` ensures that the guard is not accessible to the us= er-controlled code. + let guard =3D format_ident!("__{ident}_guard", span =3D Span::mixe= d_site()); =20 - res.extend(quote! { - #(#cfgs)* - // Create the drop guard. - // - // SAFETY: - // - `&raw mut (*slot).#ident` is valid. - // - `make_field_check` checks that `&raw mut (*slot).#ide= nt` is properly aligned. - // - `(*slot).#ident` has been initialized above. - // - We only need the ownership to the pointee back when i= nitialization has - // succeeded, where we `forget` the guard. - let mut #guard =3D unsafe { - ::pin_init::__internal::DropGuard::new( - &raw mut (*slot).#ident - ) - }; + // NOTE: The reference is derived from the guard so that it only l= ives as long as the + // guard does and cannot escape the scope. If it's created via `&m= ut (*#slot).#ident` + // like the unaligned field guard, it will become effectively `'st= atic`. + let accessor =3D if pinned { + let project_ident =3D format_ident!("__project_{ident}"); + quote! { + // SAFETY: the initialization is pinned. + unsafe { #data.#project_ident(#guard.let_binding()) } + } + } else { + quote! { + #guard.let_binding() + } + }; =20 - #(#cfgs)* - #[allow(unused_variables)] - let #ident =3D #accessor; - }); - guards.push(guard); - guard_attrs.push(cfgs); - } + res.extend(quote! { + #init + + #(#cfgs)* + // Create the drop guard. + // + // SAFETY: + // - `&raw mut (*slot).#ident` is valid. + // - `make_field_check` checks that `&raw mut (*slot).#ident` = is properly aligned. + // - `(*slot).#ident` has been initialized above. + // - We only need the ownership to the pointee back when initi= alization has + // succeeded, where we `forget` the guard. + let mut #guard =3D unsafe { + ::pin_init::__internal::DropGuard::new( + &raw mut (*slot).#ident + ) + }; + + #(#cfgs)* + #[allow(unused_variables)] + let #ident =3D #accessor; + }); + guards.push(guard); + guard_attrs.push(cfgs); } quote! { #res --=20 2.51.2 From nobody Fri Jun 12 21:38:20 2026 Received: from LO0P265CU003.outbound.protection.outlook.com (mail-uksouthazon11022118.outbound.protection.outlook.com [52.101.96.118]) (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 3EBBD4CA280; Tue, 12 May 2026 12:10:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.96.118 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778587807; cv=fail; b=XLP78oVWKLE2XsF/uzMeWcqn8zz0Rl3jJBt5uFlYZ9Q/vlojjBvyPuIb2/bJq6zgpfHnLvggmatEeAAUUzrmBjUC7mADuj5ybBnnq0nYmJorXgPFL/FiiWTGVdvKkZ2jC/p1jPsAtmjGWIJ3dkLkbuys+IPv/yAmP+mORUxvOIs= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778587807; c=relaxed/simple; bh=HHHAwCty7cveQAMrxdPS3dRCliHgr1zs5SZeFweeV4w=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=YXyZu9RwhobUD/tm9QU0SoxWZPU9jYg/cv6zTYU86G0GHn3+6DdG8SUvyjkWM3ruq8pCmxROvkBKVlDqvh8JgxbdIkBeMx9omAiO+Za/Q2oUbbueRqUJ50POLt/NK9s9T67dY9tPQiHg4SOSfzfgP2/Wv++KpUYpLKwibww3zfU= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=garyguo.net; spf=pass smtp.mailfrom=garyguo.net; dkim=pass (1024-bit key) header.d=garyguo.net header.i=@garyguo.net header.b=R7DYCeRr; arc=fail smtp.client-ip=52.101.96.118 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=garyguo.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=garyguo.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=garyguo.net header.i=@garyguo.net header.b="R7DYCeRr" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=d95rUSziSIClEUw0w4b5o8nX3+vDFHF7wyVpsD8JRVm73TTbf9ttCeljSXVJqhLS4sKI6bTXSz6Ks2ley8Z3YXHIRwLuJtHkCY08xBIZJEECdSiTue6P+Wve9v7lHx1te6zpwl4VnZsuvqzvvvQ+XCKKQQxRQnMVA10WWEe6fY9STzWd2DnEFKVOy3gjRVs3EYmlr8XEX+XS3Fv0BJGgN3f0XZYS3gKzsQS5wUh3NbgE8aQ756Zs6rEiJlyT9EgNAD8TrXsh+AIyyGZ8FieNxA/y3xyRgIjjQDaA3L09bcQ571JYnu/B6pr6Xzjlc3KIfdHSyaQKvtUhAd5p9Jk18w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=1f63FkkWtxHPFcrjwz3UDl/JpUdDGe24EJ1Or9q7fbY=; b=Z64WR+P39kdpHyxCQzfIiW2HNxKoEAWbqDggCSVDNPJb2e6QT+4BBM24UdmNk5ht9LFbDxIhtetv24g76IHSw33NED0DzJ6L5Mp+CYAdfT0yhrarcPb78nIaxxbhDZMRcJg6HY1/N4FuHKmJqqiuqDRGh/S9RDY2Pj+a2cEr3x+Mjum8JxmGm8MHlffDGIiSzZDKkDdlfAsR29V3uz9RbV8dNnxcM3cAvEE3po3wRTEX7vcyu/Rze4KeSi3a0dapqiMjlN5NUhYZ4d79ABGJ/YNcDs5gzgImaw/DqHkeeprOqJHYStLyxd290Jokp/y127dm/tUdmMYOGHskzLMItg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=garyguo.net; dmarc=pass action=none header.from=garyguo.net; dkim=pass header.d=garyguo.net; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=garyguo.net; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=1f63FkkWtxHPFcrjwz3UDl/JpUdDGe24EJ1Or9q7fbY=; b=R7DYCeRrY+eQh0j/7/gTPTqwedKCS4JQRCimUMhYoYz68DDHYxQ2V2Z1+EoSWjCuajG36Jo5Q8YqAZu7HOwV8ieEgWS4ATx5DiKOYGNVU/0gC5g5LHXQiwumsCIYysLfDIrxiWkb/3GG4yh2Wx6SX56TKHSznIPDLCN5/xfIhZQ= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=garyguo.net; Received: from LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:488::16) by CWLP265MB6214.GBRP265.PROD.OUTLOOK.COM (2603:10a6:400:184::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.23; Tue, 12 May 2026 12:09:57 +0000 Received: from LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM ([fe80::1c3:ceba:21b4:9986]) by LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM ([fe80::1c3:ceba:21b4:9986%4]) with mapi id 15.20.9913.009; Tue, 12 May 2026 12:09:57 +0000 From: Gary Guo Date: Tue, 12 May 2026 13:09:50 +0100 Subject: [PATCH 5/8] rust: pin-init: internal: use marker on drop guard type for pinned fields Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260512-pin-init-sync-v1-5-81963130dfbd@garyguo.net> References: <20260512-pin-init-sync-v1-0-81963130dfbd@garyguo.net> In-Reply-To: <20260512-pin-init-sync-v1-0-81963130dfbd@garyguo.net> To: Benno Lossin , Miguel Ojeda , Boqun Feng , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Gary Guo X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1778587794; l=9737; i=gary@garyguo.net; s=20221204; h=from:subject:message-id; bh=HHHAwCty7cveQAMrxdPS3dRCliHgr1zs5SZeFweeV4w=; b=fpk02gPs4CSdi6Uk+uj9fvP9qSLu5FgRiUYnqRd5CTB5HK1uDxwCj5S+Jup5lw0tiNsVYtr/m PAbogaufu1VAf7CFYyTDG579KYn/7m4TNpirWTpMULDGYTixI9b+xCz X-Developer-Key: i=gary@garyguo.net; a=ed25519; pk=vB3uIX95SM4eVrIqo1DWNWKDKD2xzB+yLLLr0yOPYMo= X-ClientProxiedBy: LO4P265CA0185.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:311::14) To LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:488::16) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LOVP265MB8871:EE_|CWLP265MB6214:EE_ X-MS-Office365-Filtering-Correlation-Id: a060335d-9acc-4c1d-565b-08deb01f61d1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|7416014|10070799003|366016|18002099003|56012099003|22082099003; X-Microsoft-Antispam-Message-Info: usdVjVufnaEL/ByRUnH2WKRDwojOL/1LhRfAFoH97jLe+N0uIL3Twiz2IfnTzxeslXwc5U2t0FuhUwdV9RM2W3QzdGdu3jWyBIgjbwB+xAnf1qfOTkcNdOBNiIGJDzGh8z3+lEZgRnbVLMBpMCDtvg5atnzdE7Vbs2T4x5oiwFkxHjUqUAI3Qxj7kDvPJLfkG/YEgS56q1V+WPR2zfXTade11uSIu+WxKdW7xRSHiBXrwkYfq78vanGYb+KA8FwzESVdM8s0Gt/3TLhkS+hG+PzQd8yjEEjgnWfWaxn5FPjHHBdZJ7JUY4miF2LDjEwQcIvxIjLWpMZk0cKghQLAvX/SwOwzIlz3b0eCg4atbRPMWwNirq069XsTqXZf+gKDWeohn7++YRTwSf0cxeqOMdxpsPv0JIH1wBcSYUdCr3V4s3LOkwXq8/zww0J26hhYzPbtIyt62XoeUjz8tq4bDXO7fPibB1mvteZwaYgGxojkaqVeTDWxlx3DIGzuqKbp+iDznmCfYa5bKTt1Gu3/Evv5f+8UvIGTDMqHcGuhdCL5/4rF/gt3qlgq07qIvx7+qn1CmFu7unUJEt80MerEQJDf3l6EUUNcFBQ+zRJK+kcJwwBOmMHmdlDzF/gvpHHl26E6mU0ld8MnYdUMhgByMagc1hNKt2FVgjc/rl8Bbac1tn2CQ0ozsiG6PqJVUNy8 X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(7416014)(10070799003)(366016)(18002099003)(56012099003)(22082099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?MUpXYk55NCtxRkpEVmNtZnlwY2NmZktRYlBXNVN1QmtNQ3lUTHdlOFEvY2Ux?= =?utf-8?B?ekxLRzVhRHd5aWhYUEpDQk9QVktaTGVGTURTbGNlYnZDRW1BdHpJS1d6cXNh?= =?utf-8?B?cVhmU1JlOGhqRmRBMVRrMFV5K1FVbUtoVzRCNXFERUw3QkQrM0JDZEdyNGdn?= =?utf-8?B?M0Zwa1FNTTdkMElsNDF1Zy85dS9pVThsU2VkV2Y0bSswRHhSbk9CcnBUYlov?= =?utf-8?B?UE5aODNFRmhYenFSR28xOFAzaGtvckdSTS8yNUdzMzlHUzBQak9rSWZvUUhv?= =?utf-8?B?OENxUVRSYTNwSStPNnNkYXkxYVdEaTd6cCtSTXNmWmxsWnBWdDJ4SUd0bGN6?= =?utf-8?B?SlIwbnJ0bm9YdHhLVTFvT0dCelVCVHVxcTloQmh1VUxTMHBka1VJZy83MXIz?= =?utf-8?B?SVpRWE04dmlsZUJ0ZXEzb3gxWis4aTRRZysxeWJRL0lBTE11MEhDVXZ0TVMv?= =?utf-8?B?OTNHWnZZZ1Q3RTZxNnlUMVBNUU5STSsyWFI3UWhTcDNSeGJXMDNNNTdBdFUw?= =?utf-8?B?ckhUYnY3OTJkbHoyZ3FVemE5MGNiR0owWWF2N3g4azlacDc2M3JnZzVwcUk4?= =?utf-8?B?ZC9DenNFSlNkVTdVaEsvRXdyZEFyUnhEZ3RLY1V3dlViaUxlcjNtVlNvZTht?= =?utf-8?B?VUxHMHI5ZjVHOC9GMjBXRzJGWk00ampZaExHUU53U3FZdlpYTnRDMXRrRnhO?= =?utf-8?B?anl1K3VxNW5oMXJmdGN2OVMrMkNJK1EvSHNaaHBNQmJ1d3lLbEl4SzNHSHRu?= =?utf-8?B?dFpkbDc5ajAxaUZjRjBKd1c4emlzZmxrVlVKYUNDUnpHczA5Yy93ZVhyWFRH?= =?utf-8?B?dnU3LzFLV0VDdmJYblY2aE5lUmw2MkQ4STUxQW5jaEVTdEpjYjJRY2xXaUZO?= =?utf-8?B?MlBzSWtWTDBPSVI5dkVFYjA4MU5Wd0pzZmhIbEQzVXpiak02dE05bWwzSlRj?= =?utf-8?B?WitvWmtKdTc4a1Z0bWpMN2JlTDgwWCtwL0lENi9zVUpJS0NDUUt6Y1d3amVT?= =?utf-8?B?VFVOZVNyOW5Qd0h1M2J4TVBOOTBTTUlkVnF4WEtyTFdIbTNrb0lNK3BpT3E3?= =?utf-8?B?NGxBUEYwVTBIZzVZNkEyZjY3MG1zY3IvZFkrOWNBVm1za25vMWg3NFdBY1Er?= =?utf-8?B?RE8zRDJydGFTcWlwM0lKT1k3VWhkalM4K0dTTmhnNDVuTS8vc3VSUWxnNVE2?= =?utf-8?B?YTlMc1VOcWZnQ21uUklhQ1pnbjcxT0lQWVlBd3hybGFVcU1hMldmQ2dEWHp2?= =?utf-8?B?UmlTQVVETW5IQjFHdmV3WitaRFNOZ2tuZVlXNHlwMFZFTVBDc1ZSdHNFb3BM?= =?utf-8?B?QkJ1cE82VmV3SXJuSWYzSVpvaUNIUFBMaEdVMU4zS2d4ck9FWkVyV0Y5Zlgx?= =?utf-8?B?elZ2TThieWwrWnp0Qk5sWnFCV0M2Q1ZlenhYTDN6eHlGN0JCcFJxMUUwM0dJ?= =?utf-8?B?NGxnODZNR0l2OFYvRWdqT2ZuOEV1K2o4Tko0dXBQbGJ5R1U0d2pVR2dSWlc2?= =?utf-8?B?ZGtaOEtxTGJDVWM0MVY0WGFhK21odmNCajFPdnVRUFBYQ1F0V2p1Y3p5bXBJ?= =?utf-8?B?UTVNMFpSK2E2OHI1MnVyeHc2WDluWVVZa3ZySUJVcmhzTngzMDFWdHJRVDg4?= =?utf-8?B?L2FRYjBRUnNueWhWQndUdFpWdEJ2T0dQZUFCMkgyNEJ4K1BkOFAwSWl6eFFj?= =?utf-8?B?NG95aVNxcDYvMXYvTG43UzRJUkpxSkdVdEFaRFdWUUxkT3dXNklVVmtscHRK?= =?utf-8?B?YnpKTzJ6NFh4VzA5eVVxZDh6aTFJSFVXTmpaQTl2MWxpQStMYkh1NVRkZUJ2?= =?utf-8?B?b0xFL05FdnVXaFFvU1E4U0ZiZm1tTGxhOHFESUhwdU9QU2JHd2ZDTWFYbnJj?= =?utf-8?B?MXN4TCsyS2g1L2g2NXFvS3l6Y3ZmckdvZGRUMHRvL0lOVEZidXB2NElkWEpI?= =?utf-8?B?N3NVMWI0NldrRmxlL2VIOUtNMEo4ajhRMlhYQTB1N0FoaVdqOFNvS3lRYXRP?= =?utf-8?B?ZnJEaHBXbW9qV1h2NHhORWRYSXExRnZvdWxnRTdCK01EQlhUZUNNMjA0Y0lR?= =?utf-8?B?TCsram5sMmZvQUhvMGtCYVBmTWpVdXhFMWpQanZZdVl1SG9RSWw0Ukp5WWls?= =?utf-8?B?aEcyUEMxZ0tub3diMnZ3bmgvS1JoY1FvelJGK3Yyd2tBY1VaeXhXSnVwVUw3?= =?utf-8?B?RVBwdjBnemV3dG9ISm9VcGNOS3pyZnBVVEJsUHlFc21oUWcrUHJVcXNjN3ZH?= =?utf-8?B?d05WTXRXbThGVndWL0N5dUdCcktLRUdRRVdQMzBaVlU5VGNQV1RiWlNxaVFq?= =?utf-8?B?SXIzdWhpODAwRXFYNFdmeVZyakplYkFoeDVVNUhMT2ZVNEtWWmdPZz09?= X-OriginatorOrg: garyguo.net X-MS-Exchange-CrossTenant-Network-Message-Id: a060335d-9acc-4c1d-565b-08deb01f61d1 X-MS-Exchange-CrossTenant-AuthSource: LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 May 2026 12:09:56.5488 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: bbc898ad-b10f-4e10-8552-d9377b823d45 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: bLRU8jm589hx0qwAOkOzIWVDhtJU/n7/CiqJ5DmOMof8KJMlwZJqwFMrpBog8vMJCbYw+okGtd/eQYarVr/1ug== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CWLP265MB6214 Instead of projecting the created reference, simply create drop guards with different marker types and have the `let_binding()` method of guards of different marker produce different type instead. This allows more flexible lifetime as this is now controlled by the guard. This will be needed when implementing self-referential fields. Signed-off-by: Gary Guo --- rust/pin-init/internal/src/init.rs | 47 +++++++++++++++++++-----------= ---- rust/pin-init/internal/src/pin_data.rs | 35 ++++++++++++------------- rust/pin-init/src/__internal.rs | 30 +++++++++++++++++++--- 3 files changed, 68 insertions(+), 44 deletions(-) diff --git a/rust/pin-init/internal/src/init.rs b/rust/pin-init/internal/sr= c/init.rs index 7eda1bcf0f28..a0b3c3790d43 100644 --- a/rust/pin-init/internal/src/init.rs +++ b/rust/pin-init/internal/src/init.rs @@ -303,18 +303,31 @@ fn init_fields( // `mixed_site` ensures that the guard is not accessible to the us= er-controlled code. let guard =3D format_ident!("__{ident}_guard", span =3D Span::mixe= d_site()); =20 - // NOTE: The reference is derived from the guard so that it only l= ives as long as the - // guard does and cannot escape the scope. If it's created via `&m= ut (*#slot).#ident` - // like the unaligned field guard, it will become effectively `'st= atic`. - let accessor =3D if pinned { + let guard_creation =3D if pinned { let project_ident =3D format_ident!("__project_{ident}"); quote! { - // SAFETY: the initialization is pinned. - unsafe { #data.#project_ident(#guard.let_binding()) } + // SAFETY: + // - `&raw mut (*slot).#ident` points to the `#ident` fiel= d of `slot`. + // - `&raw mut (*slot).#ident` is valid. + // - `make_field_check` checks that `&raw mut (*slot).#ide= nt` is properly aligned. + // - `(*slot).#ident` has been initialized above. + // - We only need the ownership to the pointee back when i= nitialization has + // succeeded, where we `forget` the guard. + unsafe { #data.#project_ident(&raw mut (*slot).#ident) } } } else { quote! { - #guard.let_binding() + // SAFETY: + // - `&raw mut (*slot).#ident` is valid. + // - `make_field_check` checks that `&raw mut (*slot).#ide= nt` is properly aligned. + // - `(*slot).#ident` has been initialized above. + // - We only need the ownership to the pointee back when i= nitialization has + // succeeded, where we `forget` the guard. + unsafe { + ::pin_init::__internal::DropGuard::<::pin_init::__inte= rnal::Unpinned, _>::new( + &raw mut (*slot).#ident + ) + } } }; =20 @@ -322,24 +335,16 @@ fn init_fields( #init =20 #(#cfgs)* - // Create the drop guard. - // - // SAFETY: - // - `&raw mut (*slot).#ident` is valid. - // - `make_field_check` checks that `&raw mut (*slot).#ident` = is properly aligned. - // - `(*slot).#ident` has been initialized above. - // - We only need the ownership to the pointee back when initi= alization has - // succeeded, where we `forget` the guard. - let mut #guard =3D unsafe { - ::pin_init::__internal::DropGuard::new( - &raw mut (*slot).#ident - ) - }; + let mut #guard =3D #guard_creation; =20 #(#cfgs)* + // NOTE: The reference is derived from the guard so that it on= ly lives as long as the + // guard does and cannot escape the scope. If it's created via= `&mut (*#slot).#ident` + // like the unaligned field guard, it will become effectively = `'static`. #[allow(unused_variables)] - let #ident =3D #accessor; + let #ident =3D #guard.let_binding(); }); + guards.push(guard); guard_attrs.push(cfgs); } diff --git a/rust/pin-init/internal/src/pin_data.rs b/rust/pin-init/interna= l/src/pin_data.rs index 44d0bd18e4ae..90f6b05b957c 100644 --- a/rust/pin-init/internal/src/pin_data.rs +++ b/rust/pin-init/internal/src/pin_data.rs @@ -371,29 +371,18 @@ fn generate_the_pin_data( .as_ref() .expect("only structs with named fields are supported"); let project_ident =3D format_ident!("__project_{field_name}"); - let (init_ty, init_fn, project_ty, project_body, pin_safety) = =3D if f.pinned { + let (init_ty, init_fn, pin_marker, pin_safety) =3D if f.pinned= { ( quote!(PinInit), quote!(__pinned_init), - quote!(::core::pin::Pin<&'__slot mut #ty>), - // SAFETY: this field is structurally pinned. - quote!(unsafe { ::core::pin::Pin::new_unchecked(slot) = }), + quote!(Pinned), quote!( /// - `slot` will not move until it is dropped, i.= e. it will be pinned. ), ) } else { - ( - quote!(Init), - quote!(__init), - quote!(&'__slot mut #ty), - quote!(slot), - quote!(), - ) + (quote!(Init), quote!(__init), quote!(Unpinned), quote!()) }; - let slot_safety =3D format!( - " `slot` points at the field `{field_name}` inside of `{st= ruct_name}`, which is pinned.", - ); quote! { /// # Safety /// @@ -414,13 +403,21 @@ fn generate_the_pin_data( =20 /// # Safety /// - #[doc =3D #slot_safety] + /// - `slot` points to a `#ident` field of a pinned struct= that this `__ThePinData` + /// describes. + /// - `slot` is valid and properly aligned. + /// - `*slot` is initialized, and the ownership is transfe= rred to the returned + /// guard. #(#attrs)* - #vis unsafe fn #project_ident<'__slot>( + #vis unsafe fn #project_ident( self, - slot: &'__slot mut #ty, - ) -> #project_ty { - #project_body + slot: *mut #ty, + ) -> ::pin_init::__internal::DropGuard<::pin_init::__inter= nal::#pin_marker, #ty> { + // SAFETY: + // - If `#pin_marker` is `Pinned`, the corresponding f= ield is structurally + // pinned. + // - Other safety requirements follows the safety requ= irement. + unsafe { ::pin_init::__internal::DropGuard::new(slot) } } } }) diff --git a/rust/pin-init/src/__internal.rs b/rust/pin-init/src/__internal= .rs index e54d90a4742e..010e8bfc6cd3 100644 --- a/rust/pin-init/src/__internal.rs +++ b/rust/pin-init/src/__internal.rs @@ -277,6 +277,10 @@ struct Foo { println!("{value:?}"); } =20 +// Marker types that determines type of `DropGuard`'s let bindings. +pub struct Pinned; +pub struct Unpinned; + /// When a value of this type is dropped, it drops a `T`. /// /// Can be forgotten to prevent the drop. @@ -285,11 +289,13 @@ struct Foo { /// /// - `ptr` is valid and properly aligned. /// - `*ptr` is initialized and owned by this guard. -pub struct DropGuard { +/// - if `P` is `Pinned`, `ptr` is pinned. +pub struct DropGuard { ptr: *mut T, + phantom: PhantomData

, } =20 -impl DropGuard { +impl DropGuard { /// Creates a drop guard and transfer the ownership of the pointer con= tent. /// /// The ownership is only relinguished if the guard is forgotten via [= `core::mem::forget`]. @@ -298,12 +304,18 @@ impl DropGuard { /// /// - `ptr` is valid and properly aligned. /// - `*ptr` is initialized, and the ownership is transferred to this = guard. + /// - if `P` is `Pinned`, `ptr` is pinned. #[inline] pub unsafe fn new(ptr: *mut T) -> Self { // INVARIANT: By safety requirement. - Self { ptr } + Self { + ptr, + phantom: PhantomData, + } } +} =20 +impl DropGuard { /// Create a let binding for accessor use. #[inline] pub fn let_binding(&mut self) -> &mut T { @@ -312,7 +324,17 @@ pub fn let_binding(&mut self) -> &mut T { } } =20 -impl Drop for DropGuard { +impl DropGuard { + /// Create a let binding for accessor use. + #[inline] + pub fn let_binding(&mut self) -> Pin<&mut T> { + // SAFETY: `self.ptr` is valid, properly aligned, initialized, exc= lusively accessible and + // pinned per type invariant. + unsafe { Pin::new_unchecked(&mut *self.ptr) } + } +} + +impl Drop for DropGuard { #[inline] fn drop(&mut self) { // SAFETY: `self.ptr` is valid, properly aligned and `*self.ptr` i= s owned by this guard. --=20 2.51.2 From nobody Fri Jun 12 21:38:20 2026 Received: from LO0P265CU003.outbound.protection.outlook.com (mail-uksouthazon11022118.outbound.protection.outlook.com [52.101.96.118]) (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 736464C9572; Tue, 12 May 2026 12:10:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.96.118 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778587817; cv=fail; b=WaZVrq1/D6X2kWNfYo7dwGDb7+jicDXLUio2nVbj5cED8ZHq79lM5MLTJU2bGx55OH2GflP9Zo8TMzI1KpGAioKSPJdilKwUqNrfzjrr+A6CBxkRj0e5aqsE2U3HD1cIpnpb+59T40CEYeDq04/Y/NrEh2pBd2N/CQ8hl/AzltM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778587817; c=relaxed/simple; bh=DY8nNU3+6c7nzbTevT14WWbHK/zSTmonr5Bef/Q7s8w=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=hmNtInZo9jlTplFxN9HJQQFeTJPeAOa2F3Z3FYKJBgHTrRd48Hc/sQXIn+GAfTtbG76VpfXF7FxMA4N5DNUmTUylc9i5TViJ+dJDDHMFvifgqeD0jTMr1z94QedyNCOn2+h4S4we2ntY1Y7RKPZHKITsLTuzhVmfZh4fq7RVn2E= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=garyguo.net; spf=pass smtp.mailfrom=garyguo.net; dkim=pass (1024-bit key) header.d=garyguo.net header.i=@garyguo.net header.b=khchRyam; arc=fail smtp.client-ip=52.101.96.118 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=garyguo.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=garyguo.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=garyguo.net header.i=@garyguo.net header.b="khchRyam" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=XANqVeVKqZEpow+pmUVRy7aRkqfMpU5mKIdhNd2ertPSZI1aaUj9JAmPLPdto4/vdl3ef4j5Z5pDBv1pmcPeQz13Ivhq6ur1BtyvAfaiY8hoGK74bp4l9LfTHXlOaAJuyH0wQmxZ16y8+ziLqfN7J4adwKNOj8TsicYnJFVzTjGeCTwOoQiZ83R/URi9CduJoz21sHEhU1c7dZIbT2kc7IzJLbuU0pXR+Mitog3ABiClyOLIv5SFBtA9fIunApBnwk5mkb5tvXk8apWfcr0/zGKSAyVgctaxiLyCJxUJ48HqsSkR8cwJmQnxURtRQhw/yHzO+y2RrjKTWzZd12HMKA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=evlPlJINrTR110dPin9ZpXNp2mlJ0M7g9olskDiqUxs=; b=WwRPEU/vt0ojwFdHsK4wrIKXjwhbA0vhke7XkPQOrY2CcfKNYGy7Epkkls1w9SO1AMyAOkctN85QIKCcK8LuxWww76synD5O050UAe90xTK3K2F4SQkUaPlv/8gHYvtDoVEkUzDXpHBsxYr5UAOOSXqdVkvsufdqksSQu8cmsgENdWN8VRtJM9AMMbuAngGm+gGCPMWSFKnMSAsFDQiHcraw9F4sQ7ipi2AkXUp2/fqLceM/laqYoaRUXfpGXIoPntattQAZ4cRT0AigVX8vfTIwhDbn/moR7ek7ViCQVqqTBXANECD/sLui75vu8J78VgfoImvyRqd7c4zIweOXLQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=garyguo.net; dmarc=pass action=none header.from=garyguo.net; dkim=pass header.d=garyguo.net; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=garyguo.net; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=evlPlJINrTR110dPin9ZpXNp2mlJ0M7g9olskDiqUxs=; b=khchRyamQFjrzoCam+T6oj9F+lc+2v78E0lr4KTgt5oTEeLlJmX+ByQ12aYyfk8eRebjXSgFucZZKQjxDPNpD8sD0sHoxFjyZ5mS/d77/GRhHG3h/NFHykLU0FGg/ipyJc8WsiEe3f0u4ksm4Tg2XYG2YvfiC0qjaAxbuJwRtZ4= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=garyguo.net; Received: from LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:488::16) by CWLP265MB6214.GBRP265.PROD.OUTLOOK.COM (2603:10a6:400:184::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.23; Tue, 12 May 2026 12:09:57 +0000 Received: from LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM ([fe80::1c3:ceba:21b4:9986]) by LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM ([fe80::1c3:ceba:21b4:9986%4]) with mapi id 15.20.9913.009; Tue, 12 May 2026 12:09:57 +0000 From: Gary Guo Date: Tue, 12 May 2026 13:09:51 +0100 Subject: [PATCH 6/8] rust: pin-init: internal: make `make_closure` inherent methods Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260512-pin-init-sync-v1-6-81963130dfbd@garyguo.net> References: <20260512-pin-init-sync-v1-0-81963130dfbd@garyguo.net> In-Reply-To: <20260512-pin-init-sync-v1-0-81963130dfbd@garyguo.net> To: Benno Lossin , Miguel Ojeda , Boqun Feng , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Gary Guo X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1778587794; l=5706; i=gary@garyguo.net; s=20221204; h=from:subject:message-id; bh=DY8nNU3+6c7nzbTevT14WWbHK/zSTmonr5Bef/Q7s8w=; b=YAzNpiO6OZs3CwIuA9/V12jUmgJ5vJZReU5/yEL4p68ZRpuYjNsS80d38sz7GeBJv+O3bERfx mnTB8DwgVAWAOv0799++VOJrKdKzUAfx1KV/yiJk53VMuTqNOxKyWQd X-Developer-Key: i=gary@garyguo.net; a=ed25519; pk=vB3uIX95SM4eVrIqo1DWNWKDKD2xzB+yLLLr0yOPYMo= X-ClientProxiedBy: LO4P265CA0185.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:311::14) To LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:488::16) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LOVP265MB8871:EE_|CWLP265MB6214:EE_ X-MS-Office365-Filtering-Correlation-Id: bcf17c94-8488-43c8-f956-08deb01f61fa X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|7416014|10070799003|366016|18002099003|56012099003|22082099003; X-Microsoft-Antispam-Message-Info: a71rwq/IocWR5a56PoRAw3Qnr5JEjDiJkvIpag/LQkI45VWu9pfqJ+i2qamDx4RSPBzoRNYLtF5JfW2MiJlcS39lOP+wgQLoqYrFs16Ck8LwW9iUI8Xy6irhb24Le0nwoL2ay3a8X4pwDrn21EkfuSwOkAwlQibbcVprHJuakmxz0H5N2aspxFxvRF/tV/G1GCHT2fnIBbS24JzbVXBXQ7EvQIEmowaeipLWFAb98fvsUMOP7tVuDhzEBja+MyZSJgz+frJ+Ba+QIjXSgxNxqDENxA8UX0Poclk6yzm0FWuZL0iLYN1vcpn423KDlg/BF6qrwSqOtUVhpv8Op8llxH6JifF2HwHZ4yzpPguhEGdr4DXU4UITRXfseVn0D5L0r5WAOZFfTjHBp3YQK7Vo3hzfTFHpTYWSB+AxVAK3b+zLDYjbfI16Av4Ekf4VpBSisYi1xdB61m/zDmM93lpT/imrtAaSDEAFL2Rr9WYgXUrLLS+qRqb4EcbNTjc7oVzLleO0vrudpibbyCQs4/kzzfyqZBT5wyJgCLko5uja0+W69DZehJxB/qYljGBAiTxU68n9pF1LFjZVJGP84zGYJfzsHaSSx8ZFI6UMj8YHf/M4MqcCeEPgd5K7LuX8M1tgWNhsc6U8pl8xcTj0jgG2Xd3yVWMjlZEl2EzSWJtensjXjpwm/Spsk8Kb5yYq33nx X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(7416014)(10070799003)(366016)(18002099003)(56012099003)(22082099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?RWovTHNPc1V6aDNIdlJvWDRkeDNvczluZGNLemUxM1cwRlhMdEY1V1UzNjJy?= =?utf-8?B?QVBFc0dvZzRLNXNMajhYNnJzbytxMUtCOUx1K0JiS3hCVnpwbERod0NRdXZl?= =?utf-8?B?MWNGdC9aTFAwaUJmMDZ5N3lkSVlkaC9GVzJsR2xiUm85dCtjYmV3SWFKSnJs?= =?utf-8?B?VllEektwd2o3OEdwNkh4UnhOSXVFdkt3WEF5SUhDK2ZyM0I5YW11UzhUWlhs?= =?utf-8?B?dmhNNFEva1RYVDh3UkE0cmx3MzlXUWFFRXpRalpCL3lIQXdMRGJ2c3ZaV0xi?= =?utf-8?B?Zm9lZjlBLzBmYUVxRG1ReHpXWjdvT3NTWWlYTTFYN3Z2NEhkM2VYdU92TkY5?= =?utf-8?B?eFAwRnFCVUR1d3JWNWRiRksvaXRadmtLSDREVTRydEhyMVdVVEM0RmdpeEkz?= =?utf-8?B?eTRJV0V3cVluTkRJS1h4cG44UDNORWpiYVczTko0RUxBc1RDNzN0T3hua21m?= =?utf-8?B?VmpTb1ROR3VyK254Um8xd0ptL2ppL3ZFRkJhczJVVlVucHc3K0xFQzRwc2V0?= =?utf-8?B?TUVxcG1WTWExWUpZQVk2NHlhblA0Z3kweC9pS3lVKytIT04vYUFMNjZkajkx?= =?utf-8?B?SlkvelJ1RkNQOXdpTWV2T2U5bm56OU5CQjZjdklnV3FOdmRpSFVIVG4xTXN1?= =?utf-8?B?Y0RyT05nTHNhZVcrK3VjT1NLajVFUHpwQkpUdVNMTzk0MnkxSkg1SmQzM1Ix?= =?utf-8?B?VEQ5UE5PZ29ka2JrR2Z5a1VpdEV6cktoWTN6K052V0s5MWQzMTNuaW5KR2tT?= =?utf-8?B?QVJmTHZXYjBudmFFOFdhTDhrY1MzWHVOaE5YQk9CZ2VwTzhPRTdMaDZYTnQ1?= =?utf-8?B?WjV0WG03UkY0R0V1SURqdC8rL2VpNTlDU3pKc2RkVWZaMThOK3V0Q3oxZFVl?= =?utf-8?B?WjEwZVZpcVJja1BUN0tZSFh1akF0bzFjc1UrNUtpY09pQXVsM0dSVEFyQXZn?= =?utf-8?B?MC9kek80VDgyc3VpOUQ0MmpDMFRFckMxTzk4UlNkZEVTR0NybWFqV3E0VW4x?= =?utf-8?B?RkNDazY2b24zN1FUakVTdVA4RGF0ZjUwS3k0dUtnVUE5eUY2bGIwcndRbXBH?= =?utf-8?B?czR2QzA1dXBGQXQ5Mkl2cXFNbHorY3krWFh2ZkZTcGhnWTJ1ZlordGNaS2Vn?= =?utf-8?B?TitXSzJDWitkaWVYdFBEc0lFTnh1SjJZQ2MzOGlSZVdvS05yZExXRmdiYU43?= =?utf-8?B?UWhqbERLT1BIK0JhclFicWFnd1BUUVRoUU1FQ1pZQzg4OWVabGc1OXRNQTA0?= =?utf-8?B?RGh6VWVuaHU4Y29zU3JJN25EajBQZEI4dEhCQVZXOWtyNVhFd0JXOXd6cFZB?= =?utf-8?B?RkpDYXBMYXhhalNpblFjSWdlaW82Z2kwYnUyLzdUcUVOUEFwSDUyaUpDSTRP?= =?utf-8?B?SkhPMExxOGVmMUh2UmVtOFlWdEZpN2xVMGVDV3BRQTRPSHg5RGpTRGlYVFhC?= =?utf-8?B?M2dMZjFxeUU2WjhPNWtpcjdRaFYyRUNGOWlMRk1IMDFoeXpCWi8wSUZhYy82?= =?utf-8?B?WWV2NmhiZ1d0NWt5Z29RK080STNwQmREWHM1Y1NWU3U5NGZZSVdoaGZLNFlv?= =?utf-8?B?akJ5Z29wdEsvenRGa2lMTXVaMHNUWXRUV3BiRHNRemROeGtCTzdvKzZjVHkv?= =?utf-8?B?Zld5TFBHRjZ5UjRIcWZCbnZGUGtTVWQ3blRtUElhOFZzY3QvcEEwZEtRR0Jq?= =?utf-8?B?VnZNbzQybXJGRzM4citpZVBFdGdIb0dqKzBjYlcrU2dqOFI1bVR5TlFHRlpI?= =?utf-8?B?UllIKzY0SGtxWVFiNkZtK1JlRGhtdTNnVUdwVW9HcDgveXRaVldsUXlzQk1R?= =?utf-8?B?aUIzSGIxN092OWlqTjk1dyttRmhJTzFPNkpzWjh6VnZ5SVBGaXRUQU5Ib1cy?= =?utf-8?B?c3k5b09Sd0VNM0tESU1nbmFBL0R3YU5peEkyQy9IajJwZHVvUmZ4eHFpenJJ?= =?utf-8?B?ZGxTUUlQRzNBL3JDUS9XNDZhbWV2dHI0U1lsQTBXRVl4MXI0VWNZSk02WUwz?= =?utf-8?B?VTVSSjU5SXMxWkpRUVZkYkJYVklIZjk2SWxnUG8vQlZhVHRjQ0JpYTBwR1pO?= =?utf-8?B?alJETHdtbnAxVjJjT0NFMU1MK2ljOC9PaDdmK0RBM0duM3dqUGpBM1hpaG5G?= =?utf-8?B?YVYzNWhMTTVCMVJRV3kxZWx6VFhaaFVDa2JPdlVzT1M1R3FNWU56RWZweVdQ?= =?utf-8?B?MFFQT2NveDhEUGJpckFTUnQ3WFBwT0hYdE15OEQxQkExQVhYMmk4UHlTUytn?= =?utf-8?B?dFRaNW5JZHQvTG9rZi9qbkpLTzk2NFN2bllyRUpkMUhHbWdHRlJNdThJUEdU?= =?utf-8?B?ZGFVeFpjUWRWNlVPcDZiM2xPUVN5WkVURmQyVjdSY05UZ0NDdmFIZz09?= X-OriginatorOrg: garyguo.net X-MS-Exchange-CrossTenant-Network-Message-Id: bcf17c94-8488-43c8-f956-08deb01f61fa X-MS-Exchange-CrossTenant-AuthSource: LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 May 2026 12:09:56.8308 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: bbc898ad-b10f-4e10-8552-d9377b823d45 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: KzFEBE0MFEXYZhhlWWOZvZzjlVpTKHoRr3wYiDbxyKBTT0G6g1ijD2oiH+4n6aXh8xysLxrACR7UxXgZEPeTnQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CWLP265MB6214 The `InitData` and `PinData` traits do not need to exist, the inference helpers could be inherent methods instead. There is no risk for calling the wrong methods even when user defines it, as inherent methods take priority over trait methods. With this change, it unlocks the possibility of attaching additional bounds to the method per type, which is not possible for trait methods. Signed-off-by: Gary Guo --- rust/pin-init/internal/src/init.rs | 7 ++--- rust/pin-init/internal/src/pin_data.rs | 17 ++++++----- rust/pin-init/src/__internal.rs | 52 +++++++-----------------------= ---- 3 files changed, 23 insertions(+), 53 deletions(-) diff --git a/rust/pin-init/internal/src/init.rs b/rust/pin-init/internal/sr= c/init.rs index a0b3c3790d43..11affa76d1fc 100644 --- a/rust/pin-init/internal/src/init.rs +++ b/rust/pin-init/internal/src/init.rs @@ -103,17 +103,15 @@ pub(crate) fn expand( |(_, err)| Box::new(err), ); let slot =3D format_ident!("slot"); - let (has_data_trait, data_trait, get_data, init_from_closure) =3D if p= inned { + let (has_data_trait, get_data, init_from_closure) =3D if pinned { ( format_ident!("HasPinData"), - format_ident!("PinData"), format_ident!("__pin_data"), format_ident!("pin_init_from_closure"), ) } else { ( format_ident!("HasInitData"), - format_ident!("InitData"), format_ident!("__init_data"), format_ident!("init_from_closure"), ) @@ -157,8 +155,7 @@ fn assert_zeroable(_: *mut T) #path::#get_data() }; // Ensure that `#data` really is of type `#data` and help with typ= e inference: - let init =3D ::pin_init::__internal::#data_trait::make_closure::<_= , #error>( - #data, + let init =3D #data.__make_closure::<_, #error>( move |slot| { #zeroable_check #this diff --git a/rust/pin-init/internal/src/pin_data.rs b/rust/pin-init/interna= l/src/pin_data.rs index 90f6b05b957c..713a43c27826 100644 --- a/rust/pin-init/internal/src/pin_data.rs +++ b/rust/pin-init/internal/src/pin_data.rs @@ -447,6 +447,16 @@ impl #impl_generics ::core::marker::Copy for __ThePinD= ata #ty_generics impl #impl_generics __ThePinData #ty_generics #whr { + /// Type inference helper function. + #[inline(always)] + #vis fn __make_closure<__F, __E>(self, f: __F) -> __F + where + __F: FnOnce(*mut #struct_name #ty_generics) -> + ::core::result::Result<::pin_init::__internal::InitOk,= __E>, + { + f + } + #field_accessors } =20 @@ -461,13 +471,6 @@ unsafe fn __pin_data() -> Self::PinData { __ThePinData { __phantom: ::pin_init::__internal::PhantomI= nvariant::new() } } } - - // SAFETY: TODO - unsafe impl #impl_generics ::pin_init::__internal::PinData for __T= hePinData #ty_generics - #whr - { - type Datee =3D #struct_name #ty_generics; - } } } =20 diff --git a/rust/pin-init/src/__internal.rs b/rust/pin-init/src/__internal= .rs index 010e8bfc6cd3..d7fdcfef41d2 100644 --- a/rust/pin-init/src/__internal.rs +++ b/rust/pin-init/src/__internal.rs @@ -113,30 +113,12 @@ pub unsafe fn new() -> Self { /// /// Only the `init` module is allowed to use this trait. pub unsafe trait HasPinData { - type PinData: PinData; + type PinData; =20 #[expect(clippy::missing_safety_doc)] unsafe fn __pin_data() -> Self::PinData; } =20 -/// Marker trait for pinning data of structs. -/// -/// # Safety -/// -/// Only the `init` module is allowed to use this trait. -pub unsafe trait PinData: Copy { - type Datee: ?Sized + HasPinData; - - /// Type inference helper function. - #[inline(always)] - fn make_closure(self, f: F) -> F - where - F: FnOnce(*mut Self::Datee) -> Result, - { - f - } -} - /// This trait is automatically implemented for every type. It aims to pro= vide the same type /// inference help as `HasPinData`. /// @@ -144,30 +126,12 @@ fn make_closure(self, f: F) -> F /// /// Only the `init` module is allowed to use this trait. pub unsafe trait HasInitData { - type InitData: InitData; + type InitData; =20 #[expect(clippy::missing_safety_doc)] unsafe fn __init_data() -> Self::InitData; } =20 -/// Same function as `PinData`, but for arbitrary data. -/// -/// # Safety -/// -/// Only the `init` module is allowed to use this trait. -pub unsafe trait InitData: Copy { - type Datee: ?Sized + HasInitData; - - /// Type inference helper function. - #[inline(always)] - fn make_closure(self, f: F) -> F - where - F: FnOnce(*mut Self::Datee) -> Result, - { - f - } -} - pub struct AllData(PhantomInvariant); =20 impl Clone for AllData { @@ -178,9 +142,15 @@ fn clone(&self) -> Self { =20 impl Copy for AllData {} =20 -// SAFETY: TODO. -unsafe impl InitData for AllData { - type Datee =3D T; +impl AllData { + /// Type inference helper function. + #[inline(always)] + pub fn __make_closure(self, f: F) -> F + where + F: FnOnce(*mut T) -> Result, + { + f + } } =20 // SAFETY: TODO. --=20 2.51.2 From nobody Fri Jun 12 21:38:20 2026 Received: from LO0P265CU003.outbound.protection.outlook.com (mail-uksouthazon11022118.outbound.protection.outlook.com [52.101.96.118]) (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 76CFE3655D6; Tue, 12 May 2026 12:10:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.96.118 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778587821; cv=fail; b=tiiiJDNQUwndkh2idPZeP7Gp+ywDjdkcYPNe80V+Hcv8kzVCBbg8O8cBobI8SkDXWQFqMoQwfYjM88yR8KO6ofqLra6ZvxU5AzZHpUELrAFQraIIFWPzxRoHroTeaUXxlidxgJX8eostGdmWDHFDMKaJeBp7lzmKKMGVc2iWlTg= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778587821; c=relaxed/simple; bh=r5LPMsmcEvlqvyY+vGqNDYlcJLCBDylHbwDWsH3j+7E=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=G8zvbFMUdPPf5L3/dV1DLzVG9J5pNNRP4tS77c/t886nrXST7ULWqpeSb/+4/ntyCjWHB6RO7TeTr1dgKMqDtRAzkNggJqlaKFlZOZrq74Ldw3U3ajH1cpInAMBNCyyywIAt0Udm0R+sU77qIYr5yDR+WWcVtuxgHbaY2ihVuQI= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=garyguo.net; spf=pass smtp.mailfrom=garyguo.net; dkim=pass (1024-bit key) header.d=garyguo.net header.i=@garyguo.net header.b=pu1yajgj; arc=fail smtp.client-ip=52.101.96.118 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=garyguo.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=garyguo.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=garyguo.net header.i=@garyguo.net header.b="pu1yajgj" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=sITjO41Ppgp4PAECyUxAZaqqS9VCPR4Y8YPg+QNu2b39GLRxP/qFab3RFOQ5evv07dTSqT6JHpS8F5a5sf6y/gJuOUNT7pWJRxME3/gwQSgEw7CgDcD8lFaLvJ7FovFRU1hThfU7okjmKgQutz7wHnkPzXWuX+SCVBDJyRuVwtNFnOb+BKEyVar42+Gsxx4c6a3gldn2UwSsL8saFp0paNaYdwnrsSBKTKEU9rXR98lTdqIyfiuJpnh0bcZwjtqb9rFVe2is67U+bT1xncDw+CZPQkQdbj56DCidNzKs9nqHNthvDcVYp8aY0v942hofD79MIrPWMU7/iXV/Vub7DA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=crY0Y8A1tckyi5lSL3ElgJvmc/Zd4Fy8C3BbBMb9Puo=; b=qqs2vX7brXmlvNACIrCj6SF3sksNuoRkCwMzjDYbrM26G/E5iipNDMpCjXQNjTQ3UgIgIhMZNvIeh/uGYfNEieLxCh9anXHt/AHgWo3KstVAo0i42i5FocKxEJp0Vz1NsybtbXOtI6dfg5phAZ9ikKQSiK89Uanwe+EzHbCSMX+ZPMXGaN6EEndPxEkmGWaHxGgueasRK04G443sVPX6WJ7EoNM5+s1kh/DZ+HIi+blpggwf3ID9JO9/8BseC9UAhyLiPTgbPgSlt5mFPV7IEn6ZApd7dB4D+1IoVeTJu0dbmpJS8OuWn3sz6e60Bbv+Fyas/X/JC081bC84jKwhPg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=garyguo.net; dmarc=pass action=none header.from=garyguo.net; dkim=pass header.d=garyguo.net; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=garyguo.net; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=crY0Y8A1tckyi5lSL3ElgJvmc/Zd4Fy8C3BbBMb9Puo=; b=pu1yajgj5Lw+wTZW3agWuCnJaF2R9di41MQKIYI+xMQts7mVRRh9A2BCcyyQoRBtdbEMty8besF+RD2Wdi4eNAGWVS23PiwWdlhB8MYHXZT3RXnLZWpLwasUZuPuOI46MUbbfaTRCv+Ot7YiOQopTRd8fEQeNduOGYNo/RPBlt0= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=garyguo.net; Received: from LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:488::16) by CWLP265MB6214.GBRP265.PROD.OUTLOOK.COM (2603:10a6:400:184::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.23; Tue, 12 May 2026 12:09:58 +0000 Received: from LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM ([fe80::1c3:ceba:21b4:9986]) by LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM ([fe80::1c3:ceba:21b4:9986%4]) with mapi id 15.20.9913.009; Tue, 12 May 2026 12:09:58 +0000 From: Gary Guo Date: Tue, 12 May 2026 13:09:52 +0100 Subject: [PATCH 7/8] rust: pin-init: internal: project slots instead of references Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260512-pin-init-sync-v1-7-81963130dfbd@garyguo.net> References: <20260512-pin-init-sync-v1-0-81963130dfbd@garyguo.net> In-Reply-To: <20260512-pin-init-sync-v1-0-81963130dfbd@garyguo.net> To: Benno Lossin , Miguel Ojeda , Boqun Feng , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Gary Guo X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1778587794; l=15980; i=gary@garyguo.net; s=20221204; h=from:subject:message-id; bh=r5LPMsmcEvlqvyY+vGqNDYlcJLCBDylHbwDWsH3j+7E=; b=iJpKdtJ2amh5XwiNbjzB1UhJQxyRZ1RFpdCpucpYny3qIble3unkcOch/O95d8jkPE6u51Cm+ qZdEH7uqhHBAgJXq3qQDycqsr9Bi5xaFgErf0FSGv7REgH/DoegqQvT X-Developer-Key: i=gary@garyguo.net; a=ed25519; pk=vB3uIX95SM4eVrIqo1DWNWKDKD2xzB+yLLLr0yOPYMo= X-ClientProxiedBy: LO4P265CA0185.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:311::14) To LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:488::16) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LOVP265MB8871:EE_|CWLP265MB6214:EE_ X-MS-Office365-Filtering-Correlation-Id: 6bd9eeff-4804-48a1-89b6-08deb01f6226 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|7416014|10070799003|366016|18002099003|56012099003|22082099003; X-Microsoft-Antispam-Message-Info: UGewr6DLrfQmG3mOd+2Bx5o8a5P4PqQx2bVKtYtjRpQikZeN0ogL5LUC8Fz9B9cUH3bbs1QZPlGW/++aYtDp7KISdnP1Pg+ErPYMCYqRoeZIJErTF7VtgiBZdQIm8nsw2KvpmTGX1WkUdRJeFu6kkRkU2k5LGGajeq1dhfOT0cXKFNMyvhz9fDPKtiu2uoBchNYhlVPEbD92vbjrVzFzgM6TBZevVOi6At0zsQGGIdsYgUBkG33NDPNRpLZsUHRYf6b0JU9BjgorVHEbeNwMAAL8WVrbKB5VfpGLUIZ1cEmKUHrf+ZyBQbQmUSyV/LjAzlDiVYibp3G9dzsUn0tmnz7yqXbn6N9MgC982oKkzk8qhVykmqgpKP1l/9CZ28upNeySZy46sgM1IAsU5GglOL8Kd6ftTbSQf/sS5icEwKk+beyNyFD79EHEnCbLwlwefvsNQ9gt7DchkkusGU3qbRTMXEgfbrb8oqB4Tdu4sLa9qnxn4rM+lW5e8DjrW7vy8wFdfI1QGG1FGPE+fQgDdwxIkYmWmofO7F2XnC7xsaBoGnYjGHhK1xdoleHzkxgeuSrTJH44Ts1PbB8a+B3scM3GvLRXkUBzZt9FpRwk3TYDK2PNAUVmW9foRKOGeWWuNCxdX/IuxxB5JNMFnlBMJgLyXbmEzFiarXm8U4nr2HHeuIJpR65/X+7boYlR2LSN X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(7416014)(10070799003)(366016)(18002099003)(56012099003)(22082099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?L1d2THZKazBOZUVJNHQycTJSVEZ5SnhxMlBJMkI4WTJiZ1VNeWZjM3pyaUlz?= =?utf-8?B?d1NiSHUvbExIeXM1eDdtNndMZUdycWxiTS9YN0llTTdRVHA2bXo2OGU3S2dR?= =?utf-8?B?Ky9YV2V1dlZoSWVuK29ZU0szNlhNM1lVcysvOUFqNHlKaW9OVXNqN3pzTEtF?= =?utf-8?B?dkEzdmRlUDgvVXhpbVRuWlhtSHdqWkR2T0F6MHI3WkY0djQ3Z1JrRUVyNm1q?= =?utf-8?B?U2xxakZ1WGhrcUw3Tk1RM3ZqVXUrdExqY2ROZUhRUUtCcG5QbnRUMjljWUFO?= =?utf-8?B?VHM3Y0xpTWpVUVlMQVNkQVJoYjlXS0xXK2hERTlvY1plWjhBR1hLb01CMmpP?= =?utf-8?B?eDBkUXRIWkxRM1NZV014bUxnWkM5L00rNkpJWjdBeXpxeHZJMG84UVczbXQ1?= =?utf-8?B?eU1BaTF5OG9zRUg3eERWU2ZSdzAzbEVRdDJxMjhjU2ZMR2tXU1k3a3ppLzQ0?= =?utf-8?B?VmJXZUY4WUJTN1dZSDlHOVBMamoyTlc5ZkVCSHpMS2ErWnpsWU5WdDZmaWJL?= =?utf-8?B?L3BnSnh1L2VsN0JpVDZsU0JEU3oxbmdZQ05vZy9DWDdWWE9jTTZGSGxaSXJ1?= =?utf-8?B?TnBpM2t6OWdnc0lqM08vYUtaSEJ5dUhHMFhuNFN4eHRYaWM0TWRTelVmSWZq?= =?utf-8?B?VVpRb3BpQWd2ZTZFUk9ZUFpyb2NwNXlHNWhSdzR5bXY5SUdkbFVuMHRNb2k4?= =?utf-8?B?NUszOS9SRGxOaEkzUm4wekFORGlyNnhVaTdicDNHQWNWQzRQRDcyeW5MdFhl?= =?utf-8?B?bGlWRElXQTRkMHpkeFk4MENZa2ovc0c1MTJ6RkkxaVlFaWlmb3hDdnVHVnpM?= =?utf-8?B?TWMvNi8xaHZhZ2dROGdDYVBxazhBTEtZSXJjMytLUVVuU0txMk1SMnVKWnFp?= =?utf-8?B?dTkvQmxiY1RZVWd2RVpGNmdQVGdPNU5IRm51WGN2N3Z6Mm9UU2R6WURmODAv?= =?utf-8?B?WTJQWmdmZnJjb0tTZjlGTFJTYmN6QXBnbXpqZC9YR0YrZjJiMGRiNkROT3ZV?= =?utf-8?B?d2ZsTEtGa1VPL1JEUlRZMzYrUXF6aGRid3JST0NDQk1pMnRDNDR4TEk5aEda?= =?utf-8?B?ZENJVEQreU4xU1NnS2pBKys3YVQwdGwxWjdYMVA1c1pCVVZsQmUvMGlaTFVu?= =?utf-8?B?UEQ5UVFjM0dWb2ZDT0EzQ2YrMS9aWWs1MjVxTHg2a24wZytINFIrTzBMamR3?= =?utf-8?B?ak8yNTdDcFpwalFhSW1LRmRCb0NLYlBobzZHZEFNRWp6MWd5NkhkUG5qRWZC?= =?utf-8?B?dU1SWHdEQjBXbURuNU9HMHpMWEVYbXVRZFV4K21YYmpVUmxFOEJBcExXVUYy?= =?utf-8?B?bXRVWWE2L3d3Qks3YlBaSWIyWDdkb3kwOWlTRjRYOXhDbjBDTXdqWHdNZG1w?= =?utf-8?B?emV3UkFRMERZaUNESllEbkxCMFhyOVVhNWUyR043MzhmSFdMdS9MNmNmeGVz?= =?utf-8?B?YVI1TmZsWjFzd01SVVg4cGZrV3BRbXpVL25BUTVSZTZ4by81VlBIRGNwOGNH?= =?utf-8?B?V0JSRTJuSk5LNGxxdlBId0phdkFmcTZ2dG9NSTJkQjM3RDk2MEJVbE5EcWpw?= =?utf-8?B?NHVWcXBuWjUxRER1dG4zejlySXBIZ0JJNHB1a0RydDZUN1JIUDlPNVMvb2dh?= =?utf-8?B?V3oyZ3VSUUFiUWNTVFczc25sR0pkN0pDMHFFZGJmc3VMVnhiKzF4WE1DSHdE?= =?utf-8?B?eWt3TmlsZTYwb2xWRTFrdUVBZmJyaHp1TWlwbS83alZSLyt6ZUJwNVlQeTVF?= =?utf-8?B?NjlmczZWV0VtRzFPTHYxOVdlRE12RnBLd0d1ZS9oWThiOTBLdjVCYzh3Wkw1?= =?utf-8?B?TUcra1Zia0RuT2xMamNjTDFqelNnQUkrNFRjUkI1M3NxZWVOQ1hZSHdMTm9F?= =?utf-8?B?bUNwWXBCbzRJTVMyRDR6MFQ5QmFZZXhYZHY3VTh6ZnVOSFV0alVraWtqWWdB?= =?utf-8?B?WGtQTUlDSXRSYk81TENQNUpwQ0J5UWZnYjlrZWEvS04wRGlEWG13WVo1SnFu?= =?utf-8?B?elpPN1lVK21DN2IvaE15U0RJdmIwOWpTTnRna1d3UjlSR0ZKVEM0MEFtQkdR?= =?utf-8?B?VmVtUHdNZW1yNkhrV2g3d3I1ZHYveVZ4eVM1elFwL0picWZ4c25oSWVGUDVu?= =?utf-8?B?SXdaRnVQSS9RbXdQd3ptaElTWVFZbmZNZzRXWnVhYjQ1cjlCajFLM1dZS0dV?= =?utf-8?B?Z0JkNHoxVHZyT3EwSFhUS2FOY0N6NWhTNTJ5enNHVzZiMzEzdk56VHpINVc4?= =?utf-8?B?UU1oSkFkbGZPdUFnSWw3Q1lFQ2pzbVJ2eC9YdHRPYnB1YmxDTDBGSDdZN3pJ?= =?utf-8?B?Zm1kWkFXYWtqTElkbE85SWVqdHEvZ3hJTnVRMEtmclBMUWwwU3doQT09?= X-OriginatorOrg: garyguo.net X-MS-Exchange-CrossTenant-Network-Message-Id: 6bd9eeff-4804-48a1-89b6-08deb01f6226 X-MS-Exchange-CrossTenant-AuthSource: LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 May 2026 12:09:57.1007 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: bbc898ad-b10f-4e10-8552-d9377b823d45 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: NXfmh72f9DOSfhZ00asDIBCaClG2xlIYql3/hP1YSLxTo79wsF4RIps2lQALJCrmpwZ1vdPG5KcZAe5To76q7w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CWLP265MB6214 By projecting slots, the `pin_init!` and `init!` code path can be more unified. This also reduces the amount of macro-generated code and shifts them to the shared infrastructure. Signed-off-by: Gary Guo --- rust/pin-init/internal/src/init.rs | 113 +++++++++++------------------= ---- rust/pin-init/internal/src/pin_data.rs | 52 ++++----------- rust/pin-init/src/__internal.rs | 77 ++++++++++++++++++++++ rust/pin-init/src/lib.rs | 12 ++-- 4 files changed, 132 insertions(+), 122 deletions(-) diff --git a/rust/pin-init/internal/src/init.rs b/rust/pin-init/internal/sr= c/init.rs index 11affa76d1fc..e6f5ea06f91b 100644 --- a/rust/pin-init/internal/src/init.rs +++ b/rust/pin-init/internal/src/init.rs @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 OR MIT =20 use proc_macro2::{Span, TokenStream}; -use quote::{format_ident, quote, quote_spanned}; +use quote::{format_ident, quote}; use syn::{ braced, parse::{End, Parse}, @@ -242,102 +242,61 @@ fn init_fields( } }; =20 - let init =3D match kind { - InitializerKind::Value { ident, value } =3D> { - let mut value_ident =3D ident.clone(); - let value_prep =3D value.as_ref().map(|value| &value.1).ma= p(|value| { - // Setting the span of `value_ident` to `value`'s span= improves error messages - // when the type of `value` is wrong. - value_ident.set_span(value.span()); - quote!(let #value_ident =3D #value;) - }); - // Again span for better diagnostics - let write =3D quote_spanned!(ident.span()=3D> ::core::ptr:= :write); - quote! { - #(#attrs)* - { - #value_prep - // SAFETY: TODO - unsafe { #write(&raw mut (*#slot).#ident, #value_i= dent) }; - } - } - } - InitializerKind::Init { ident, value, .. } =3D> { - // Again span for better diagnostics - let init =3D format_ident!("init", span =3D value.span()); - let value_init =3D if pinned { - quote! { - // SAFETY: - // - `slot` is valid, because we are inside of an = initializer closure, we - // return when an error/panic occurs. - // - We also use `#data` to require the correct tr= ait (`Init` or `PinInit`) - // for `#ident`. - unsafe { #data.#ident(&raw mut (*#slot).#ident, #i= nit)? }; - } - } else { - quote! { - // SAFETY: `slot` is valid, because we are inside = of an initializer - // closure, we return when an error/panic occurs. - unsafe { - ::pin_init::Init::__init( - #init, - &raw mut (*#slot).#ident, - )? - }; - } - }; - quote! { - #(#attrs)* - { - let #init =3D #value; - #value_init - } - } - } - InitializerKind::Code { .. } =3D> unreachable!(), - }; - - // `mixed_site` ensures that the guard is not accessible to the us= er-controlled code. - let guard =3D format_ident!("__{ident}_guard", span =3D Span::mixe= d_site()); - - let guard_creation =3D if pinned { - let project_ident =3D format_ident!("__project_{ident}"); + let slot =3D if pinned { quote! { // SAFETY: // - `&raw mut (*slot).#ident` points to the `#ident` fiel= d of `slot`. // - `&raw mut (*slot).#ident` is valid. // - `make_field_check` checks that `&raw mut (*slot).#ide= nt` is properly aligned. - // - `(*slot).#ident` has been initialized above. - // - We only need the ownership to the pointee back when i= nitialization has - // succeeded, where we `forget` the guard. - unsafe { #data.#project_ident(&raw mut (*slot).#ident) } + // - `make_field_check` prevents `#ident` from being used = twice, therefore + // `(*slot).#ident` is exclusively accessed and has not = been initialized. + (unsafe { #data.#ident(&raw mut (*#slot).#ident) }) } } else { quote! { + // For `init!()` macro, everything is unpinned. // SAFETY: // - `&raw mut (*slot).#ident` is valid. // - `make_field_check` checks that `&raw mut (*slot).#ide= nt` is properly aligned. - // - `(*slot).#ident` has been initialized above. - // - We only need the ownership to the pointee back when i= nitialization has - // succeeded, where we `forget` the guard. - unsafe { - ::pin_init::__internal::DropGuard::<::pin_init::__inte= rnal::Unpinned, _>::new( - &raw mut (*slot).#ident + // - `make_field_check` prevents `#ident` from being used = twice, therefore + // `(*slot).#ident` is exclusively accessed and has not = been initialized. + (unsafe { + ::pin_init::__internal::Slot::<::pin_init::__internal:= :Unpinned, _>::new( + &raw mut (*#slot).#ident ) + }) + } + }; + + // `mixed_site` ensures that the guard is not accessible to the us= er-controlled code. + let guard =3D format_ident!("__{ident}_guard", span =3D Span::mixe= d_site()); + + let init =3D match kind { + InitializerKind::Value { ident, value } =3D> { + let value =3D value + .as_ref() + .map(|(_, value)| quote!(#value)) + .unwrap_or_else(|| quote!(#ident)); + + quote! { + #(#attrs)* + let mut #guard =3D #slot.write(#value); + } } + InitializerKind::Init { value, .. } =3D> { + quote! { + #(#attrs)* + let mut #guard =3D #slot.init(#value)?; + } + } + InitializerKind::Code { .. } =3D> unreachable!(), }; =20 res.extend(quote! { #init =20 #(#cfgs)* - let mut #guard =3D #guard_creation; - - #(#cfgs)* - // NOTE: The reference is derived from the guard so that it on= ly lives as long as the - // guard does and cannot escape the scope. If it's created via= `&mut (*#slot).#ident` - // like the unaligned field guard, it will become effectively = `'static`. #[allow(unused_variables)] let #ident =3D #guard.let_binding(); }); diff --git a/rust/pin-init/internal/src/pin_data.rs b/rust/pin-init/interna= l/src/pin_data.rs index 713a43c27826..3278a54510e1 100644 --- a/rust/pin-init/internal/src/pin_data.rs +++ b/rust/pin-init/internal/src/pin_data.rs @@ -352,10 +352,9 @@ fn generate_the_pin_data( let (impl_generics, ty_generics, whr) =3D generics.split_for_impl(); =20 // For every field, we create an initializing projection function acco= rding to its projection - // type. If a field is structurally pinned, then it must be initialize= d via `PinInit`, if it is - // not structurally pinned, then it can be initialized via `Init`. - // - // The functions are `unsafe` to prevent accidentally calling them. + // type. If a field is structurally pinned, we create a `Slot` with `P= inned` which must be + // initialized via `PinInit`; if it is not structurally pinned, then w= e create a `Slot` with + // `Unpinned` which allows initialization via `Init`. let field_accessors =3D fields .iter() .map(|f| { @@ -370,54 +369,29 @@ fn generate_the_pin_data( let field_name =3D ident .as_ref() .expect("only structs with named fields are supported"); - let project_ident =3D format_ident!("__project_{field_name}"); - let (init_ty, init_fn, pin_marker, pin_safety) =3D if f.pinned= { - ( - quote!(PinInit), - quote!(__pinned_init), - quote!(Pinned), - quote!( - /// - `slot` will not move until it is dropped, i.= e. it will be pinned. - ), - ) + let pin_marker =3D if f.pinned { + quote!(Pinned) } else { - (quote!(Init), quote!(__init), quote!(Unpinned), quote!()) + quote!(Unpinned) }; quote! { - /// # Safety - /// - /// - `slot` is a valid pointer to uninitialized memory. - /// - the caller does not touch `slot` when `Err` is retur= ned, they are only - /// permitted to deallocate. - #pin_safety - #(#attrs)* - #vis unsafe fn #field_name( - self, - slot: *mut #ty, - init: impl ::pin_init::#init_ty<#ty, E>, - ) -> ::core::result::Result<(), E> { - // SAFETY: this function has the same safety requireme= nts as the __init function - // called below. - unsafe { ::pin_init::#init_ty::#init_fn(init, slot) } - } - /// # Safety /// /// - `slot` points to a `#ident` field of a pinned struct= that this `__ThePinData` - /// describes. - /// - `slot` is valid and properly aligned. - /// - `*slot` is initialized, and the ownership is transfe= rred to the returned - /// guard. + /// describes. + /// - `slot` is a valid, properly aligned and points to un= initialized and + /// exclusively accessed memory. #(#attrs)* - #vis unsafe fn #project_ident( + #[inline(always)] + #vis unsafe fn #field_name( self, slot: *mut #ty, - ) -> ::pin_init::__internal::DropGuard<::pin_init::__inter= nal::#pin_marker, #ty> { + ) -> ::pin_init::__internal::Slot<::pin_init::__internal::= #pin_marker, #ty> { // SAFETY: // - If `#pin_marker` is `Pinned`, the corresponding f= ield is structurally // pinned. // - Other safety requirements follows the safety requ= irement. - unsafe { ::pin_init::__internal::DropGuard::new(slot) } + unsafe { ::pin_init::__internal::Slot::new(slot) } } } }) diff --git a/rust/pin-init/src/__internal.rs b/rust/pin-init/src/__internal= .rs index d7fdcfef41d2..854fbcaa93f3 100644 --- a/rust/pin-init/src/__internal.rs +++ b/rust/pin-init/src/__internal.rs @@ -251,6 +251,83 @@ struct Foo { pub struct Pinned; pub struct Unpinned; =20 +/// Represent an uninitialized field. +/// +/// # Invariants +/// +/// - `ptr` is valid, properly aligned and points to uninitialized and exc= lusively accessed memory. +/// - If `P` is `Pinned`, then `ptr` is structurally pinned. +pub struct Slot { + ptr: *mut T, + _phantom: PhantomData

, +} + +impl Slot { + /// # Safety + /// + /// - `ptr` is valid, properly aligned and points to uninitialized and= exclusively accessed + /// memory. + /// - If `P` is `Pinned`, then `ptr` is structurally pinned. + #[inline(always)] + pub unsafe fn new(ptr: *mut T) -> Self { + // INVARIANT: Per safety requirement. + Self { + ptr, + _phantom: PhantomData, + } + } + + /// Initialize the field by value. + #[inline(always)] + pub fn write(self, value: T) -> DropGuard + where + T: Sized, + { + // SAFETY: `self.ptr` is a valid and aligned pointer for write. + unsafe { self.ptr.write(value) } + // SAFETY: + // - `self.ptr` is valid and properly aligned per type invariant. + // - `*self.ptr` is initialized above and the ownership is transfe= rred to the guard. + // - If `P` is `Pinned`, `self.ptr` is pinned. + unsafe { DropGuard::new(self.ptr) } + } +} + +impl Slot { + /// Initialize the field. + #[inline(always)] + pub fn init(self, init: impl Init) -> Result, E> { + // SAFETY: + // - `self.ptr` is valid and properly aligned. + // - when `Err` is returned, we also propagate the error without t= ouching `slot`; + // also `self` is consumed so it cannot be touched further. + unsafe { init.__init(self.ptr)? }; + + // SAFETY: + // - `self.ptr` is valid and properly aligned per type invariant. + // - `*self.ptr` is initialized above and the ownership is transfe= rred to the guard. + Ok(unsafe { DropGuard::new(self.ptr) }) + } +} + +impl Slot { + /// Initialize the field. + #[inline(always)] + pub fn init(self, init: impl PinInit) -> Result, E> { + // SAFETY: + // - `self.ptr` is valid and properly aligned. + // - when `Err` is returned, we also propagate the error without t= ouching `ptr`; + // also `self` is consumed so it cannot be touched further. + // - the drop guard will not hand out `&mut` (only `Pin<&mut T>`). + unsafe { init.__pinned_init(self.ptr)? }; + + // SAFETY: + // - `self.ptr` is valid, properly aligned and pinned per type inv= ariant. + // - `*self.ptr` is initialized above and the ownership is transfe= rred to the guard. + Ok(unsafe { DropGuard::new(self.ptr) }) + } +} + /// When a value of this type is dropped, it drops a `T`. /// /// Can be forgotten to prevent the drop. diff --git a/rust/pin-init/src/lib.rs b/rust/pin-init/src/lib.rs index 4098c65d63c3..e891d65cc469 100644 --- a/rust/pin-init/src/lib.rs +++ b/rust/pin-init/src/lib.rs @@ -867,12 +867,12 @@ macro_rules! stack_try_pin_init { #[macro_export] macro_rules! assert_pinned { ($ty:ty, $field:ident, $field_ty:ty, inline) =3D> { - let _ =3D move |ptr: *mut $field_ty| { - // SAFETY: This code is unreachable. - let data =3D unsafe { <$ty as $crate::__internal::HasPinData>:= :__pin_data() }; - let init =3D $crate::__internal::AlwaysFail::<$field_ty>::new(= ); - // SAFETY: This code is unreachable. - unsafe { data.$field(ptr, init) }.ok(); + // SAFETY: This code is unreachable. + let _ =3D move |ptr: *mut $field_ty| unsafe { + let data =3D <$ty as $crate::__internal::HasPinData>::__pin_da= ta(); + _ =3D data + .$field(ptr) + .init($crate::__internal::AlwaysFail::<$field_ty>::new()); }; }; =20 --=20 2.51.2 From nobody Fri Jun 12 21:38:20 2026 Received: from LO0P265CU003.outbound.protection.outlook.com (mail-uksouthazon11022118.outbound.protection.outlook.com [52.101.96.118]) (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 C3E453655DD; Tue, 12 May 2026 12:10:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.96.118 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778587821; cv=fail; b=MpoHId7hg4qi3+yU3eO+Xd8s30KxZyDJ2sVd1I37N0RxpDidY+2e8PZM6g2pwyca/zFTjahyj0YSQXLiSvY1TdcVv2BhXlmYYMKhr8As0l2NgcxUa/DcyFaiYrXRT7ZHDPZYNUlmEaxVmqugnxv/IV89kzPqIFyqQ8KmrIMV+AY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778587821; c=relaxed/simple; bh=Vo6V01Fhj94yZyW43dFjZfz/SVYXi6zvs5dXn9V1yCE=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=fSYwZzFEOfqrh8LG1VWf/BEMGBEsPauQD81/SQgsYNv923LAWuW5Rc4Y1lqMBWydECGUknbglNoZnPZbHq3UZwXOfug/ppYf+Q1JJaMeDFViTwH9t+/DRO+V5SFlfBsGnMpOFnh9cZHrxyT1CvvDG3Gcx5nylcO+S3EvtjPiueY= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=garyguo.net; spf=pass smtp.mailfrom=garyguo.net; dkim=pass (1024-bit key) header.d=garyguo.net header.i=@garyguo.net header.b=xhLbTqWj; arc=fail smtp.client-ip=52.101.96.118 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=garyguo.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=garyguo.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=garyguo.net header.i=@garyguo.net header.b="xhLbTqWj" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ygrcK1We3YRiVUTCdS2Tx5WT8mEEdMGSUB2ONrP7YUo6YaTWhaTl15r466ckzIeUHj/Xp3RE76EznKTTA9Yv1Eq+VD6DiI0m2PO4QtQdQvGSUYaC4iJdJgcysIbknaUxEKqHcYWbKq70U6kkaQctZfgE2IlDMq8FIqFoPNp0yYYxYIDTplndY8rIAPISRxkZSPE1zm+zTp+u5wRgaMQH5sUaL+qYod4PeqNRdfgNLhC82/cKGEJJKUC8rdF2oZOggjV9NemY4CrUS3DWQie7I98anY30KFpOX+ofHEVVqHLunCSrww/SXxnIWHiLGLjdhjz3Gg6dpc287FD5vir+Og== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=M+HhlVoRwmFDZCMWEimYCl1mcr0pdkVcFl2SqieMajk=; b=Ctigvj8hu/1UmwqpbHcjtMlFPeBwn+yMDF9ATWg63rcX7/oUbGwDhwMra1CKXHFk8V27TjfSlLCfCsF+Qfh1knF10s+GOFm/QCGK+K3sLE1U/C5Wn1NFo0mwvhS17pExg24I9SCUKjw9f++0cyr5iRTgqU9Pp2Dr94+zfZeS4aFjHQlGXqARCLNAXDS7SZ++fzZnCoZBqZstWFiXCNu2zuaW5hTxFOqgvnzt+IThlaioSZYKOFfCipu3aLWEcYXrzWvwTzHLa31ELccLzwUNz2tqbQ3Gm7uzBbKzzhSZ4CJcbjvgIKa+H3yiaRfLRPgEKV6AF5s35bjB/fxQDleplw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=garyguo.net; dmarc=pass action=none header.from=garyguo.net; dkim=pass header.d=garyguo.net; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=garyguo.net; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=M+HhlVoRwmFDZCMWEimYCl1mcr0pdkVcFl2SqieMajk=; b=xhLbTqWjN9aLGhpy2Arv7lTOA7yjMTbfI0YnIDF/9UxQUpWoi2soSpaAy6jkOW80/Pdg4bBI5bdiCMQHM6DKQhGzivgfTKpQTtm4kNMXNYPfU2sap1ZCvg7sU2zsxeFHNz8skJr3DUhSHlti8p/P7MGIbBQGXyo2xpfr/FfdXQk= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=garyguo.net; Received: from LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:488::16) by CWLP265MB6214.GBRP265.PROD.OUTLOOK.COM (2603:10a6:400:184::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.23; Tue, 12 May 2026 12:09:58 +0000 Received: from LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM ([fe80::1c3:ceba:21b4:9986]) by LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM ([fe80::1c3:ceba:21b4:9986%4]) with mapi id 15.20.9913.009; Tue, 12 May 2026 12:09:58 +0000 From: Gary Guo Date: Tue, 12 May 2026 13:09:53 +0100 Subject: [PATCH 8/8] rust: pin-init: internal: project using full slot Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260512-pin-init-sync-v1-8-81963130dfbd@garyguo.net> References: <20260512-pin-init-sync-v1-0-81963130dfbd@garyguo.net> In-Reply-To: <20260512-pin-init-sync-v1-0-81963130dfbd@garyguo.net> To: Benno Lossin , Miguel Ojeda , Boqun Feng , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Gary Guo X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1778587794; l=4230; i=gary@garyguo.net; s=20221204; h=from:subject:message-id; bh=Vo6V01Fhj94yZyW43dFjZfz/SVYXi6zvs5dXn9V1yCE=; b=tFZa8GF+JQizmGG+wibAINtzrvx95BJdp8HtwrjT7TpZCFX10WKWOdQtwjF75wJfBMfTe0URH dkq4e4SXcjcAacZ90l4Da425fPdqTmxWzugERSWPitCOGVEKNKyCqfD X-Developer-Key: i=gary@garyguo.net; a=ed25519; pk=vB3uIX95SM4eVrIqo1DWNWKDKD2xzB+yLLLr0yOPYMo= X-ClientProxiedBy: LO4P265CA0185.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:311::14) To LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:488::16) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LOVP265MB8871:EE_|CWLP265MB6214:EE_ X-MS-Office365-Filtering-Correlation-Id: 3a01aadc-898b-40e6-03fe-08deb01f624f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|7416014|10070799003|366016|18002099003|56012099003|22082099003; X-Microsoft-Antispam-Message-Info: 3CelxgcNPd/Av88ELXS+iy5ZAvhPeSWsmu/kpSU74Wcm7N11BRGOBYo6WW+KwKk8qbOzCaiPp6/nq94j47SZguaQbHgL3d81TmVNbH9bBZQd+TPPVuOOlaeo1j0nycfkfRYl478tLtrwM43TGiTA4EAXQCKHDMx2KjTqaiaTLF7BAy8pr9AJ+R53V59xd4hwLA4bj76cGkCQocGnbpMWzxmjtBUtu2wVmnUOa5N0MaIXRTqySaF5/s6kxbw/+RbjarQAcryqZV6YYzCQQv/M4VIWORrr1/xJ9JeXToberPz8ne6vr2a5vKX9CEcj03yr7ljE8fFbppOnH5bSnFMf9fjpzzbIbW+ggtLaqtymHbqQ4IjkZKOBdWMCViW3x2xH/rXegWZ1qW8DIQNg4tcbUncF/2LCX9fhZW+5MuIcN/h3KqH+9cQ4XT7jw7PqpIEsuEUkqPZvO6+cjm5Ot6WmY+YvyndVc3+R3eIx4ZGbsxBjxpxg/0Ln7CVNCHprPATkVcSmGC4Ybte2SYLB1Tc2CE8q5uRkDuTVWk1Ek+js1li1tRhpxo0bUt2p/5DDzIDaORNhzhXO19yKlFAyYBlPIYBexbRwiO1uHqJA6bHSj20UD+ID5L5pyfDEnviVqUZBN57705hHeJOVycVA2sOOvVIzNOY/T8zuHGi0eaFb2uHKWPMAdBwgExRYewCkR2XQ X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(7416014)(10070799003)(366016)(18002099003)(56012099003)(22082099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?Zkc5YkxrZjk0QjZPdW5DalpSUGZRTE5JZDQ5TlUyakpwcEE0OXJrMXYrTDJw?= =?utf-8?B?RkZtK2tuMmpSZUlxcTQxcFBnb2FjV3MxYjBXUkx3eHJ6Z3BtRkoraXBZRW1l?= =?utf-8?B?ejF5S05meG1id0VmeXFuZ2FpZE5hU1d5VStOMEFlMTZ4QitOdmdUa1NreG91?= =?utf-8?B?TW1iclBlM3dNK21vbEh4QWNxaUVaQ2o1V2NlTzJkVmVJZGFGdEZvc0FWclNT?= =?utf-8?B?ZGlwdFBESVd5djQyVldvRXE5VWFlejFhbVdyeXNXRnJBdDA0QWJpa0c4ZHhY?= =?utf-8?B?YXA4YksxNGRYUFVHczJsQURTU0xkYUNpalU5TGt5WlIwNzhiK0ZDTkNhV1JU?= =?utf-8?B?cDVXT09HM3R6K21uZUt2TGZvb1pZRzY2a1ZvN2F1cEo0bGZEbGhhWCtKcnIx?= =?utf-8?B?bk9IM2lwTUE4aFFJWFJDY2NSVlJKTmxXdVlKRGg2L1lWeHU5b2RlV25td1VJ?= =?utf-8?B?RTVqN2NzYzFKekd2SXlZdEhJTTc2QjN1R0tvVkdLVUhwTWdkVjVRYU93Wmc4?= =?utf-8?B?NndrMmUvU2tTVXRlTHZ6aDNlY0FPSlBDT0srdnpZZnVhdHl2ZHBrTGl2a1JI?= =?utf-8?B?QkFIbis2WW9QanNrOHZ6NXdwUWdFaUR0NHdNanUwVFlSS1Uzd0JWeFVPUTVL?= =?utf-8?B?VTJ4R0VtcmlMa05jaDU2QWd1WkpzK0hnM0d0MWVJRG93VjdyQlNJTGJMd25r?= =?utf-8?B?Z1M4eEtiUzFERVk0V3FtdVpxMXpIeEtRYWw1M05DN3c0SWJxU1I3OHJ1STRX?= =?utf-8?B?UHdld0pROVpBSDl4c3FoY3lKWVZZbkIydEFheFNMK0JoM1NheGgwV1ZiQ0l6?= =?utf-8?B?M2lVSmVFWkVYWDIyeTlvOUQ2elhrNyt6ZVRGYzVrOUhubjY5M0FnYWw0bzF4?= =?utf-8?B?WjUwbHE5Q1Z3cmtoRS9VMFB6TStGZ3pSSlFiUitHU3FiaW90RWxiSzdQVzBB?= =?utf-8?B?ZVl6RE1NRE9YM2p1UlpnVlhVOHZJVUNFTGtKTlQ0a0FmK3haK0RpT21ncmRh?= =?utf-8?B?TUxXRjZhbzZ1QUZsNFV1MlR4WmVCMmIveG9qRzdGbVluTGtXVzI3N09DZmpo?= =?utf-8?B?UDhqK2ZkeVFyeGIwZUJ0cUlOZ0ozV0p3WndwbmtGbTFULzV0Rk02bk5IOTdI?= =?utf-8?B?cldEc0Z3MDVsQ1VESmYzY3dneWMwNEJWSk82cXhXYWRxVnFvY0JtcmlpcUxt?= =?utf-8?B?RUV2USszR0tYOTBjWHZUUm5sL2hCMHBQM0VCN2gxM2NZOFplRktMR2tPbENn?= =?utf-8?B?cXBWbmxRbkdpUG9XbjVyVTVHMGQ3bkNaay82am0zNC8wRXN6bWo4M0JWT1pt?= =?utf-8?B?QkxzbmJNK3VUOGVoaWNGalpBU1YyY2V1VkxNQ2szSS8yTkxGTmk4bkVneUpN?= =?utf-8?B?NyswVGtKM2UrUmp0bytPVEs0YmlMcmpzQ2d2Y3hlS2hoQ1QyUHNrOWhITWdk?= =?utf-8?B?ZzlQdmhRcWlESG9XSWlnVk5TZEZkUTBNaUlHaExHQUhkL1o2QWFHNno3cE4v?= =?utf-8?B?Um0wa2ozVE1vbzQ3UWVUclR6YytmdHpuSXBibWc5dUZ2aEczeExsOW5GYTdv?= =?utf-8?B?OU5mZFkxckVxY3RBVzh2YUZDYnY2Qlpmcy9Ydi96Sk0zd2c5NnVqU1J3enpp?= =?utf-8?B?Y05kb3daM2VnMnE5WVdMM0VkV0l5N2k2aXhiVHlPZ2JRSTFMZGJSeUJHRUdq?= =?utf-8?B?WmRwRUtVMXRBUnFHTGNBK24yZGVJVlg5YVF2MytLM0dublFqeHBQdDV6L3M5?= =?utf-8?B?aVRNdVNOOXZwd2xKRUVvanpRR2ljRnRCZy92ckEwYXFuTVZoWTNiNndSSFMw?= =?utf-8?B?a3dnY3NOTXNHd3daL05MNnFGbU8yblUvc0NTUjRJSDFEMUZ6d1ZPYzMvT0tJ?= =?utf-8?B?SGUyREdMOGtuME9YckxCVlYzQ0s0QU9OTWZUWUZKc1hWQ3QzM2Rqd2lOQ3RC?= =?utf-8?B?WWR4cGVPYlZxY3VlSVhZZ3lRWWJ5N054T1FkaENmbGlaUlhtS2tXVzkwOWFS?= =?utf-8?B?LzhpdlRidTFjRlF2UzNna3NrRzNKZkR5UjUydVU5anNwUDBad1kycUtzL0Fm?= =?utf-8?B?cGY0S2VDZlBoamRvVjBxNjVESzh2dTg4V0tlSVZ6Z2Y3eUJKc3BYb3daUEk1?= =?utf-8?B?SVJncFJaRHo5YnhFSFdOSVJ2Ukl1ZUNoeXJYTERkWXdzc2plWmlEYzZIZUVq?= =?utf-8?B?MTNmalV1K1FiaHpOSGJMN0swZVREUUVwSFpTcERDYTBKVmZQNUIwcEZUcjFh?= =?utf-8?B?OFRPNnI4VXoyQUxsajErSmZWak1GMm1pdzA4bXRuajFKcUVPdExlb0lid2tx?= =?utf-8?B?NlVya2xBVUZzb1ZuRitHSVVPM1NQZThLd0FkRW9aSEZMUU1YWTBEUT09?= X-OriginatorOrg: garyguo.net X-MS-Exchange-CrossTenant-Network-Message-Id: 3a01aadc-898b-40e6-03fe-08deb01f624f X-MS-Exchange-CrossTenant-AuthSource: LOVP265MB8871.GBRP265.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 May 2026 12:09:57.3755 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: bbc898ad-b10f-4e10-8552-d9377b823d45 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: uA7G4O8d2I9hZN4rgG8ZTDvzQgNo+w2FwyzIx4ms+RkfU0RqOxs9CZtPtE2dgYGLGdV9Mqbc0O8Yo4bVB9+pMw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CWLP265MB6214 Instead of projecting using pointer to a field project the full slot. This further shifts the code generation from the initializer site to the struct definition site, which means less code is generated overall. It also makes the safety comment easier to justify, as now the projection is done by the `#[pin_data]` macro which has full visibility of pinnedness of fields. The field alignment could also be checked on the `#[pin_data]` side; however, since `init!()` macro works for other type of structs, we cannot remove the alignment check from `init!`/`pin_init!` side anyway, so I opted to still keep the alignment check in init.rs. Signed-off-by: Gary Guo --- rust/pin-init/internal/src/init.rs | 5 ++--- rust/pin-init/internal/src/pin_data.rs | 12 ++++++------ rust/pin-init/src/lib.rs | 2 +- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/rust/pin-init/internal/src/init.rs b/rust/pin-init/internal/sr= c/init.rs index e6f5ea06f91b..699b105570a5 100644 --- a/rust/pin-init/internal/src/init.rs +++ b/rust/pin-init/internal/src/init.rs @@ -245,12 +245,11 @@ fn init_fields( let slot =3D if pinned { quote! { // SAFETY: - // - `&raw mut (*slot).#ident` points to the `#ident` fiel= d of `slot`. - // - `&raw mut (*slot).#ident` is valid. + // - `slot` is valid and properly aligned. // - `make_field_check` checks that `&raw mut (*slot).#ide= nt` is properly aligned. // - `make_field_check` prevents `#ident` from being used = twice, therefore // `(*slot).#ident` is exclusively accessed and has not = been initialized. - (unsafe { #data.#ident(&raw mut (*#slot).#ident) }) + (unsafe { #data.#ident(#slot) }) } } else { quote! { diff --git a/rust/pin-init/internal/src/pin_data.rs b/rust/pin-init/interna= l/src/pin_data.rs index 3278a54510e1..a3431863f5d6 100644 --- a/rust/pin-init/internal/src/pin_data.rs +++ b/rust/pin-init/internal/src/pin_data.rs @@ -377,21 +377,21 @@ fn generate_the_pin_data( quote! { /// # Safety /// - /// - `slot` points to a `#ident` field of a pinned struct= that this `__ThePinData` - /// describes. - /// - `slot` is a valid, properly aligned and points to un= initialized and - /// exclusively accessed memory. + /// - `slot` is valid and properly aligned. + /// - `(*slot).#field_name` is properly aligned. + /// - `(*slot).#field_name` points to uninitialized and ex= clusively accessed + /// memory. #(#attrs)* #[inline(always)] #vis unsafe fn #field_name( self, - slot: *mut #ty, + slot: *mut #struct_name #ty_generics, ) -> ::pin_init::__internal::Slot<::pin_init::__internal::= #pin_marker, #ty> { // SAFETY: // - If `#pin_marker` is `Pinned`, the corresponding f= ield is structurally // pinned. // - Other safety requirements follows the safety requ= irement. - unsafe { ::pin_init::__internal::Slot::new(slot) } + unsafe { ::pin_init::__internal::Slot::new(&raw mut (*= slot).#field_name) } } } }) diff --git a/rust/pin-init/src/lib.rs b/rust/pin-init/src/lib.rs index e891d65cc469..c9e2cbe27915 100644 --- a/rust/pin-init/src/lib.rs +++ b/rust/pin-init/src/lib.rs @@ -868,7 +868,7 @@ macro_rules! stack_try_pin_init { macro_rules! assert_pinned { ($ty:ty, $field:ident, $field_ty:ty, inline) =3D> { // SAFETY: This code is unreachable. - let _ =3D move |ptr: *mut $field_ty| unsafe { + let _ =3D move |ptr: *mut $ty| unsafe { let data =3D <$ty as $crate::__internal::HasPinData>::__pin_da= ta(); _ =3D data .$field(ptr) --=20 2.51.2