Skip to content

Commit e00f3fd

Browse files
authored
metal : avoid call free for non-owned buffer (ggml-org#16067)
1 parent f2f2838 commit e00f3fd

File tree

1 file changed

+4
-1
lines changed

1 file changed

+4
-1
lines changed

ggml/src/ggml-metal/ggml-metal-device.m

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -824,6 +824,7 @@ bool ggml_metal_device_supports_op(ggml_metal_device_t dev, const struct ggml_te
824824

825825
// if false, the Metal buffer data is allocated in private GPU memory and is not shared with the host
826826
bool is_shared;
827+
bool owned;
827828

828829
// multiple buffers are used only to avoid the maximum buffer size limitation when using mmap
829830
int n_buffers;
@@ -956,6 +957,7 @@ ggml_metal_buffer_t ggml_metal_buffer_init(ggml_metal_device_t dev, size_t size,
956957
if (shared) {
957958
res->all_data = ggml_metal_host_malloc(size_aligned);
958959
res->is_shared = true;
960+
res->owned = true;
959961
} else {
960962
// dummy, non-NULL value - we'll populate this after creating the Metal buffer below
961963
res->all_data = (void *) 0x000000400ULL;
@@ -1014,6 +1016,7 @@ ggml_metal_buffer_t ggml_metal_buffer_map(ggml_metal_device_t dev, void * ptr, s
10141016
res->all_size = size;
10151017

10161018
res->is_shared = true;
1019+
res->owned = false;
10171020

10181021
res->n_buffers = 0;
10191022

@@ -1107,7 +1110,7 @@ void ggml_metal_buffer_free(ggml_metal_buffer_t buf) {
11071110

11081111
ggml_metal_buffer_rset_free(buf);
11091112

1110-
if (buf->is_shared) {
1113+
if (buf->is_shared && buf->owned) {
11111114
#if TARGET_OS_OSX
11121115
vm_deallocate((vm_map_t)mach_task_self(), (vm_address_t)buf->all_data, buf->all_size);
11131116
#else

0 commit comments

Comments
 (0)