[PATCH 2/7] drm/qxl: switch to using drm_exec v2

Alex Deucher alexdeucher at gmail.com
Thu Nov 14 20:53:30 UTC 2024


On Thu, Nov 14, 2024 at 10:44 AM Christian König
<ckoenig.leichtzumerken at gmail.com> wrote:
>
> Just a straightforward conversion without any optimization.
>
> Only compile tested for now.
>
> v2: rebase
>
> Signed-off-by: Christian König <christian.koenig at amd.com>

Acked-by: Alex Deucher <alexander.deucher at amd.com>

> ---
>  drivers/gpu/drm/qxl/Kconfig       |  1 +
>  drivers/gpu/drm/qxl/qxl_drv.h     |  7 ++--
>  drivers/gpu/drm/qxl/qxl_release.c | 68 ++++++++++++++++---------------
>  3 files changed, 40 insertions(+), 36 deletions(-)
>
> diff --git a/drivers/gpu/drm/qxl/Kconfig b/drivers/gpu/drm/qxl/Kconfig
> index 1992df4a82d2..ebf452aa1e80 100644
> --- a/drivers/gpu/drm/qxl/Kconfig
> +++ b/drivers/gpu/drm/qxl/Kconfig
> @@ -6,6 +6,7 @@ config DRM_QXL
>         select DRM_KMS_HELPER
>         select DRM_TTM
>         select DRM_TTM_HELPER
> +       select DRM_EXEC
>         select CRC32
>         help
>           QXL virtual GPU for Spice virtualization desktop integration.
> diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h
> index 32069acd93f8..b5fc14c9525d 100644
> --- a/drivers/gpu/drm/qxl/qxl_drv.h
> +++ b/drivers/gpu/drm/qxl/qxl_drv.h
> @@ -38,12 +38,12 @@
>
>  #include <drm/drm_crtc.h>
>  #include <drm/drm_encoder.h>
> +#include <drm/drm_exec.h>
>  #include <drm/drm_gem_ttm_helper.h>
>  #include <drm/drm_ioctl.h>
>  #include <drm/drm_gem.h>
>  #include <drm/qxl_drm.h>
>  #include <drm/ttm/ttm_bo.h>
> -#include <drm/ttm/ttm_execbuf_util.h>
>  #include <drm/ttm/ttm_placement.h>
>
>  #include "qxl_dev.h"
> @@ -101,7 +101,8 @@ struct qxl_gem {
>  };
>
>  struct qxl_bo_list {
> -       struct ttm_validate_buffer tv;
> +       struct qxl_bo           *bo;
> +       struct list_head        list;
>  };
>
>  struct qxl_crtc {
> @@ -150,7 +151,7 @@ struct qxl_release {
>         struct qxl_bo *release_bo;
>         uint32_t release_offset;
>         uint32_t surface_release_id;
> -       struct ww_acquire_ctx ticket;
> +       struct drm_exec exec;
>         struct list_head bos;
>  };
>
> diff --git a/drivers/gpu/drm/qxl/qxl_release.c b/drivers/gpu/drm/qxl/qxl_release.c
> index 368d26da0d6a..05204a6a3fa8 100644
> --- a/drivers/gpu/drm/qxl/qxl_release.c
> +++ b/drivers/gpu/drm/qxl/qxl_release.c
> @@ -121,13 +121,11 @@ qxl_release_free_list(struct qxl_release *release)
>  {
>         while (!list_empty(&release->bos)) {
>                 struct qxl_bo_list *entry;
> -               struct qxl_bo *bo;
>
>                 entry = container_of(release->bos.next,
> -                                    struct qxl_bo_list, tv.head);
> -               bo = to_qxl_bo(entry->tv.bo);
> -               qxl_bo_unref(&bo);
> -               list_del(&entry->tv.head);
> +                                    struct qxl_bo_list, list);
> +               qxl_bo_unref(&entry->bo);
> +               list_del(&entry->list);
>                 kfree(entry);
>         }
>         release->release_bo = NULL;
> @@ -172,8 +170,8 @@ int qxl_release_list_add(struct qxl_release *release, struct qxl_bo *bo)
>  {
>         struct qxl_bo_list *entry;
>
> -       list_for_each_entry(entry, &release->bos, tv.head) {
> -               if (entry->tv.bo == &bo->tbo)
> +       list_for_each_entry(entry, &release->bos, list) {
> +               if (entry->bo == bo)
>                         return 0;
>         }
>
> @@ -182,9 +180,8 @@ int qxl_release_list_add(struct qxl_release *release, struct qxl_bo *bo)
>                 return -ENOMEM;
>
>         qxl_bo_ref(bo);
> -       entry->tv.bo = &bo->tbo;
> -       entry->tv.num_shared = 0;
> -       list_add_tail(&entry->tv.head, &release->bos);
> +       entry->bo = bo;
> +       list_add_tail(&entry->list, &release->bos);
>         return 0;
>  }
>
> @@ -221,21 +218,28 @@ int qxl_release_reserve_list(struct qxl_release *release, bool no_intr)
>         if (list_is_singular(&release->bos))
>                 return 0;
>
> -       ret = ttm_eu_reserve_buffers(&release->ticket, &release->bos,
> -                                    !no_intr, NULL);
> -       if (ret)
> -               return ret;
> -
> -       list_for_each_entry(entry, &release->bos, tv.head) {
> -               struct qxl_bo *bo = to_qxl_bo(entry->tv.bo);
> -
> -               ret = qxl_release_validate_bo(bo);
> -               if (ret) {
> -                       ttm_eu_backoff_reservation(&release->ticket, &release->bos);
> -                       return ret;
> +       drm_exec_init(&release->exec, no_intr ? 0 :
> +                     DRM_EXEC_INTERRUPTIBLE_WAIT, 0);
> +       drm_exec_until_all_locked(&release->exec) {
> +               list_for_each_entry(entry, &release->bos, list) {
> +                       ret = drm_exec_prepare_obj(&release->exec,
> +                                                  &entry->bo->tbo.base,
> +                                                  1);
> +                       drm_exec_retry_on_contention(&release->exec);
> +                       if (ret)
> +                               goto error;
>                 }
>         }
> +
> +       list_for_each_entry(entry, &release->bos, list) {
> +               ret = qxl_release_validate_bo(entry->bo);
> +               if (ret)
> +                       goto error;
> +       }
>         return 0;
> +error:
> +       drm_exec_fini(&release->exec);
> +       return ret;
>  }
>
>  void qxl_release_backoff_reserve_list(struct qxl_release *release)
> @@ -245,7 +249,7 @@ void qxl_release_backoff_reserve_list(struct qxl_release *release)
>         if (list_is_singular(&release->bos))
>                 return;
>
> -       ttm_eu_backoff_reservation(&release->ticket, &release->bos);
> +       drm_exec_fini(&release->exec);
>  }
>
>  int qxl_alloc_surface_release_reserved(struct qxl_device *qdev,
> @@ -404,18 +408,18 @@ void qxl_release_unmap(struct qxl_device *qdev,
>
>  void qxl_release_fence_buffer_objects(struct qxl_release *release)
>  {
> -       struct ttm_buffer_object *bo;
>         struct ttm_device *bdev;
> -       struct ttm_validate_buffer *entry;
> +       struct qxl_bo_list *entry;
>         struct qxl_device *qdev;
> +       struct qxl_bo *bo;
>
>         /* if only one object on the release its the release itself
>            since these objects are pinned no need to reserve */
>         if (list_is_singular(&release->bos) || list_empty(&release->bos))
>                 return;
>
> -       bo = list_first_entry(&release->bos, struct ttm_validate_buffer, head)->bo;
> -       bdev = bo->bdev;
> +       bo = list_first_entry(&release->bos, struct qxl_bo_list, list)->bo;
> +       bdev = bo->tbo.bdev;
>         qdev = container_of(bdev, struct qxl_device, mman.bdev);
>
>         /*
> @@ -426,14 +430,12 @@ void qxl_release_fence_buffer_objects(struct qxl_release *release)
>                        release->id | 0xf0000000, release->base.seqno);
>         trace_dma_fence_emit(&release->base);
>
> -       list_for_each_entry(entry, &release->bos, head) {
> +       list_for_each_entry(entry, &release->bos, list) {
>                 bo = entry->bo;
>
> -               dma_resv_add_fence(bo->base.resv, &release->base,
> +               dma_resv_add_fence(bo->tbo.base.resv, &release->base,
>                                    DMA_RESV_USAGE_READ);
> -               ttm_bo_move_to_lru_tail_unlocked(bo);
> -               dma_resv_unlock(bo->base.resv);
> +               ttm_bo_move_to_lru_tail_unlocked(&bo->tbo);
>         }
> -       ww_acquire_fini(&release->ticket);
> +       drm_exec_fini(&release->exec);
>  }
> -
> --
> 2.34.1
>


More information about the amd-gfx mailing list