Linux Kernel v6.15 is Released: This is What's New for Compute Express Link (CXL)

Linux Kernel v6.15 is Released: This is What's New for Compute Express Link (CXL)

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:

CategoryCommits
New Features & Hardware6
Bug Fixes4
Performance1
Refactoring & Cleanup9
Other35

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 fwctl RPC 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/pci now 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_partition and struct cxl_range_info replace 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/region caused 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/pmem exports 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->index in the DAX subsystem is removed, completing the incremental migration away from page-struct fields that are being repurposed during the folio conversion.

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 .

Using Linux Kernel Tiering with Compute Express Link (CXL) Memory

Using Linux Kernel Tiering with Compute Express Link (CXL) Memory

In this blog post, we will walk through the process of enabling the Linux Kernel Transparent Page Placement (TPP) feature with CXL memory mapped as NUMA nodes using the system-ram namespace. This feature allows the kernel to automatically place pages in different types of memory based on their usage patterns.

Prerequisites

This guide assumes that you are using a Fedora 36 system with Kernel 5.19.13, and that your system has a Samsung CXL device installed. You can confirm the presence of the CXL device with the following command:

Read More
Graphify + MemMachine: 79× Token Reduction, Zero Vector Database

Graphify + MemMachine: 79× Token Reduction, Zero Vector Database

I help maintain MemMachine — an open-source long-term memory layer for AI agents. It’s a real codebase: 442 source files, 171 docs, a graph database, a SQL store, an MCP server, a REST API, a Python SDK, and integrations with eight different agent frameworks. When a new contributor asks “where does episodic memory actually get written?”, grep, the tool of choice for many AI coding assistants, doesn’t cut it. The answer threads through five files in three folders, plus a docker-compose service definition and a Helm chart. Each question you ask, it has to search all of these files, using the LLM to semantically understand the question and the files, then piece together an answer. This can take a lot of tokens and consume much of the context window.

Read More
Resolving commands 'Killed' on GCP f1-micro Compute Engine instances

Resolving commands 'Killed' on GCP f1-micro Compute Engine instances

When I want to perform a quick task, I generally spin up a Google GCP Compute Engine instance as they’re cheap. However, they have limited resources, particularly memory. When refreshing the package repositories, it’s quite easy to encounter an Out-of-Memory (OOM) situation which results in the command - yum or dnf - is ‘killed’. For example:

$ sudo dnf update 
CentOS Stream 8 - AppStream                                                                                                  8.3 MB/s |  18 MB     00:02    
CentOS Stream 8 - BaseOS                                                                                                      13 MB/s |  16 MB     00:01    
CentOS Stream 8 - Extras                                                                                                      69 kB/s |  16 kB     00:00    
Google Compute Engine                                                                                                         20 kB/s | 9.4 kB     00:00    
Google Cloud SDK                                                                                                              24 MB/s |  43 MB     00:01    
Killed

dmesg has a lot of information about the situation, but the key line to confirm dnf caused the OOM event, is:

Read More