
Linux Kernel v6.18 is Released: This is What's New for Compute Express Link (CXL)
- Steve Scargall
- Cxl
- November 30, 2025
The Linux Kernel v6.18 release brings several improvements and additions related to Compute Express Link (CXL) technology.
Release Highlights
Linux Kernel v6.18 includes 32 commits to the CXL and DAX subsystems:
| Category | Commits |
|---|---|
| New Features & Hardware | 1 |
| Bug Fixes | 4 |
| Refactoring & Cleanup | 5 |
| Testing | 2 |
| Other | 20 |
The v6.18 kernel cycle for CXL/DAX is defined by two architectural threads running in parallel: hardening the address-translation stack and untangling port initialization from topology discovery. On the translation side, the new SPA-to-DPA region mapping infrastructure lands alongside a dedicated root-decoder ops structure that formalizes how the host physical address space is projected into CXL’s device physical address space — including XOR-interleaving math that was previously implicit. These foundations make region geometry computable and auditable in ways that earlier releases left to convention.
Port and dport lifecycle management received significant rework. Register setup for switch ports is now deferred until the first downstream port actually appears, rather than being triggered speculatively at port creation time. A matching helper to delete dports and a topology-detection helper for the root of the CXL device tree give drivers cleaner primitives to reason about partially-populated fabrics. The SSLBIS handler was simultaneously narrowed to a single-dport model, removing ambiguity in how system locality information propagates through switches.
The HMAT coupling that previously forced CXL access-coordinate updates to travel through the ACPI HMAT path is gone. CXL now writes its access coordinates directly, which removes a layering dependency and eliminates the now-dead hmat_update_target_coordinates() helper. On the observability side, poison injection gains region-level offset addressing and locked variants of the inject/clear functions, while the cxl_poison trace event correctly subtracts to recover the hpa_alias0 — fixing a latent calculation error in the tracing path.
Key Changes
SPA-to-DPA address translation: A new region-level mapping between System Physical Addresses and Device Physical Addresses is introduced, giving the CXL subsystem a formal, queryable translation layer rather than relying on implicit arithmetic scattered across drivers.
Root decoder ops and XOR math: The
hpa_to_spacallback is promoted into a structuredcxl_root_decoder_ops, and a dedicated callback for XOR-based interleave math is wired in. This makes non-standard interleave topologies first-class citizens in the decoder model.Deferred dport and port register setup: Switch port component registers are now set up only when the first downstream port is discovered, rather than at port creation. Combined with a new dport-deletion helper, this makes hot-plug and partial-topology scenarios substantially less error-prone.
Direct CXL access coordinate updates: CXL no longer routes access-coordinate data through HMAT; it writes coordinates directly. This removes an ACPI layering dependency and deletes
hmat_update_target_coordinates(), which had become dead code.Region-level poison injection: Poison can now be injected and cleared by region offset rather than only by raw device address. Locked variants of the inject/clear functions are also added so callers that already hold the region lock do not need to drop it.
SSLBIS single-dport enforcement: The system-locality-based bandwidth and latency information (SSLBIS) handler is restricted to operate on a single downstream port, fixing an implicit assumption that previously allowed multi-dport ambiguity to silently produce incorrect locality data.
ACPI and resource fixes:
cxl_acpi_set_cache_size()had an incorrect memory resource setup that could misconfigure cache-capable regions; this is corrected. The CFMW coherency restriction fields are also renamed to match the current CXL specification terminology, reducing confusion when reading ACPI CEDT tables.match_region_by_range()fix: The region-range matching function was not callingregion_res_match_cxl_range(), meaning region lookups could silently return incorrect results for non-trivial interleave configurations. The fix ensures the correct range-comparison helper is always used.
CXL related changes from Kernel v6.17 to v6.18
Here is the detailed list of all commits merged into the 6.18 Kernel for CXL and DAX. This list was generated by the Linux Kernel CXL Feature Tracker .
- cxl: Adjust offset calculation for poison injection
- cxl/trace: Subtract to find an hpa_alias0 in cxl_poison events
- cxl/region: Use %pa printk format to emit resource_size_t
- cxl: Fix match_region_by_range() to use region_res_match_cxl_range()
- cxl: Set range param for region_res_match_cxl_range() as const
- cxl/acpi: Fix setup of memory resource in cxl_acpi_set_cache_size()
- cxl/features: Add check for no entries in cxl_feature_info
- cxl/port: Avoid missing port component registers setup
- Merge branch ‘for-6.18/cxl-delay-dport’ into cxl-for-next
- cxl: Move port register setup to when first dport appear
- cxl: Change sslbis handler to only handle single dport
- cxl/test: Adjust the mock version of devm_cxl_switch_port_decoders_setup()
- cxl/test: Add mock version of devm_cxl_add_dport_by_dev()
- cxl: Defer dport allocation for switch ports
- cxl/test: Refactor decoder setup to reduce cxl_test burden
- cxl: Add a cached copy of target_map to cxl_decoder
- cxl: Add helper to delete dport
- cxl: Add helper to detect top of CXL device topology
- cxl/acpi: Rename CFMW coherency restrictions
- Merge branch ‘for-6.18/cxl-update-access-coordinates’ into cxl-for-next
- acpi/hmat: Remove now unused hmat_update_target_coordinates()
- cxl, acpi/hmat: Update CXL access coordinates directly instead of through HMAT
- cxl: Fix emit of type resource_size_t argument for validate_region_offset()
- Merge branch ‘for-6.18/cxl-poison-inject’ into cxl-for-next
- cxl/region: Add inject and clear poison by region offset
- cxl/core: Add locked variants of the poison inject and clear funcs
- cxl/region: Introduce SPA to DPA address translation
- cxl: Define a SPA->CXL HPA root decoder callback for XOR Math
- cxl: Move hpa_to_spa callback to a new root decoder ops structure
- cxl/region: use str_enabled_disabled() instead of ternary operator
- cxl/hdm: Use str_plural() to simplify the code
- fs: rename generic_delete_inode() and generic_drop_inode()


