[PATCH 08/13] drm/qxl: switch to using drm_exec
Thomas Zimmermann
tzimmermann at suse.de
Tue Jun 20 09:13:37 UTC 2023
Hi
Am 04.05.23 um 13:51 schrieb Christian König:
> Just a straightforward conversion without any optimization.
>
> Only compile tested for now.
>
> Signed-off-by: Christian König <christian.koenig at amd.com>
> ---
> drivers/gpu/drm/qxl/Kconfig | 1 +
> drivers/gpu/drm/qxl/qxl_drv.h | 7 ++--
> drivers/gpu/drm/qxl/qxl_release.c | 67 ++++++++++++++++---------------
> 3 files changed, 39 insertions(+), 36 deletions(-)
>
> diff --git a/drivers/gpu/drm/qxl/Kconfig b/drivers/gpu/drm/qxl/Kconfig
> index ca3f51c2a8fe..9c8e433be33e 100644
> --- a/drivers/gpu/drm/qxl/Kconfig
> +++ b/drivers/gpu/drm/qxl/Kconfig
> @@ -5,6 +5,7 @@ config DRM_QXL
> select DRM_KMS_HELPER
> select DRM_TTM
> select DRM_TTM_HELPER
> + select DRM_EXEC
Just some nitpicking, but can we try to keep these select statements
sorted alphabetically?
> 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 ea993d7162e8..3e732648b332 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 {
> @@ -151,7 +152,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..da7cd9cd58f9 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,27 @@ 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);
> + drm_exec_while_not_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_break_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 +248,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 +407,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 +429,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);
> }
> -
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstrasse 146, 90461 Nuernberg, Germany
GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman
HRB 36809 (AG Nuernberg)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature
Type: application/pgp-signature
Size: 840 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20230620/cc9a66ea/attachment-0001.sig>
More information about the dri-devel
mailing list