Skip to content

Commit 590250f

Browse files
spencersuttonSpencer Sutton
andauthored
metal : add checks for buffer size (#1706)
Co-authored-by: Spencer Sutton <[email protected]>
1 parent f4c55d3 commit 590250f

File tree

2 files changed

+25
-7
lines changed

2 files changed

+25
-7
lines changed

ggml-metal.m

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,11 @@ bool ggml_metal_add_buffer(
204204
ctx->buffers[ctx->n_buffers].name = name;
205205
ctx->buffers[ctx->n_buffers].data = data;
206206
ctx->buffers[ctx->n_buffers].size = size;
207+
208+
if (ctx->device.maxBufferLength < aligned_size) {
209+
fprintf(stderr, "%s: buffer '%s' size %zu is larger than buffer maximum of %zu\n", __func__, name, aligned_size, ctx->device.maxBufferLength);
210+
return false;
211+
}
207212
ctx->buffers[ctx->n_buffers].metal = [ctx->device newBufferWithBytesNoCopy:data length:aligned_size options:MTLResourceStorageModeShared deallocator:nil];
208213

209214
if (ctx->buffers[ctx->n_buffers].metal == nil) {

llama.cpp

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2405,17 +2405,30 @@ struct llama_context * llama_init_from_file(
24052405
// this allocates all Metal resources and memory buffers
24062406
ctx->ctx_metal = ggml_metal_init();
24072407

2408+
void *data_ptr = NULL;
2409+
size_t data_size = 0;
24082410
if (params.use_mmap) {
2409-
ggml_metal_add_buffer(ctx->ctx_metal, "data", ctx->model.mapping->addr, ctx->model.mapping->size);
2410-
ggml_metal_add_buffer(ctx->ctx_metal, "eval", ctx->buf_compute.addr, ctx->buf_compute.size);
2411+
data_ptr = ctx->model.mapping->addr;
2412+
data_size= ctx->model.mapping->size;
24112413
} else {
2412-
ggml_metal_add_buffer(ctx->ctx_metal, "data", ggml_get_mem_buffer(ctx->model.ctx), ggml_get_mem_size(ctx->model.ctx));
2413-
ggml_metal_add_buffer(ctx->ctx_metal, "eval", ctx->buf_compute.addr, ctx->buf_compute.size);
2414+
data_ptr = ggml_get_mem_buffer(ctx->model.ctx);
2415+
data_size= ggml_get_mem_size(ctx->model.ctx);
24142416
}
24152417

2416-
ggml_metal_add_buffer(ctx->ctx_metal, "kv", ctx->model.kv_self.buf.addr, ctx->model.kv_self.buf.size);
2417-
ggml_metal_add_buffer(ctx->ctx_metal, "scr0", ctx->buf_scratch[0].addr, ctx->buf_scratch[0].size);
2418-
ggml_metal_add_buffer(ctx->ctx_metal, "scr1", ctx->buf_scratch[1].addr, ctx->buf_scratch[1].size);
2418+
#define LLAMA_METAL_CHECK_BUF(result) \
2419+
if (!(result)) { \
2420+
fprintf(stderr, "%s: failed to add buffer\n", __func__); \
2421+
llama_free(ctx); \
2422+
return NULL; \
2423+
}
2424+
2425+
LLAMA_METAL_CHECK_BUF(ggml_metal_add_buffer(ctx->ctx_metal, "data", data_ptr, data_size));
2426+
LLAMA_METAL_CHECK_BUF(ggml_metal_add_buffer(ctx->ctx_metal, "eval", ctx->buf_compute.addr, ctx->buf_compute.size));
2427+
2428+
LLAMA_METAL_CHECK_BUF(ggml_metal_add_buffer(ctx->ctx_metal, "kv", ctx->model.kv_self.buf.addr, ctx->model.kv_self.buf.size));
2429+
LLAMA_METAL_CHECK_BUF(ggml_metal_add_buffer(ctx->ctx_metal, "scr0", ctx->buf_scratch[0].addr, ctx->buf_scratch[0].size));
2430+
LLAMA_METAL_CHECK_BUF(ggml_metal_add_buffer(ctx->ctx_metal, "scr1", ctx->buf_scratch[1].addr, ctx->buf_scratch[1].size));
2431+
#undef LLAMA_METAL_CHECK_BUF
24192432
}
24202433
#endif
24212434

0 commit comments

Comments
 (0)