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
37 lines
2.8 KiB
C
37 lines
2.8 KiB
C
#pragma once
|
|
|
|
// clang-format off
|
|
#include "virtgpu.h"
|
|
#include "ggml-remoting.h"
|
|
#include "backend/shared/apir_backend.h"
|
|
#include "backend/shared/apir_cs_ggml.h"
|
|
#include "ggml-backend-impl.h"
|
|
// clang-format on
|
|
|
|
#define REMOTE_CALL_PREPARE(gpu_dev_name, encoder_name, apir_command_type__) \
|
|
int32_t REMOTE_CALL_PREPARE_forward_flag = (int32_t) apir_command_type__; \
|
|
const char * REMOTE_CALL_PREPARE_command_name = apir_dispatch_command_name(apir_command_type__); \
|
|
do { \
|
|
encoder_name = remote_call_prepare(gpu_dev_name, APIR_COMMAND_TYPE_FORWARD, REMOTE_CALL_PREPARE_forward_flag); \
|
|
if (!encoder_name) { \
|
|
GGML_ABORT(GGML_VIRTGPU "%s: failed to prepare the remote call encoder", __func__); \
|
|
} \
|
|
} while (0)
|
|
|
|
#define REMOTE_CALL(gpu_dev_name, encoder_name, decoder_name, ret_name) \
|
|
do { \
|
|
ret_name = (ApirForwardReturnCode) remote_call(gpu_dev_name, encoder_name, &decoder_name, 0, NULL); \
|
|
if (!decoder_name) { \
|
|
GGML_ABORT(GGML_VIRTGPU "%s: failed to kick the remote call", __func__); \
|
|
} \
|
|
if (ret_name < APIR_FORWARD_BASE_INDEX) { \
|
|
GGML_ABORT(GGML_VIRTGPU "%s: failed to forward the API call: %s: code %d", __func__, \
|
|
apir_forward_error(ret_name), ret_name); \
|
|
} \
|
|
ret_name = (ApirForwardReturnCode) (ret_name - APIR_FORWARD_BASE_INDEX); \
|
|
if (ret_name != 0) { \
|
|
GGML_ABORT(GGML_VIRTGPU "backend function '%s' failed (return code: %d)", \
|
|
REMOTE_CALL_PREPARE_command_name, ret_name); \
|
|
} \
|
|
} while (0)
|