From a5346dec8e848ca5de0e1a8d4bc03fcf988924d3 Mon Sep 17 00:00:00 2001 From: Ryan Neph Date: Tue, 24 May 2022 13:58:28 -0700 Subject: virgl: replace uint64_t queue_id with uint32_t ring_idx Update the context fencing API to match virtio-gpu's multi-ring per-context fencing support. Virtio-GPU supports 64 fencing rings per context, but uint32_t is used to maintain compatability with other potential users that require more. Signed-off-by: Ryan Neph Part-of: --- server/render_virgl.c | 3 +-- src/drm/msm/msm_renderer.c | 18 +++++++++--------- src/proxy/proxy_context.c | 4 +--- src/venus/vkr_context.c | 10 +++++----- src/virgl_context.h | 4 ++-- src/virglrenderer.c | 8 ++++---- src/virglrenderer.h | 4 ++-- src/vrend_decode.c | 4 ++-- tests/fuzzer/virgl_drm_fuzzer.c | 2 +- vtest/vtest_renderer.c | 2 +- 10 files changed, 28 insertions(+), 31 deletions(-) diff --git a/server/render_virgl.c b/server/render_virgl.c index 6cc82ac7..fb6b5b7a 100644 --- a/server/render_virgl.c +++ b/server/render_virgl.c @@ -70,13 +70,12 @@ render_virgl_debug_callback(const char *fmt, va_list ap) static void render_virgl_cb_write_context_fence(UNUSED void *cookie, uint32_t ctx_id, - uint64_t queue_id, + uint32_t ring_idx, uint64_t fence_id) { struct render_context *ctx = render_virgl_lookup_context(ctx_id); assert(ctx); - const uint32_t ring_idx = queue_id; const uint32_t seqno = (uint32_t)fence_id; render_context_update_timeline(ctx, ring_idx, seqno); } diff --git a/src/drm/msm/msm_renderer.c b/src/drm/msm/msm_renderer.c index e957f6d4..a032ad39 100644 --- a/src/drm/msm/msm_renderer.c +++ b/src/drm/msm/msm_renderer.c @@ -1217,17 +1217,17 @@ msm_renderer_retire_fences(UNUSED struct virgl_context *vctx) } static int -msm_renderer_submit_fence(struct virgl_context *vctx, uint32_t flags, uint64_t queue_id, +msm_renderer_submit_fence(struct virgl_context *vctx, uint32_t flags, uint32_t ring_idx, uint64_t fence_id) { struct msm_context *mctx = to_msm_context(vctx); - drm_dbg("flags=0x%x, queue_id=%" PRIu64 ", fence_id=%" PRIu64, flags, - queue_id, fence_id); + drm_dbg("flags=0x%x, ring_idx=%" PRIu32 ", fence_id=%" PRIu64, flags, + ring_idx, fence_id); - /* timeline is queue_id-1 (because queue_id 0 is host CPU timeline) */ - if (queue_id > nr_timelines) { - drm_log("invalid queue_id: %" PRIu64, queue_id); + /* timeline is ring_idx-1 (because ring_idx 0 is host CPU timeline) */ + if (ring_idx > nr_timelines) { + drm_log("invalid ring_idx: %" PRIu32, ring_idx); return -EINVAL; } @@ -1235,12 +1235,12 @@ msm_renderer_submit_fence(struct virgl_context *vctx, uint32_t flags, uint64_t q * meaning by the time ->submit_fence() is called, the fence has * already passed.. so just immediate signal: */ - if (queue_id == 0) { - vctx->fence_retire(vctx, queue_id, fence_id); + if (ring_idx == 0) { + vctx->fence_retire(vctx, ring_idx, fence_id); return 0; } - return drm_timeline_submit_fence(&mctx->timelines[queue_id - 1], flags, fence_id); + return drm_timeline_submit_fence(&mctx->timelines[ring_idx - 1], flags, fence_id); } struct virgl_context * diff --git a/src/proxy/proxy_context.c b/src/proxy/proxy_context.c index 988c13bf..f258a6fa 100644 --- a/src/proxy/proxy_context.c +++ b/src/proxy/proxy_context.c @@ -196,14 +196,12 @@ proxy_context_sync_thread(void *arg) static int proxy_context_submit_fence(struct virgl_context *base, uint32_t flags, - uint64_t queue_id, + uint32_t ring_idx, uint64_t fence_id) { struct proxy_context *ctx = (struct proxy_context *)base; const uint64_t old_busy_mask = ctx->timeline_busy_mask; - /* TODO fix virglrenderer to match virtio-gpu spec which uses ring_idx */ - const uint32_t ring_idx = queue_id; if (ring_idx >= PROXY_CONTEXT_TIMELINE_COUNT) return -EINVAL; diff --git a/src/venus/vkr_context.c b/src/venus/vkr_context.c index 9ecb9cdf..893c42b5 100644 --- a/src/venus/vkr_context.c +++ b/src/venus/vkr_context.c @@ -123,7 +123,7 @@ vkr_context_init_dispatch(struct vkr_context *ctx) static int vkr_context_submit_fence_locked(struct virgl_context *base, uint32_t flags, - uint64_t queue_id, + uint32_t ring_idx, uint64_t fence_id) { struct vkr_context *ctx = (struct vkr_context *)base; @@ -131,14 +131,14 @@ vkr_context_submit_fence_locked(struct virgl_context *base, struct vkr_queue *queue; VkResult result; - queue = vkr_context_get_object(ctx, queue_id); + queue = vkr_context_get_object(ctx, ring_idx); if (!queue) return -EINVAL; struct vkr_device *dev = queue->device; vk = &dev->proc_table; struct vkr_queue_sync *sync = - vkr_device_alloc_queue_sync(dev, flags, queue_id, fence_id); + vkr_device_alloc_queue_sync(dev, flags, ring_idx, fence_id); if (!sync) return -ENOMEM; @@ -168,14 +168,14 @@ vkr_context_submit_fence_locked(struct virgl_context *base, static int vkr_context_submit_fence(struct virgl_context *base, uint32_t flags, - uint64_t queue_id, + uint32_t ring_idx, uint64_t fence_id) { struct vkr_context *ctx = (struct vkr_context *)base; int ret; mtx_lock(&ctx->mutex); - ret = vkr_context_submit_fence_locked(base, flags, queue_id, fence_id); + ret = vkr_context_submit_fence_locked(base, flags, ring_idx, fence_id); mtx_unlock(&ctx->mutex); return ret; } diff --git a/src/virgl_context.h b/src/virgl_context.h index 4bf13704..046948d8 100644 --- a/src/virgl_context.h +++ b/src/virgl_context.h @@ -52,7 +52,7 @@ struct virgl_context_blob { struct virgl_context; typedef void (*virgl_context_fence_retire)(struct virgl_context *ctx, - uint64_t queue_id, + uint32_t ring_idx, uint64_t fence_id); /** @@ -120,7 +120,7 @@ struct virgl_context { /* submit a fence to the queue identified by queue_id */ int (*submit_fence)(struct virgl_context *ctx, uint32_t flags, - uint64_t queue_id, + uint32_t ring_idx, uint64_t fence_id); }; diff --git a/src/virglrenderer.c b/src/virglrenderer.c index 23716892..761b734f 100644 --- a/src/virglrenderer.c +++ b/src/virglrenderer.c @@ -185,12 +185,12 @@ void virgl_renderer_fill_caps(uint32_t set, uint32_t version, } static void per_context_fence_retire(struct virgl_context *ctx, - uint64_t queue_id, + uint32_t ring_idx, uint64_t fence_id) { state.cbs->write_context_fence(state.cookie, ctx->ctx_id, - queue_id, + ring_idx, fence_id); } @@ -405,7 +405,7 @@ int virgl_renderer_create_fence(int client_fence_id, UNUSED uint32_t ctx_id) int virgl_renderer_context_create_fence(uint32_t ctx_id, uint32_t flags, - uint64_t queue_id, + uint32_t ring_idx, uint64_t fence_id) { TRACE_FUNC(); @@ -414,7 +414,7 @@ int virgl_renderer_context_create_fence(uint32_t ctx_id, return -EINVAL; assert(state.cbs->version >= 3 && state.cbs->write_context_fence); - return ctx->submit_fence(ctx, flags, queue_id, fence_id); + return ctx->submit_fence(ctx, flags, ring_idx, fence_id); } void virgl_renderer_context_poll(uint32_t ctx_id) diff --git a/src/virglrenderer.h b/src/virglrenderer.h index 61f7f1d4..40991d19 100644 --- a/src/virglrenderer.h +++ b/src/virglrenderer.h @@ -78,7 +78,7 @@ struct virgl_renderer_callbacks { int (*get_drm_fd)(void *cookie); #ifdef VIRGL_RENDERER_UNSTABLE_APIS - void (*write_context_fence)(void *cookie, uint32_t ctx_id, uint64_t queue_id, uint64_t fence_id); + void (*write_context_fence)(void *cookie, uint32_t ctx_id, uint32_t ring_idx, uint64_t fence_id); /* version 0: a connected socket of type SOCK_SEQPACKET */ int (*get_server_fd)(void *cookie, uint32_t version); @@ -386,7 +386,7 @@ virgl_renderer_export_fence(uint32_t client_fence_id, int *fd); #define VIRGL_RENDERER_FENCE_FLAG_MERGEABLE (1 << 0) VIRGL_EXPORT int virgl_renderer_context_create_fence(uint32_t ctx_id, uint32_t flags, - uint64_t queue_id, + uint32_t ring_idx, uint64_t fence_id); VIRGL_EXPORT void virgl_renderer_context_poll(uint32_t ctx_id); /* force fences */ VIRGL_EXPORT int virgl_renderer_context_get_poll_fd(uint32_t ctx_id); diff --git a/src/vrend_decode.c b/src/vrend_decode.c index e480545e..8bf6de73 100644 --- a/src/vrend_decode.c +++ b/src/vrend_decode.c @@ -1966,12 +1966,12 @@ static void vrend_decode_ctx_retire_fences(UNUSED struct virgl_context *ctx) static int vrend_decode_ctx_submit_fence(struct virgl_context *ctx, uint32_t flags, - uint64_t queue_id, + uint32_t ring_idx, uint64_t fence_id) { struct vrend_decode_ctx *dctx = (struct vrend_decode_ctx *)ctx; - if (queue_id) + if (ring_idx) return -EINVAL; return vrend_renderer_create_fence(dctx->grctx, flags, fence_id); diff --git a/tests/fuzzer/virgl_drm_fuzzer.c b/tests/fuzzer/virgl_drm_fuzzer.c index 56270942..2a38a4af 100644 --- a/tests/fuzzer/virgl_drm_fuzzer.c +++ b/tests/fuzzer/virgl_drm_fuzzer.c @@ -34,7 +34,7 @@ fuzz_debug_callback(UNUSED const char *fmt, UNUSED va_list ap) static void fuzz_write_context_fence(UNUSED void *cookie, UNUSED uint32_t ctx_id, - UNUSED uint64_t queue_id, + UNUSED uint32_t ring_idx, UNUSED uint64_t fence_id) { diff --git a/vtest/vtest_renderer.c b/vtest/vtest_renderer.c index f852cdf9..1e8b81ef 100644 --- a/vtest/vtest_renderer.c +++ b/vtest/vtest_renderer.c @@ -170,7 +170,7 @@ static void vtest_signal_sync_queue(struct vtest_sync_queue *queue, static void vtest_write_context_fence(UNUSED void *cookie, UNUSED uint32_t ctx_id, - UNUSED uint64_t queue_id, + UNUSED uint32_t ring_idx, uint64_t fence_id) { struct vtest_sync_queue_submit *submit = (void*)(uintptr_t)fence_id; -- cgit v1.2.3