ffaafde16f
* ggml-virtgpu-backend: validate the consistency of the received objects This patch adds consistency checks in the ggml-virtgpu-backend (running on the host side) to ensure that the data received from the guest is consistent (valid pointers, valid sizes and offsets). * ggml-virtgpu-backend: add fallback/skips for optional ggml backend methods ``` 1. bck->iface.synchronize(bck) 2. buft->iface.get_alloc_size(buft, op) 3. buft->iface.get_max_size(buft) ``` these three methods are optional in the GGML interface. `get_max_size` was already properly defaulted, but `backend sychronize` and `butf get_max_size` would have segfaulted the backend if not implemented. * ggml-virtgpu-backend: fix log format missing argument * ggml-virtgpu-backend: improve the abort message * ggml-virtgpu-backend: more safety checks * ggml-virtgpu-backend: new error code * ggml-virtgpu-backend: initialize all the error codes * ggml-virtgpu: add a missing comment generated by the code generator * ggml-virtgpu: add the '[virtgpu]' prefix to the device/buffer names * ggml-virtgpu: apir_device_buffer_from_ptr: improve the error message * ggml-virtgpu: shared: make it match the latest api_remoting.h of Virglrenderer APIR (still unmerged) * ggml-virtgpu: update the code generator to have dispatch_command_name in a host/guest shared file * ggml-virtgpu: REMOTE_CALL: fail if the backend returns an error * docs/backend/VirtGPU.md: indicate that the RAM+VRAM size is limed to 64 GB with libkrun * ggml-virtgpu: turn off clang-format header ordering for some of the files Compilation breaks when ordered alphabetically. * ggml-virtgpu: clang-format * ggml-virtgpu/backend/shared/api_remoting: better comments for the APIR return codes
59 lines
2.0 KiB
C++
59 lines
2.0 KiB
C++
#include "virtgpu-forward-impl.h"
|
|
|
|
static long long current_time_ms() {
|
|
timespec ts;
|
|
clock_gettime(CLOCK_REALTIME, &ts); // Use CLOCK_MONOTONIC for elapsed time
|
|
return (long long) ts.tv_sec * 1000000000LL + ts.tv_nsec;
|
|
}
|
|
|
|
ggml_status apir_backend_graph_compute(virtgpu * gpu, ggml_cgraph * cgraph) {
|
|
apir_encoder * encoder;
|
|
apir_decoder * decoder;
|
|
ApirForwardReturnCode ret;
|
|
|
|
REMOTE_CALL_PREPARE(gpu, encoder, APIR_COMMAND_TYPE_BACKEND_GRAPH_COMPUTE);
|
|
|
|
std::vector<uint8_t> cgraph_data;
|
|
size_t cgraph_size = apir_serialize_ggml_cgraph(cgraph, cgraph_data);
|
|
|
|
virtgpu_shmem temp_shmem; // Local storage for large buffers
|
|
virtgpu_shmem * shmem = &temp_shmem;
|
|
bool using_shared_shmem = false;
|
|
|
|
if (cgraph_size <= gpu->data_shmem.mmap_size) {
|
|
// Lock mutex before using shared data_shmem buffer
|
|
if (mtx_lock(&gpu->data_shmem_mutex) != thrd_success) {
|
|
GGML_ABORT(GGML_VIRTGPU "%s: Failed to lock data_shmem mutex", __func__);
|
|
}
|
|
using_shared_shmem = true;
|
|
shmem = &gpu->data_shmem;
|
|
} else if (virtgpu_shmem_create(gpu, cgraph_size, shmem)) {
|
|
GGML_ABORT(GGML_VIRTGPU "%s: Couldn't allocate the guest-host shared buffer", __func__);
|
|
}
|
|
|
|
apir_encode_virtgpu_shmem_res_id(encoder, shmem->res_id);
|
|
|
|
apir_encode_size_t(encoder, &cgraph_size);
|
|
|
|
char * shmem_data = (char *) shmem->mmap_ptr;
|
|
apir_encoder secondary_enc = apir_new_encoder(shmem_data, cgraph_size);
|
|
|
|
apir_encode_cgraph_data(&secondary_enc, cgraph_data);
|
|
|
|
REMOTE_CALL(gpu, encoder, decoder, ret);
|
|
|
|
ggml_status status = GGML_STATUS_ABORTED;
|
|
apir_decode_ggml_status(decoder, &status);
|
|
|
|
remote_call_finish(gpu, encoder, decoder);
|
|
|
|
// Unlock mutex before cleanup
|
|
if (using_shared_shmem) {
|
|
mtx_unlock(&gpu->data_shmem_mutex);
|
|
} else {
|
|
virtgpu_shmem_destroy(gpu, shmem);
|
|
}
|
|
|
|
return status;
|
|
}
|