freedreno/drm: Avoid CPU_PREP ioctl if bo is idle
authorRob Clark <robdclark@chromium.org>
Thu, 10 Feb 2022 17:31:16 +0000 (09:31 -0800)
committerMarge Bot <emma+marge@anholt.net>
Fri, 25 Mar 2022 02:03:30 +0000 (02:03 +0000)
With userspace fences, if we know definitely that the buffer is idle
(which implies that it is not shared with other processes, etc), then
skip the ioctl.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14900>

src/freedreno/drm/freedreno_bo.c

index 386e777..fe41b25 100644 (file)
@@ -503,14 +503,14 @@ fd_bo_upload(struct fd_bo *bo, void *src, unsigned len)
 int
 fd_bo_cpu_prep(struct fd_bo *bo, struct fd_pipe *pipe, uint32_t op)
 {
-   if (op & (FD_BO_PREP_NOSYNC | FD_BO_PREP_FLUSH)) {
-      simple_mtx_lock(&table_lock);
-      enum fd_bo_state state = fd_bo_state(bo);
-      simple_mtx_unlock(&table_lock);
+   simple_mtx_lock(&table_lock);
+   enum fd_bo_state state = fd_bo_state(bo);
+   simple_mtx_unlock(&table_lock);
 
-      if (state == FD_BO_STATE_IDLE)
-         return 0;
+   if (state == FD_BO_STATE_IDLE)
+      return 0;
 
+   if (op & (FD_BO_PREP_NOSYNC | FD_BO_PREP_FLUSH)) {
       if (op & FD_BO_PREP_FLUSH)
          bo_flush(bo);