freedreno/drm: Simplify deferred submit flushing

Once we are sharing an out-fence for multiple deferred/merged submits
the complicated logic in fd_pipe_sp_flush() no longer works (or makes
sense), so just simplify all the paths into a single helper.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20263>
This commit is contained in:
Rob Clark
2022-12-14 13:18:14 -08:00
committed by Marge Bot
parent 48b5164356
commit 932ce591ac
2 changed files with 14 additions and 46 deletions
+1
View File
@@ -153,6 +153,7 @@ fd_device_del(struct fd_device *dev)
return;
assert(list_is_empty(&dev->deferred_submits));
assert(!dev->deferred_submits_fence);
if (dev->suballoc_bo)
fd_bo_del(dev->suballoc_bo);
+13 -46
View File
@@ -219,13 +219,19 @@ fd_submit_sp_flush_cleanup(void *job, void *gdata, int thread_index)
}
static void
enqueue_submit_list(struct list_head *submit_list)
flush_deferred_submits(struct fd_device *dev)
{
struct fd_submit *submit = last_submit(submit_list);
simple_mtx_assert_locked(&dev->submit_lock);
if (list_is_empty(&dev->deferred_submits))
return;
struct fd_submit *submit = last_submit(&dev->deferred_submits);
struct fd_submit_sp *fd_submit = to_fd_submit_sp(submit);
list_replace(submit_list, &fd_submit->submit_list);
list_inithead(submit_list);
list_replace(&dev->deferred_submits, &fd_submit->submit_list);
list_inithead(&dev->deferred_submits);
dev->deferred_cmds = 0;
struct util_queue_fence *fence = &fd_submit->out_fence->ready;
@@ -275,13 +281,7 @@ fd_submit_sp_flush(struct fd_submit *submit, int in_fence_fd, bool use_fence_fd)
*/
if (!list_is_empty(&dev->deferred_submits) &&
(last_submit(&dev->deferred_submits)->pipe != submit->pipe)) {
struct list_head submit_list;
list_replace(&dev->deferred_submits, &submit_list);
list_inithead(&dev->deferred_submits);
dev->deferred_cmds = 0;
enqueue_submit_list(&submit_list);
flush_deferred_submits(dev);
}
list_addtail(&fd_submit_ref(submit)->node, &dev->deferred_submits);
@@ -314,16 +314,10 @@ fd_submit_sp_flush(struct fd_submit *submit, int in_fence_fd, bool use_fence_fd)
return out_fence;
}
struct list_head submit_list;
list_replace(&dev->deferred_submits, &submit_list);
list_inithead(&dev->deferred_submits);
dev->deferred_cmds = 0;
flush_deferred_submits(dev);
simple_mtx_unlock(&dev->submit_lock);
enqueue_submit_list(&submit_list);
return out_fence;
}
@@ -331,42 +325,15 @@ void
fd_pipe_sp_flush(struct fd_pipe *pipe, uint32_t fence)
{
struct fd_device *dev = pipe->dev;
struct list_head submit_list;
DEBUG_MSG("flush: %u", fence);
list_inithead(&submit_list);
simple_mtx_lock(&dev->submit_lock);
assert(!fd_fence_after(fence, pipe->last_enqueue_fence));
foreach_submit_safe (deferred_submit, &dev->deferred_submits) {
/* We should never have submits from multiple pipes in the deferred
* list. If we did, we couldn't compare their fence to our fence,
* since each fd_pipe is an independent timeline.
*/
if (deferred_submit->pipe != pipe)
break;
if (fd_fence_after(deferred_submit->fence, fence))
break;
list_del(&deferred_submit->node);
list_addtail(&deferred_submit->node, &submit_list);
dev->deferred_cmds -= fd_ringbuffer_cmd_count(deferred_submit->primary);
}
assert(dev->deferred_cmds == fd_dev_count_deferred_cmds(dev));
flush_deferred_submits(dev);
simple_mtx_unlock(&dev->submit_lock);
if (list_is_empty(&submit_list))
goto flush_sync;
enqueue_submit_list(&submit_list);
flush_sync:
/* Once we are sure that we've enqueued at least up to the requested
* submit, we need to be sure that submitq has caught up and flushed
* them to the kernel