Skip to content

ggml-opencl: release sub-buffers before parent buffers on teardown - #32

Open
jpgaribotti wants to merge 1 commit into
2026-06-29-fabricfrom
adreno-driver-teardown
Open

ggml-opencl: release sub-buffers before parent buffers on teardown#32
jpgaribotti wants to merge 1 commit into
2026-06-29-fabricfrom
adreno-driver-teardown

Conversation

@jpgaribotti

@jpgaribotti jpgaribotti commented Jul 1, 2026

Copy link
Copy Markdown

The OpenCL buffer context destructor released the parent buffer cl_mem objects before deleting the tensor extras whose quant/scale sub-buffers (extra->q / extra->d) are clCreateSubBuffer aliases into those parents. The OpenCL spec defers parent deletion until all sub-buffers are released, but the Adreno/QCOM driver does not reliably honor that ref-counting: tearing down the parent first can free host-side bookkeeping that a later sub-buffer release then touches, corrupting the allocator heap (observed as a Scudo "invalid chunk state" abort in the Q4_0 path on repeated load/unload cycles).

Reorder teardown to strict leaf-to-root: images, then extras (sub-buffers), then parent buffers last, so correctness no longer depends on driver sub-buffer ref-counting.

Also restore the q4_1 extra cleanup that was dropped from the destructor while the q4_1 alloc/pool paths remained, fixing a leak of the host extras and their sub-buffers on unload.

The OpenCL buffer context destructor released the parent `buffer` cl_mem
objects before deleting the tensor extras whose quant/scale sub-buffers
(extra->q / extra->d) are clCreateSubBuffer aliases into those parents.
The OpenCL spec defers parent deletion until all sub-buffers are
released, but the Adreno/QCOM driver does not reliably honor that
ref-counting: tearing down the parent first can free host-side
bookkeeping that a later sub-buffer release then touches, corrupting the
allocator heap (observed as a Scudo "invalid chunk state" abort in the
Q4_0 path on repeated load/unload cycles).

Reorder teardown to strict leaf-to-root: images, then extras
(sub-buffers), then parent buffers last, so correctness no longer
depends on driver sub-buffer ref-counting.

Also restore the q4_1 extra cleanup that was dropped from the
destructor while the q4_1 alloc/pool paths remained, fixing a leak of
the host extras and their sub-buffers on unload.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant