
Linux Kernel v6.15 is Released: This is What's New for Compute Express Link (CXL)
- Steve Scargall
- Cxl
- May 25, 2025
The Linux Kernel v6.15 release brings several improvements and additions related to Compute Express Link (CXL) technology.
Release Highlights
Linux Kernel v6.15 includes 55 commits to the CXL and DAX subsystems:
| Category | Commits |
|---|---|
| New Features & Hardware | 6 |
| Bug Fixes | 4 |
| Performance | 1 |
| Refactoring & Cleanup | 9 |
| Other | 35 |
The Linux v6.15 kernel marks a meaningful expansion of CXL’s userspace interface story. The headline addition is FWCTL support: CXL devices can now expose get-feature and set-feature mailbox commands to userspace through the fwctl subsystem, giving operators and tooling a standardized RPC path to query and configure device-specific feature registers without requiring bespoke kernel drivers for each capability. This is the groundwork that enables feature negotiation at the management layer — expect CXL tooling to start consuming these interfaces quickly.
On the reliability and platform integration side, v6.15 lands proper support for Global Persistent Flush (GPF), the CXL protocol mechanism that coordinates flush of dirty data across a fabric prior to power loss. The implementation introduces cxl_gpf_get_dvsec() to locate the GPF DVSEC capability block, and correctly gates port GPF timeout updates to only fire on first endpoint attachment — fixing a latent ordering issue caught during multi-device bringup. Separately, the first aliased address miscalculation in region setup is corrected, a bug that could produce incorrect DPA mappings in interleaved configurations.
The release also continues a sustained internal cleanup arc. The CXL_DECODER_MIXED decoder type — an acknowledged design mistake — is removed entirely. DPA partition accounting is restructured around two new types, cxl_dpa_partition and cxl_range_info, replacing ad-hoc fields with a coherent data model. The ioctl dispatch path is refactored from the MDS-specific path back to the generic mailbox layer, and several functions drop open-coded goto-based locking patterns in favor of the guard() macro, reducing the surface area for lock-imbalance bugs. The dax subsystem drops its last direct page->index access, continuing the ongoing page-folio migration.
Key Changes
FWCTL CXL Feature Command Interface: A new
fwctlRPC framework exposes CXL get-feature and set-feature mailbox commands to userspace, enabling structured, privilege-controlled access to device feature registers without custom kernel code per device.Global Persistent Flush (GPF) Support:
cxl/pcinow discovers and programs GPF capability via the DVSEC, coordinating fabric-wide dirty data flush on impending power loss. A fix ensures port GPF timeout is only updated on first endpoint attachment, preventing races during multi-device enumeration.DPA Partition Data Model Refactor:
struct cxl_dpa_partitionandstruct cxl_range_inforeplace scattered partition fields, giving the DPA allocator a cleaner type boundary and removing the stale unused values that were leaking into memdev logic.Region Aliased Address Fix: An off-by-one in
cxl/regioncaused the first aliased DPA address to be computed incorrectly in interleaved region setups, potentially producing wrong physical mappings. This is now corrected.Dirty Shutdown Count via Sysfs:
cxl/pmemexports the persistent dirty shutdown counter through sysfs, giving operators a direct path to inspect how many unclean shutdown events a persistent memory device has recorded — useful for wear tracking and RAS workflows.CXL_DECODER_MIXED Removal: The mixed-type decoder variant, previously acknowledged as a design error in the decoder type enumeration, is fully excised. Code that depended on it is redirected to the correct typed decoders, tightening the state machine.
Ioctl Path Consolidation: The userspace ioctl dispatch is refactored away from the MDS-specific handler back to the shared mailbox path, reducing duplicated dispatch logic and making it easier to route new feature commands through a single entry point.
DAX page->index Access Removal: The final direct access to
page->indexin the DAX subsystem is removed, completing the incremental migration away from page-struct fields that are being repurposed during the folio conversion.
CXL related changes from Kernel v6.14 to v6.15
Here is the detailed list of all commits merged into the 6.15 Kernel for CXL and DAX. This list was generated by the Linux Kernel CXL Feature Tracker .
- cxl/core/regs.c: Skip Memory Space Enable check for RCD and RCH Ports
- cxl/feature: Update out_len in set feature failure case
- cxl: Fix devm host device for CXL fwctl initialization
- cxl/pci: Drop the parameter is_port of cxl_gpf_get_dvsec()
- cxl/pci: Update Port GPF timeout only when the first EP attaching
- cxl/core: Fix caching dport GPF DVSEC issue
- Merge tag ‘cxl-for-6.15’ of git://git.kernel.org/pub/scm/linux/kernel/git/cxl/cxl
- Merge tag ‘driver-core-6.15-rc1’ of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core
- cxl/region: Fix the first aliased address miscalculation
- cxl: Add support to handle user feature commands for set feature
- cxl: Add support to handle user feature commands for get feature
- cxl: Add support for fwctl RPC command to enable CXL feature commands
- cxl: Add FWCTL support to CXL
- Merge branch ‘for-6.15/features’ into cxl-for-next
- cxl/region: Quiet some dev_warn()s in extended linear cache setup
- cxl: Fix warning from emitting resource_size_t as long long int on 32bit systems
- cxl/mem: Do not return error if CONFIG_CXL_MCE unset
- Merge branch ‘for-6.15/extended-linear-cache’ into cxl-for-next2
- Merge branch ‘for-6.15/dirty-shutdown’ into cxl-for-next2
- Merge branch ‘for-6.15/guard_cleanups’ into cxl-for-next2
- cxl/pmem: Export dirty shutdown count via sysfs
- cxl/pmem: Rename cxl_dirty_shutdown_state()
- cxl/pci: Introduce cxl_gpf_get_dvsec()
- cxl/pci: Support Global Persistent Flush (GPF)
- cxl/pmem: debug invalid serial number data
- cxl/cdat: Remove redundant gp_port initialization
- cxl/memdev: Remove unused partition values
- cxl/region: Drop goto pattern of construct_region()
- cxl/region: Drop goto pattern in cxl_dax_region_alloc()
- cxl/core: Use guard() to drop goto pattern of cxl_dpa_alloc()
- cxl/core: Use guard() to drop the goto pattern of cxl_dpa_free()
- cxl/memdev: cxl_memdev_ioctl() cleanup
- cxl/core: cxl_mem_sanitize() cleanup
- cxl/core: Use guard() to replace open-coded down_read/write()
- Merge branch ‘for-6.15/fw-first-error-logging’ into cxl-for-next2
- cxl/pci: Add trace logging for CXL PCIe Port RAS errors
- acpi/ghes, cxl/pci: Process CXL CPER Protocol Errors
- cxl: Add mce notifier to emit aliased address for extended linear cache
- cxl: Add extended linear cache address alias emission for cxl events
- acpi/hmat / cxl: Add extended linear cache support for CXL
- cxl: Setup exclusive CXL features that are reserved for the kernel
- cxl/mbox: Add SET_FEATURE mailbox command
- cxl/mbox: Add GET_FEATURE mailbox command
- cxl: Add Get Supported Features command for kernel usage
- cxl: Enumerate feature commands
- cxl: Refactor user ioctl command path from mds to mailbox
- cxl/port: Constify ‘struct bin_attribute’
- cxl: Cleanup partition size and perf helpers
- cxl: Kill enum cxl_decoder_mode
- cxl: Make cxl_dpa_alloc() DPA partition number agnostic
- cxl: Introduce ‘struct cxl_dpa_partition’ and ‘struct cxl_range_info’
- cxl: Introduce to_{ram,pmem}_{res,perf}() helpers
- cxl: Remove the CXL_DECODER_MIXED mistake
- device/dax: properly refcount device dax pages when mapping
- dax: remove access to page->index


