
Linux Kernel v7.0 is Released: This is What's New for Compute Express Link (CXL)
- Steve Scargall
- Cxl
- April 12, 2026
The Linux Kernel v7.0 release brings several improvements and additions related to Compute Express Link (CXL) technology.
Release Highlights
Linux Kernel v7.0 includes 73 commits to the CXL and DAX subsystems:
| Category | Commits |
|---|---|
| New Features & Hardware | 3 |
| Bug Fixes | 11 |
| Refactoring & Cleanup | 9 |
| Testing | 2 |
| Other | 48 |
Linux v7.0 brings focused but meaningful progress to the CXL/DAX subsystem, with the headline work centered on platform-specific address translation. The cxl/atl subsystem gains AMD Zen5 support through the ACPI Platform Runtime Mechanism Table (PRMT), enabling hardware-assisted Host Physical Address (HPA) to System Physical Address (SPA) translation on AMD’s latest server platforms. This required scaffolding across several layers: EFI runtime services preparation in cxl/acpi, new translation callback hooks, decoder locking for address translation paths, and explicit disabling of these handlers when Normalized Addressing is active — a sign the translation infrastructure is maturing toward multi-vendor, multi-mode support.
Stability receives serious attention in this release. Eleven bug fixes address a range of correctness issues, including a use-after-free in cxl_detach_ep() during port teardown, a deadlock in cxl_memdev_autoremove() triggered on attach failure, and a race condition around nvdimm_bus object creation during nvdimm registration. A fix to HDM decoder fallback logic prevents incorrect DVSEC-based configuration when HDM decoders are already enabled — a subtle but important correctness fix for systems where both mechanisms coexist. Region construction also sees a leak fix and improved separation between parameter setup and construction phases.
On the cleanup front, v7.0 continues consolidating the CXL PCI stack by removing now-redundant helper functions for CXL Virtual Hierarchy, Restricted CXL Host, and Endpoint handling paths that had accumulated in core/pci.c. The port subsystem moves dport removal to devres groups, and devm_cxl_add_memdev() is converted to scope-based cleanup — both reducing manual teardown logic and aligning with modern kernel resource management conventions. Treewide memory allocation modernizations (kmalloc_obj, updated default GFP_KERNEL arguments) also sweep through CXL code as part of broader kernel hygiene work.
Key Changes
AMD Zen5 Address Translation via ACPI PRMT:
cxl/atlnow supports AMD Zen5 platforms using the ACPI Platform Runtime Mechanism Table, enabling hardware-assisted HPA-to-SPA translation for CXL memory. This brings proper CXL interleaving support to AMD’s current server-class processors.HPA Translation Callback Infrastructure: New callback hooks for HPA address range translation are introduced alongside decoder locking for translation paths. Normalized Addressing mode explicitly disables these handlers, establishing a clean separation between address translation modes across different platform configurations.
HDM Decoder DVSEC Fallback Correctness Fix:
cxl/hdmwas incorrectly falling back to DVSEC-based decoder configuration even when HDM decoders were already enabled and active. The fix prevents misconfigured decoder paths on systems where both mechanisms are present.Port and Region Lifecycle Safety: A use-after-free of
parent_portincxl_detach_ep()and a memory leak in__construct_region()are both resolved. These fixes matter for reliable hotplug and region teardown on production systems.Deadlock and Race Condition Fixes:
cxl_memdev_autoremove()could deadlock when an attach operation failed mid-flight; that code path is now corrected. A separate race in nvdimm object creation — wherenvdimm_buscould be freed while nvdimm objects were still being registered — is also fixed.CXL PCI Stack Consolidation: Redundant helper functions for CXL VH, RCH, and Endpoint handling are removed from
core/pci.c, along with a staleFIXMEcomment and its associatedBUILD_BUG_ON. This trims dead code and simplifies the boundary between the CXL core and the PCI integration layer.cxl_memdev_attachfor Ordered Device Initialization: A newcxl_memdev_attachinterface coordinates setup of CXL-dependent operations, giving drivers a structured hook for initialization that depends on memory device attachment completing successfully.Port and Memdev Resource Management Improvements: Dport removal in
cxl/portis now managed viadevresgroups rather than manual teardown, anddevm_cxl_add_memdev()is converted to scope-based cleanup. Both changes reduce error-prone manual resource ordering in teardown paths.
CXL related changes from Kernel v6.19 to v7.0
Here is the detailed list of all commits merged into the 7.0 Kernel for CXL and DAX. This list was generated by the Linux Kernel CXL Feature Tracker .
- cxl: Adjust the startup priority of cxl_pmem to be higher than that of cxl_acpi
- cxl/mbox: Use proper endpoint validity check upon sanitize
- cxl/hdm: Avoid incorrect DVSEC fallback when HDM decoders are enabled
- cxl/acpi: Fix CXL_ACPI and CXL_PMEM Kconfig tristate mismatch
- cxl/region: Fix leakage in __construct_region()
- cxl/port: Fix use after free of parent_port in cxl_detach_ep()
- cxl/region: Test CXL_DECODER_F_NORMALIZED_ADDRESSING as a bitmask
- cxl: Test CXL_DECODER_F_LOCK as a bitmask
- cxl/mbox: validate payload size before accessing contents in cxl_payload_from_user_allowed()
- cxl: Fix race of nvdimm_bus object when creating nvdimm objects
- cxl: Move devm_cxl_add_nvdimm_bridge() to cxl_pmem.ko
- cxl/port: Hold port host lock during dport adding.
- cxl/port: Introduce port_to_host() helper
- cxl/memdev: fix deadlock in cxl_memdev_autoremove() on attach failure
- Convert ‘alloc_flex’ family to use the new default GFP_KERNEL argument
- Convert ‘alloc_obj’ family to use the new default GFP_KERNEL argument
- treewide: Replace kmalloc with kmalloc_obj for non-scalar types
- Merge tag ‘cxl-for-7.0’ of git://git.kernel.org/pub/scm/linux/kernel/git/cxl/cxl
- Merge branch ‘acpi-apei’
- Merge branch ‘for-7.0/cxl-prm-translation’ into cxl-for-next
- cxl: Disable HPA/SPA translation handlers for Normalized Addressing
- cxl/region: Factor out code into cxl_region_setup_poison()
- cxl/atl: Lock decoders that need address translation
- cxl: Enable AMD Zen5 address translation using ACPI PRMT
- cxl/acpi: Prepare use of EFI runtime services
- cxl: Introduce callback for HPA address ranges translation
- cxl/region: Use region data to get the root decoder
- cxl/region: Add @hpa_range argument to function cxl_calc_interleave_pos()
- cxl/region: Separate region parameter setup and region construction
- cxl: Simplify cxl_root_ops allocation and handling
- cxl/region: Store HPA range in struct cxl_region
- cxl/region: Store root decoder in struct cxl_region
- cxl/region: Rename misleading variable name @hpa to @hpa_range
- Merge branch ‘for-7.0/cxl-aer-prep’ into cxl-for-next
- cxl/port: Unify endpoint and switch port lookup
- cxl/port: Move endpoint component register management to cxl_port
- cxl/port: Map Port RAS registers
- cxl/port: Move dport RAS setup to dport add time
- cxl/port: Move dport probe operations to a driver event
- cxl/port: Move decoder setup before dport creation
- cxl/port: Cleanup dport removal with a devres group
- cxl/port: Reduce number of @dport variables in cxl_port_add_dport()
- cxl/port: Cleanup handling of the nr_dports 0 -> 1 transition
- Merge branch ‘for-7.0/cxl-misc’ into cxl-for-next
- cxl: Fix premature commit_end increment on decoder commit failure
- Merge branch ‘for-7.0/cxl-init’ into cxl-for-next
- Merge branch ‘for-7.0/cxl-aer-prep’ into cxl-for-next
- cxl/region: Use do_div() for 64-bit modulo operation
- cxl/region: Translate HPA to DPA and memdev in unaligned regions
- cxl/region: Translate DPA->HPA in unaligned MOD3 regions
- cxl/core: Fix cxl_dport debugfs EINJ entries
- cxl/acpi: Remove cxl_acpi_set_cache_size()
- cxl/hdm: Fix newline character in dev_err() messages
- cxl/pci: Remove outdated FIXME comment and BUILD_BUG_ON
- cxl: Update RAS handler interfaces to also support CXL Ports
- cxl/mem: Clarify @host for devm_cxl_add_nvdimm()
- cxl/pci: Move CXL driver’s RCH error handling into core/ras_rch.c
- PCI/AER: Replace PCIEAER_CXL symbol with CXL_RAS
- cxl/pci: Remove CXL VH handling in CONFIG_PCIEAER_CXL conditional blocks from core/pci.c
- cxl/pci: Remove unnecessary CXL RCH handling helper functions
- cxl/pci: Remove unnecessary CXL Endpoint handling helper functions
- PCI: Update CXL DVSEC definitions
- PCI: Move CXL DVSEC definitions into uapi/linux/pci_regs.h
- ACPI: extlog: Trace CPER CXL Protocol Error Section
- cxl/mem: Introduce cxl_memdev_attach for CXL-dependent operation
- cxl/mem: Drop @host argument to devm_cxl_add_memdev()
- cxl/mem: Convert devm_cxl_add_memdev() to scope-based-cleanup
- cxl/port: Arrange for always synchronous endpoint attach
- cxl/mem: Arrange for always-synchronous memdev attach
- cxl/mem: Fix devm_cxl_memdev_edac_release() confusion
- Merge tag ‘mm-stable-2026-02-18-19-48’ of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
- mm: update all remaining mmap_prepare users to use vma_flags_t
- dax/hmem, e820, resource: Defer Soft Reserved insertion until hmem is ready


