Re: [PATCH 08/13] drm/qxl: switch to using drm_exec

2023-06-20 Thread Christian König

Am 20.06.23 um 11:13 schrieb Thomas Zimmermann:

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 
---
  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?


Sure and good point, going to apply that to other drivers as well.

Christian.




  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 
  #include 
+#include 
  #include 
  #include 
  #include 
  #include 
  #include 
-#include 
  #include 
    #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 *qde

Re: [PATCH 08/13] drm/qxl: switch to using drm_exec

2023-06-20 Thread Thomas Zimmermann

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 
---
  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 

  #include 
+#include 
  #include 
  #include 
  #include 
  #include 
  #include 
-#include 
  #include 
  
  #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_headlist;
  };
  
  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)