From: Jhen-Jie Hong Date: Thu, 18 Sep 2025 07:06:48 +0000 (+0800) Subject: metal : avoid call free for non-owned buffer (#16067) X-Git-Tag: upstream/0.0.6527~22 X-Git-Url: https://git.djapps.eu/?a=commitdiff_plain;h=e00f3fd8fff2cf5a8c8c9f475034bd089c8bcce4;p=pkg%2Fggml%2Fsources%2Fllama.cpp metal : avoid call free for non-owned buffer (#16067) --- diff --git a/ggml/src/ggml-metal/ggml-metal-device.m b/ggml/src/ggml-metal/ggml-metal-device.m index 4974bd15..8f83c5cc 100644 --- a/ggml/src/ggml-metal/ggml-metal-device.m +++ b/ggml/src/ggml-metal/ggml-metal-device.m @@ -824,6 +824,7 @@ struct ggml_metal_buffer { // if false, the Metal buffer data is allocated in private GPU memory and is not shared with the host bool is_shared; + bool owned; // multiple buffers are used only to avoid the maximum buffer size limitation when using mmap int n_buffers; @@ -956,6 +957,7 @@ ggml_metal_buffer_t ggml_metal_buffer_init(ggml_metal_device_t dev, size_t size, if (shared) { res->all_data = ggml_metal_host_malloc(size_aligned); res->is_shared = true; + res->owned = true; } else { // dummy, non-NULL value - we'll populate this after creating the Metal buffer below 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 res->all_size = size; res->is_shared = true; + res->owned = false; res->n_buffers = 0; @@ -1107,7 +1110,7 @@ void ggml_metal_buffer_free(ggml_metal_buffer_t buf) { ggml_metal_buffer_rset_free(buf); - if (buf->is_shared) { + if (buf->is_shared && buf->owned) { #if TARGET_OS_OSX vm_deallocate((vm_map_t)mach_task_self(), (vm_address_t)buf->all_data, buf->all_size); #else