From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 4C708335065; Wed, 14 Jan 2026 18:19:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768414785; cv=none; b=U/eCcxZurZRk4symx5jJbXVuwZ7aB+1T57KUV5VKYpYzw+lo/yXckyRzpJEz+OzG709c1cGDoXicDEQehoQZD/cJqezKf4mqC0pxUTe4SQGT2oOEM06UD6GFn9URXati2kjguIYaIS1gFRKrr2VizVm4GCSRocus7h/OnIVP5J8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768414785; c=relaxed/simple; bh=44TH5yZ5qLvJhD3hw/Km0/wY4iVck4kZTVZNpsUJ0ow=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=bF2pQZcwgngNdWPKZ3/9Aie4+QnUPYTF78T/S1+nbY/ACCKITwVfdiwloXmTqfZn5RJ5Sjia94UKy1Y4mbFyjvWoRaLkATUmtZrnOi4P8QYXd6QK4bf9ru83PeMimWX0HAQIWZOA06wI/ZeTilA9EsLtC/UVy6diqL6uBvRdtZE= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=jO1dVKmE; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="jO1dVKmE" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 844D1C4CEF7; Wed, 14 Jan 2026 18:19:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1768414785; bh=44TH5yZ5qLvJhD3hw/Km0/wY4iVck4kZTVZNpsUJ0ow=; h=From:To:Cc:Subject:Date:From; b=jO1dVKmEdC0Q3S7wxZuBYjmY9kweLlTgZiTxh14mlDgxwJ/XJHa/f1OtWb4RroBRD ishX03kDNGB8wby7DLBIict6290n4LpqFZ+oG6c0TgUtPLDSGYb3eaSfespaDIttTN K4nBrzzhEQ0xja23Kt2jjuEIWvwZjijF5gi3g9YBtiHe8Bz5i0f2/7evZC8j2B48/L 4euye2LbHcBibvU4tMgIX7SuIQHG+G0nmPkhTiaToM3cZNr9V1Ee6tXw0fxEWAaddl kLw77JOAFEsqlXh6h9KYJrkTL2auqg347l0JNjC3xUOJgM9zxakqH8q+kw6XQhXiOE 7RqGXU5rulRCg== From: Benno Lossin To: Miguel Ojeda , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich Cc: linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org Subject: [PATCH v3 00/15] `syn` rewrite of pin-init Date: Wed, 14 Jan 2026 19:18:35 +0100 Message-ID: <20260114181934.1782470-1-lossin@kernel.org> X-Mailer: git-send-email 2.52.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Rewrite the proc-macros of pin-init by using the `syn` crate for Rust syntax parsing. This series has been a long way coming. At the very start of pin-init, I initially implemented everything using syn, since parsing is so much easier with it. Now after several years it is finally time to remove the dreaded 1600 lines of declarative macros required to parse and expand the initializer syntax. The move to syn is not only a blessing for the maintenance work, but also improves the implementation of new features. This series includes many such improvements. * Patch 1, 2, 3 and 4 prepare for the rewrite. The first removes the superfluous `try_` variants of the initializer macros from pin-init. Note that the kernel defines its own, so no code changes in the kernel are required. The second patch allows using `::pin_init` in the pin-init crate. The third adds the syn dependency and cleans up some old workarounds and new clippy warnings. The fourth adds better error handling on top of `syn`. * Patch 5, 6, 7, and 9 rewrite the derive macros for Zeroable, `#[pinned_drop]` attribute macro, `#[pin_data]` attribute macro, and the initializer macros respectively using `syn`. * Patch 8 ensures soundness in the future by fixing generic bounds in generated code by `#[pin_data]`. * Patch 10 adds the `#[default_error(type)]` attribute to initializer macros allowing them to specify a default error that is used when no error is manually specified. * Patch 11 uses `#[default_error(type)]` in the definition of the kernel's `try_` variants of the initializer macros (which defaults to the kernel's `Error` type). * Patch 12 allows putting attributes on fields in initializer macros (for example `cfg` attributes). * Patch 13 adds `#[disable_initialized_field_access]` to support packed structs. * Patch 14 simplifies the code generated by the initializer macros. * Patch 15 adds Gary as a maintainer. In addition to the new features, using syn results in much cleaner error messages and more accurate span information. The code is much easier to read as well and hopefully easier to understand as well. As always, tests that ensure the correctness of the macro output are included and updated in the upstream pin-init repository. Take a look at the pull request on GitHub for the diff in the test output: https://github.com/Rust-for-Linux/pin-init/pull/89 I would greatly appreciate Tested-by's from people actively using pin-init weather in the kernel or outside. The commit adding syn support to pin-init is also used by Gary's series to rewrite the `macros` crate using `syn`: https://lore.kernel.org/all/20260112170919.1888584-1-gary@kernel.org My series can be found at: https://github.com/BennoLossin/linux/commits/pin-init/sync The rust-dev branch in the RfL repository will be updated to contain both patch series for ease of use & testing. Link to previous versions: - v2: https://lore.kernel.org/all/20260111122554.2662175-1-lossin@kernel.org - v1: https://lore.kernel.org/all/20260108135127.3153925-1-lossin@kernel.org Cheers, Benno Benno Lossin (15): rust: pin-init: remove `try_` versions of the initializer macros rust: pin-init: allow the crate to refer to itself as `pin-init` in doc tests rust: pin-init: add `syn` dependency and remove `proc-macro[2]` and `quote` workarounds rust: pin-init: internal: add utility API for syn error handling rust: pin-init: rewrite `derive(Zeroable)` and `derive(MaybeZeroable)` using `syn` rust: pin-init: rewrite the `#[pinned_drop]` attribute macro using `syn` rust: pin-init: rewrite `#[pin_data]` using `syn` rust: pin-init: add `?Sized` bounds to traits in `#[pin_data]` macro rust: pin-init: rewrite the initializer macros using `syn` rust: pin-init: add `#[default_error()]` attribute to initializer macros rust: init: use `#[default_error(err)]` for the initializer macros rust: pin-init: internal: init: add support for attributes on initializer fields rust: pin-init: internal: init: add escape hatch for referencing initialized fields rust: pin-init: internal: init: simplify Zeroable safety check MAINTAINERS: add Gary Guo to pin-init MAINTAINERS | 1 + rust/Makefile | 16 +- rust/kernel/init.rs | 40 +- rust/pin-init/README.md | 2 +- rust/pin-init/examples/linked_list.rs | 19 +- rust/pin-init/examples/pthread_mutex.rs | 10 +- rust/pin-init/internal/src/diagnostics.rs | 30 + rust/pin-init/internal/src/helpers.rs | 152 -- rust/pin-init/internal/src/init.rs | 549 +++++++ rust/pin-init/internal/src/lib.rs | 48 +- rust/pin-init/internal/src/pin_data.rs | 637 ++++++-- rust/pin-init/internal/src/pinned_drop.rs | 88 +- rust/pin-init/internal/src/zeroable.rs | 157 +- rust/pin-init/src/lib.rs | 173 +-- rust/pin-init/src/macros.rs | 1677 --------------------- scripts/generate_rust_analyzer.py | 2 +- 16 files changed, 1301 insertions(+), 2300 deletions(-) create mode 100644 rust/pin-init/internal/src/diagnostics.rs delete mode 100644 rust/pin-init/internal/src/helpers.rs create mode 100644 rust/pin-init/internal/src/init.rs delete mode 100644 rust/pin-init/src/macros.rs base-commit: 9448598b22c50c8a5bb77a9103e2d49f134c9578 -- 2.52.0