diff --git a/.github/workflows/bindgen.yml b/.github/workflows/bindgen.yml
index 502f914697..794239699e 100644
--- a/.github/workflows/bindgen.yml
+++ b/.github/workflows/bindgen.yml
@@ -227,6 +227,7 @@ jobs:
           BINDGEN_FEATURE_RUNTIME: ${{matrix.feature_runtime}}
           BINDGEN_FEATURE_EXTRA_ASSERTS: ${{matrix.feature_extra_asserts}}
           BINDGEN_NO_DEFAULT_FEATURES: ${{matrix.no_default_features}}
+          BINDGEN_RUST_FOR_LINUX_TEST: ${{matrix.os == 'ubuntu-latest' && matrix.llvm_version == '16.0' && matrix.feature_extra_asserts == 0 && 1 || 0}}
         run: ./ci/test.sh
 
   check-cfg:
diff --git a/ci/test.sh b/ci/test.sh
index 11e091f49f..bec7cfbb0c 100755
--- a/ci/test.sh
+++ b/ci/test.sh
@@ -118,3 +118,79 @@ assert_no_diff
 
 # Run the integration tests
 (cd bindgen-integration && cargo test $CARGO_ARGS)
+
+if [ "$BINDGEN_RUST_FOR_LINUX_TEST" == "1" ]; then
+  # Run the Rust for Linux test
+  #
+  # This is intended to be an end-to-end test that runs what Linux kernel
+  # developers/users would do. It is a quick, build-only test of the Rust code
+  # in the Linux kernel.
+
+  # Put LLVM binaries in the path for `LLVM=1`. The LLVM `bin` directory should
+  # go first since there are others in the Ubuntu image.
+  export PATH="${LLVM_DIRECTORY}/bin:${PATH}"
+
+  # Kernel build dependency: `bindgen-cli`, which is under test.
+  #
+  # Using `cargo build` (and adding the two common profiles to the `$PATH`) so
+  # that we can use `$CARGO_ARGS` as is, since `cargo install` does not support
+  # `--release`. `--target-dir` is used to isolate from other possible tests.
+  # A cleaner alternative is using `--out-dir`, but it is unstable.
+  (cd bindgen-cli && cargo build --target-dir ${HOME}/.bindgen $CARGO_ARGS)
+  export PATH="${HOME}/.bindgen/release:${HOME}/.bindgen/debug:${PATH}"
+
+  # Kernel build dependency: `libelf-dev`.
+  sudo apt-get update
+  sudo apt-get install libelf-dev
+
+  # Kernel build dependency: the Rust standard library sources.
+  #
+  # `rustup` is used here to install the `rust-src` component (instead of using
+  # `actions-rs/toolchain`'s `components` option in the workflow step) since we
+  # only need it for this test, and anyway the action installs `rustup`.
+  rustup component add rust-src
+
+  # Ideally this should be updated from time to time (e.g. every kernel `-rc1`),
+  # and each update should only contain this change.
+  #
+  # Both commit hashes and tags are supported.
+  LINUX_VERSION=c13320499ba0efd93174ef6462ae8a7a2933f6e7
+
+  # Download Linux at a specific commit
+  mkdir -p linux
+  git -C linux init
+  git -C linux remote add origin https://github.com/torvalds/linux.git
+  git -C linux fetch --depth 1 origin ${LINUX_VERSION}
+  git -C linux checkout FETCH_HEAD
+
+  # Configure Rust for Linux
+  cat <<EOF > linux/kernel/configs/rfl-for-bindgen-ci.config
+# CONFIG_WERROR is not set
+
+CONFIG_RUST=y
+
+CONFIG_SAMPLES=y
+CONFIG_SAMPLES_RUST=y
+
+CONFIG_SAMPLE_RUST_MINIMAL=m
+CONFIG_SAMPLE_RUST_PRINT=y
+
+CONFIG_RUST_PHYLIB_ABSTRACTIONS=y
+CONFIG_AX88796B_PHY=y
+CONFIG_AX88796B_RUST_PHY=y
+
+CONFIG_KUNIT=y
+CONFIG_RUST_KERNEL_DOCTESTS=y
+EOF
+
+  make -C linux LLVM=1 -j$(($(nproc) + 1)) \
+      rustavailable \
+      defconfig \
+      rfl-for-bindgen-ci.config
+
+  # Build Rust for Linux
+  make -C linux LLVM=1 -j$(($(nproc) + 1)) \
+      samples/rust/rust_minimal.o \
+      samples/rust/rust_print.o \
+      drivers/net/phy/ax88796b_rust.o
+fi