[RFC] Synx: A global synchronization framework

Pravin Kumar Ravi <[email protected]> Wed, 5 Aug 2026 22:19:15 -0700
Newsgroups org.kernel.vger.linux-arm-msm,org.freedesktop.lists.dri-devel
Message-ID <[email protected]>
Synx: A global synchronization framework
==========================================

This RFC is intended to start a design discussion around Synx, a
SoC-wide synchronization framework used to coordinate fences between
Linux-hosted clients and non-Linux execution environments such as
remote processors and firmware.

The intent of Synx is not to replace dma-fence for existing in-kernel
GPU/display style synchronization. Rather, provide a global
synchronization mechanism spanning multiple subsystems and
processors, while still integrating with existing Linux primitives
such as dma-fence and sync_file where appropriate. The solution has
shown significant power and performance benefits in the last few
generations of Qualcomm mobile and XR chipsets, and is gathering more
use cases. Also, the solution is SoC-agnostic, so other vendors can
adopt it in the future if interested.

Motivation
----------

Many multimedia and accelerator pipelines on modern SoCs are no
longer strictly host-centric. Work may be produced, consumed, waited
on, or signaled by multiple execution environments, including Linux
drivers, userspace components, DSPs, ISPs, NPUs, video firmware,
camera firmware, or other remote processors.

dma-fence is a good fit when the fence state, callback list, and
lifetime are owned and progressed by Linux kernel participants.
However, for cross-processor use cases, a synchronization object must
satisfy properties that dma-fence does not currently provide:

- Cross-subsystem visibility: A fence created by one subsystem must
  be importable, waitable, and signalable by other subsystems,
  including non-Linux processors. struct dma_fence is local Linux
  kernel state and is not directly visible to remote processors or
  firmware.

- Point-to-point remote signaling: One subsystem should be able to
  signal another subsystem without interrupting the Linux host CPU
  every time in the signaling path. Since dma-fence maintains all
  waiters in the Linux, remote-to-remote synchronization has to
  unnecessarily interrupt or involve the Linux host.

- Distributed lifetime management: References may be held by Linux
  and non-Linux participants. Any subsystem must have authority to
  create and clean up fences. This requires lifetime state to be
  tracked in a shared/global table, rather than being owned solely by
  a local Linux object. dma-fence lifetime is centered around Linux
  references, which does not naturally model references held and
  released independently by remote processors.

- Race-free global synchronization: Registering a waiter and
  observing signal state must be atomic across participating
  subsystems to avoid missed wakeups/signals. Atomicity between
  remote waiter registration and remote signaling needs a
  protocol-level guarantee, not just local callback handling.

- Subsystem restart recovery: If a remote processor or firmware
  subsystem restarts, references held by the crashed subsystem must
  be released, and waiters that depend on that subsystem must be
  completed or failed in a well-defined way. Subsystem restart
  cleanup is outside the dma-fence model.

- Global composition: It should be possible to compose fences that
  were created by different subsystems or processors into a single
  aggregate synchronization object. dma_fence_array can compose
  Linux dma_fence objects, but it does not by itself solve the
  composition of globally visible synchronization handles created by
  different processors.

- Transport abstraction: Remote signaling should be independent of
  the underlying transport, for example rpmsg, mailbox, GLink or
  another SoC transport.

- Linux integration: Linux clients should be able to interoperate
  with dma-fence and sync_file where that is the right ABI or
  in-kernel interface.

Proposed model
---------------

Synx introduces a globally unique synchronization handle. The handle
indexes an entry in a global synchronization table that is
accessible to all participating subsystems. Each entry tracks: a
global handle ID, current fence state, the set of waiting and
subscribed cores or subsystems to allow point-to-point remote
signaling, a distributed reference count, and parent/child
relationships for composed fences.

The design is organized around four components:

- Handle and session management: Any subsystem, Linux or remote, may
  create or import a Synx handle and hold a reference counted against
  the global table. Handles are destroyed by the subsystem which
  releases the last reference, regardless of which subsystem it is.

- Transport abstraction: Remote wait and signal messages are
  delivered through a pluggable transport layer. The synchronization
  core is not tied to any specific backend (rpmsg, mailbox, GLink,
  etc.), enabling point-to-point remote signaling without involving
  the Linux host CPU when both producer and consumer are outside
  Linux.

- Linux interoperability: A Synx handle may be associated with a
  dma_fence or exported as a sync_file, allowing Linux kernel drivers
  and userspace to interact with Synx objects through existing
  interfaces.

- Fence composition: Aggregate fences are modeled as parent/child
  relationships between global handles. A composed fence can span
  handles created by different subsystems or processors, and its
  completion state is derived from the states of its children in the
  global table.

- Subsystem restart recovery: When a remote processor restarts, the
  global table is walked to drop all references held by that
  subsystem and to complete or fail any affected waiters according
  to the configured recovery policy.

Possible initial patch structure
---------------------------------

If the overall direction is acceptable, an initial RFC series could
be split as follows:

- Documentation describing the cross-subsystem synchronization
  problem and the Synx object model.
- Code to manage Synx sessions and handle lifetime, and
  synchronization using wait and signal.
- dma_fence and sync_file interoperability layer.
- Fence composition support.
- Transport abstraction for remote wait/signal messages.
- SSR/restart cleanup hooks for remote processors.
- A minimal Qualcomm SoC integration backend and example client.

At this stage, feedback on the model and layering would be more
useful than detailed code review. In particular, we would appreciate
guidance on whether this should be pursued as a Qualcomm SoC-specific
driver first, or whether the cross-processor synchronization pieces
are generic enough to justify a common framework.

Thanks,
Pravin