* Switching more drivers to use drm_exec
@ 2023-07-12 12:46 Christian König
2023-07-12 12:46 ` [PATCH 1/7] drm/radeon: switch over to drm_exec Christian König
` (6 more replies)
0 siblings, 7 replies; 10+ messages in thread
From: Christian König @ 2023-07-12 12:46 UTC (permalink / raw)
To: dri-devel
Hi guys,
with the exception of VMWGFX this moves over all the drivers to using the new drm_exec object.
Please review and/or comment,
Christian.
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/7] drm/radeon: switch over to drm_exec
2023-07-12 12:46 Switching more drivers to use drm_exec Christian König
@ 2023-07-12 12:46 ` Christian König
2023-07-12 12:46 ` [PATCH 2/7] drm/qxl: switch to using drm_exec Christian König
` (5 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Christian König @ 2023-07-12 12:46 UTC (permalink / raw)
To: dri-devel; +Cc: Christian König, amd-gfx
Just a straightforward conversion without any optimization.
Signed-off-by: Christian König <christian.koenig@amd.com>
Cc: amd-gfx@lists.freedesktop.org
---
drivers/gpu/drm/radeon/Kconfig | 1 +
drivers/gpu/drm/radeon/radeon.h | 7 ++--
drivers/gpu/drm/radeon/radeon_cs.c | 45 +++++++++++++-------------
drivers/gpu/drm/radeon/radeon_gem.c | 39 ++++++++++++----------
drivers/gpu/drm/radeon/radeon_object.c | 25 +++++++-------
drivers/gpu/drm/radeon/radeon_object.h | 2 +-
drivers/gpu/drm/radeon/radeon_vm.c | 10 +++---
7 files changed, 66 insertions(+), 63 deletions(-)
diff --git a/drivers/gpu/drm/radeon/Kconfig b/drivers/gpu/drm/radeon/Kconfig
index fe498c8af1bb..fdfede471a6d 100644
--- a/drivers/gpu/drm/radeon/Kconfig
+++ b/drivers/gpu/drm/radeon/Kconfig
@@ -12,6 +12,7 @@ config DRM_RADEON
select DRM_TTM
select DRM_TTM_HELPER
select FB_IO_HELPERS if DRM_FBDEV_EMULATION
+ select DRM_EXEC
select SND_HDA_COMPONENT if SND_HDA_CORE
select POWER_SUPPLY
select HWMON
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 8afb03bbce29..37a932a5195f 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -75,8 +75,8 @@
#include <drm/ttm/ttm_bo.h>
#include <drm/ttm/ttm_placement.h>
-#include <drm/ttm/ttm_execbuf_util.h>
+#include <drm/drm_exec.h>
#include <drm/drm_gem.h>
#include <drm/drm_audio_component.h>
#include <drm/drm_suballoc.h>
@@ -458,7 +458,8 @@ struct radeon_mman {
struct radeon_bo_list {
struct radeon_bo *robj;
- struct ttm_validate_buffer tv;
+ struct list_head list;
+ bool shared;
uint64_t gpu_offset;
unsigned preferred_domains;
unsigned allowed_domains;
@@ -1031,6 +1032,7 @@ struct radeon_cs_parser {
struct radeon_bo_list *vm_bos;
struct list_head validated;
unsigned dma_reloc_idx;
+ struct drm_exec exec;
/* indices of various chunks */
struct radeon_cs_chunk *chunk_ib;
struct radeon_cs_chunk *chunk_relocs;
@@ -1044,7 +1046,6 @@ struct radeon_cs_parser {
u32 cs_flags;
u32 ring;
s32 priority;
- struct ww_acquire_ctx ticket;
};
static inline u32 radeon_get_ib_value(struct radeon_cs_parser *p, int idx)
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
index a6700d7278bf..ea0a1ed56bd8 100644
--- a/drivers/gpu/drm/radeon/radeon_cs.c
+++ b/drivers/gpu/drm/radeon/radeon_cs.c
@@ -182,11 +182,8 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
}
}
- p->relocs[i].tv.bo = &p->relocs[i].robj->tbo;
- p->relocs[i].tv.num_shared = !r->write_domain;
-
- radeon_cs_buckets_add(&buckets, &p->relocs[i].tv.head,
- priority);
+ p->relocs[i].shared = !r->write_domain;
+ radeon_cs_buckets_add(&buckets, &p->relocs[i].list, priority);
}
radeon_cs_buckets_get_list(&buckets, &p->validated);
@@ -197,7 +194,7 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
if (need_mmap_lock)
mmap_read_lock(current->mm);
- r = radeon_bo_list_validate(p->rdev, &p->ticket, &p->validated, p->ring);
+ r = radeon_bo_list_validate(p->rdev, &p->exec, &p->validated, p->ring);
if (need_mmap_lock)
mmap_read_unlock(current->mm);
@@ -253,12 +250,11 @@ static int radeon_cs_sync_rings(struct radeon_cs_parser *p)
struct radeon_bo_list *reloc;
int r;
- list_for_each_entry(reloc, &p->validated, tv.head) {
+ list_for_each_entry(reloc, &p->validated, list) {
struct dma_resv *resv;
resv = reloc->robj->tbo.base.resv;
- r = radeon_sync_resv(p->rdev, &p->ib.sync, resv,
- reloc->tv.num_shared);
+ r = radeon_sync_resv(p->rdev, &p->ib.sync, resv, reloc->shared);
if (r)
return r;
}
@@ -276,6 +272,7 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
s32 priority = 0;
INIT_LIST_HEAD(&p->validated);
+ drm_exec_init(&p->exec, DRM_EXEC_INTERRUPTIBLE_WAIT);
if (!cs->num_chunks) {
return 0;
@@ -397,8 +394,8 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
static int cmp_size_smaller_first(void *priv, const struct list_head *a,
const struct list_head *b)
{
- struct radeon_bo_list *la = list_entry(a, struct radeon_bo_list, tv.head);
- struct radeon_bo_list *lb = list_entry(b, struct radeon_bo_list, tv.head);
+ struct radeon_bo_list *la = list_entry(a, struct radeon_bo_list, list);
+ struct radeon_bo_list *lb = list_entry(b, struct radeon_bo_list, list);
/* Sort A before B if A is smaller. */
if (la->robj->tbo.base.size > lb->robj->tbo.base.size)
@@ -417,11 +414,13 @@ static int cmp_size_smaller_first(void *priv, const struct list_head *a,
* If error is set than unvalidate buffer, otherwise just free memory
* used by parsing context.
**/
-static void radeon_cs_parser_fini(struct radeon_cs_parser *parser, int error, bool backoff)
+static void radeon_cs_parser_fini(struct radeon_cs_parser *parser, int error)
{
unsigned i;
if (!error) {
+ struct radeon_bo_list *reloc;
+
/* Sort the buffer list from the smallest to largest buffer,
* which affects the order of buffers in the LRU list.
* This assures that the smallest buffers are added first
@@ -433,15 +432,17 @@ static void radeon_cs_parser_fini(struct radeon_cs_parser *parser, int error, bo
* per frame under memory pressure.
*/
list_sort(NULL, &parser->validated, cmp_size_smaller_first);
-
- ttm_eu_fence_buffer_objects(&parser->ticket,
- &parser->validated,
- &parser->ib.fence->base);
- } else if (backoff) {
- ttm_eu_backoff_reservation(&parser->ticket,
- &parser->validated);
+ list_for_each_entry(reloc, &parser->validated, list) {
+ dma_resv_add_fence(reloc->robj->tbo.base.resv,
+ &parser->ib.fence->base,
+ reloc->shared ?
+ DMA_RESV_USAGE_READ :
+ DMA_RESV_USAGE_WRITE);
+ }
}
+ drm_exec_fini(&parser->exec);
+
if (parser->relocs != NULL) {
for (i = 0; i < parser->nrelocs; i++) {
struct radeon_bo *bo = parser->relocs[i].robj;
@@ -693,7 +694,7 @@ int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
r = radeon_cs_parser_init(&parser, data);
if (r) {
DRM_ERROR("Failed to initialize parser !\n");
- radeon_cs_parser_fini(&parser, r, false);
+ radeon_cs_parser_fini(&parser, r);
up_read(&rdev->exclusive_lock);
r = radeon_cs_handle_lockup(rdev, r);
return r;
@@ -707,7 +708,7 @@ int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
}
if (r) {
- radeon_cs_parser_fini(&parser, r, false);
+ radeon_cs_parser_fini(&parser, r);
up_read(&rdev->exclusive_lock);
r = radeon_cs_handle_lockup(rdev, r);
return r;
@@ -724,7 +725,7 @@ int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
goto out;
}
out:
- radeon_cs_parser_fini(&parser, r, true);
+ radeon_cs_parser_fini(&parser, r);
up_read(&rdev->exclusive_lock);
r = radeon_cs_handle_lockup(rdev, r);
return r;
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c
index d0119c5f7eb3..3af518895603 100644
--- a/drivers/gpu/drm/radeon/radeon_gem.c
+++ b/drivers/gpu/drm/radeon/radeon_gem.c
@@ -623,33 +623,40 @@ int radeon_gem_get_tiling_ioctl(struct drm_device *dev, void *data,
static void radeon_gem_va_update_vm(struct radeon_device *rdev,
struct radeon_bo_va *bo_va)
{
- struct ttm_validate_buffer tv, *entry;
- struct radeon_bo_list *vm_bos;
- struct ww_acquire_ctx ticket;
+ struct radeon_bo_list *vm_bos, *entry;
struct list_head list;
+ struct drm_exec exec;
unsigned domain;
int r;
INIT_LIST_HEAD(&list);
- tv.bo = &bo_va->bo->tbo;
- tv.num_shared = 1;
- list_add(&tv.head, &list);
-
vm_bos = radeon_vm_get_bos(rdev, bo_va->vm, &list);
if (!vm_bos)
return;
- r = ttm_eu_reserve_buffers(&ticket, &list, true, NULL);
- if (r)
- goto error_free;
+ drm_exec_init(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT);
+ drm_exec_until_all_locked(&exec) {
+ list_for_each_entry(entry, &list, list) {
+ r = drm_exec_prepare_obj(&exec, &entry->robj->tbo.base,
+ 1);
+ drm_exec_retry_on_contention(&exec);
+ if (unlikely(r))
+ goto error_cleanup;
+ }
- list_for_each_entry(entry, &list, head) {
- domain = radeon_mem_type_to_domain(entry->bo->resource->mem_type);
+ r = drm_exec_prepare_obj(&exec, &bo_va->bo->tbo.base, 1);
+ drm_exec_retry_on_contention(&exec);
+ if (unlikely(r))
+ goto error_cleanup;
+ }
+
+ list_for_each_entry(entry, &list, list) {
+ domain = radeon_mem_type_to_domain(entry->robj->tbo.resource->mem_type);
/* if anything is swapped out don't swap it in here,
just abort and wait for the next CS */
if (domain == RADEON_GEM_DOMAIN_CPU)
- goto error_unreserve;
+ goto error_cleanup;
}
mutex_lock(&bo_va->vm->mutex);
@@ -663,10 +670,8 @@ static void radeon_gem_va_update_vm(struct radeon_device *rdev,
error_unlock:
mutex_unlock(&bo_va->vm->mutex);
-error_unreserve:
- ttm_eu_backoff_reservation(&ticket, &list);
-
-error_free:
+error_cleanup:
+ drm_exec_fini(&exec);
kvfree(vm_bos);
if (r && r != -ERESTARTSYS)
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index 10c0fbd9d2b4..e47f04c001b8 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -468,23 +468,26 @@ static u64 radeon_bo_get_threshold_for_moves(struct radeon_device *rdev)
}
int radeon_bo_list_validate(struct radeon_device *rdev,
- struct ww_acquire_ctx *ticket,
+ struct drm_exec *exec,
struct list_head *head, int ring)
{
struct ttm_operation_ctx ctx = { true, false };
struct radeon_bo_list *lobj;
- struct list_head duplicates;
- int r;
u64 bytes_moved = 0, initial_bytes_moved;
u64 bytes_moved_threshold = radeon_bo_get_threshold_for_moves(rdev);
+ int r;
- INIT_LIST_HEAD(&duplicates);
- r = ttm_eu_reserve_buffers(ticket, head, true, &duplicates);
- if (unlikely(r != 0)) {
- return r;
+ drm_exec_until_all_locked(exec) {
+ list_for_each_entry(lobj, head, list) {
+ r = drm_exec_prepare_obj(exec, &lobj->robj->tbo.base,
+ 1);
+ drm_exec_retry_on_contention(exec);
+ if (unlikely(r && r != -EALREADY))
+ return r;
+ }
}
- list_for_each_entry(lobj, head, tv.head) {
+ list_for_each_entry(lobj, head, list) {
struct radeon_bo *bo = lobj->robj;
if (!bo->tbo.pin_count) {
u32 domain = lobj->preferred_domains;
@@ -523,7 +526,6 @@ int radeon_bo_list_validate(struct radeon_device *rdev,
domain = lobj->allowed_domains;
goto retry;
}
- ttm_eu_backoff_reservation(ticket, head);
return r;
}
}
@@ -531,11 +533,6 @@ int radeon_bo_list_validate(struct radeon_device *rdev,
lobj->tiling_flags = bo->tiling_flags;
}
- list_for_each_entry(lobj, &duplicates, tv.head) {
- lobj->gpu_offset = radeon_bo_gpu_offset(lobj->robj);
- lobj->tiling_flags = lobj->robj->tiling_flags;
- }
-
return 0;
}
diff --git a/drivers/gpu/drm/radeon/radeon_object.h b/drivers/gpu/drm/radeon/radeon_object.h
index 39cc87a59a9a..d7bbb52db546 100644
--- a/drivers/gpu/drm/radeon/radeon_object.h
+++ b/drivers/gpu/drm/radeon/radeon_object.h
@@ -152,7 +152,7 @@ extern void radeon_bo_force_delete(struct radeon_device *rdev);
extern int radeon_bo_init(struct radeon_device *rdev);
extern void radeon_bo_fini(struct radeon_device *rdev);
extern int radeon_bo_list_validate(struct radeon_device *rdev,
- struct ww_acquire_ctx *ticket,
+ struct drm_exec *exec,
struct list_head *head, int ring);
extern int radeon_bo_set_tiling_flags(struct radeon_bo *bo,
u32 tiling_flags, u32 pitch);
diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
index 987cabbf1318..647c4a07d92a 100644
--- a/drivers/gpu/drm/radeon/radeon_vm.c
+++ b/drivers/gpu/drm/radeon/radeon_vm.c
@@ -142,10 +142,9 @@ struct radeon_bo_list *radeon_vm_get_bos(struct radeon_device *rdev,
list[0].robj = vm->page_directory;
list[0].preferred_domains = RADEON_GEM_DOMAIN_VRAM;
list[0].allowed_domains = RADEON_GEM_DOMAIN_VRAM;
- list[0].tv.bo = &vm->page_directory->tbo;
- list[0].tv.num_shared = 1;
+ list[0].shared = true;
list[0].tiling_flags = 0;
- list_add(&list[0].tv.head, head);
+ list_add(&list[0].list, head);
for (i = 0, idx = 1; i <= vm->max_pde_used; i++) {
if (!vm->page_tables[i].bo)
@@ -154,10 +153,9 @@ struct radeon_bo_list *radeon_vm_get_bos(struct radeon_device *rdev,
list[idx].robj = vm->page_tables[i].bo;
list[idx].preferred_domains = RADEON_GEM_DOMAIN_VRAM;
list[idx].allowed_domains = RADEON_GEM_DOMAIN_VRAM;
- list[idx].tv.bo = &list[idx].robj->tbo;
- list[idx].tv.num_shared = 1;
+ list[idx].shared = true;
list[idx].tiling_flags = 0;
- list_add(&list[idx++].tv.head, head);
+ list_add(&list[idx++].list, head);
}
return list;
--
2.34.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 2/7] drm/qxl: switch to using drm_exec
2023-07-12 12:46 Switching more drivers to use drm_exec Christian König
2023-07-12 12:46 ` [PATCH 1/7] drm/radeon: switch over to drm_exec Christian König
@ 2023-07-12 12:46 ` Christian König
2023-07-12 12:47 ` [PATCH 3/7] drm/lima: " Christian König
` (4 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Christian König @ 2023-07-12 12:46 UTC (permalink / raw)
To: dri-devel
Cc: spice-devel, Dave Airlie, virtualization, Christian König,
Gerd Hoffmann
Just a straightforward conversion without any optimization.
Only compile tested for now.
Signed-off-by: Christian König <christian.koenig@amd.com>
Cc: Dave Airlie <airlied@redhat.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: virtualization@lists.linux-foundation.org
Cc: spice-devel@lists.freedesktop.org
---
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 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
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..5953e8ed5f47 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);
+ 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
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 3/7] drm/lima: switch to using drm_exec
2023-07-12 12:46 Switching more drivers to use drm_exec Christian König
2023-07-12 12:46 ` [PATCH 1/7] drm/radeon: switch over to drm_exec Christian König
2023-07-12 12:46 ` [PATCH 2/7] drm/qxl: switch to using drm_exec Christian König
@ 2023-07-12 12:47 ` Christian König
2023-07-12 12:47 ` [PATCH 4/7] drm/virtgpu: " Christian König
` (3 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Christian König @ 2023-07-12 12:47 UTC (permalink / raw)
To: dri-devel; +Cc: Christian König, lima, Qiang Yu
Just a straightforward conversion without any optimization.
Only compile tested for now.
Signed-off-by: Christian König <christian.koenig@amd.com>
Cc: Qiang Yu <yuq825@gmail.com>
Cc: lima@lists.freedesktop.org
---
drivers/gpu/drm/lima/Kconfig | 1 +
drivers/gpu/drm/lima/lima_gem.c | 17 +++++++++--------
2 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/drivers/gpu/drm/lima/Kconfig b/drivers/gpu/drm/lima/Kconfig
index fa1d4f5df31e..1d2871d9ddd2 100644
--- a/drivers/gpu/drm/lima/Kconfig
+++ b/drivers/gpu/drm/lima/Kconfig
@@ -9,6 +9,7 @@ config DRM_LIMA
depends on COMMON_CLK
depends on OF
select DRM_SCHED
+ select DRM_EXEC
select DRM_GEM_SHMEM_HELPER
select PM_DEVFREQ
select DEVFREQ_GOV_SIMPLE_ONDEMAND
diff --git a/drivers/gpu/drm/lima/lima_gem.c b/drivers/gpu/drm/lima/lima_gem.c
index 4f9736e5f929..d4688d19465b 100644
--- a/drivers/gpu/drm/lima/lima_gem.c
+++ b/drivers/gpu/drm/lima/lima_gem.c
@@ -8,6 +8,7 @@
#include <linux/shmem_fs.h>
#include <linux/dma-mapping.h>
+#include <drm/drm_exec.h>
#include <drm/drm_file.h>
#include <drm/drm_syncobj.h>
#include <drm/drm_utils.h>
@@ -292,7 +293,7 @@ static int lima_gem_add_deps(struct drm_file *file, struct lima_submit *submit)
int lima_gem_submit(struct drm_file *file, struct lima_submit *submit)
{
int i, err = 0;
- struct ww_acquire_ctx ctx;
+ struct drm_exec exec;
struct lima_drm_priv *priv = to_lima_drm_priv(file);
struct lima_vm *vm = priv->vm;
struct drm_syncobj *out_sync = NULL;
@@ -329,8 +330,11 @@ int lima_gem_submit(struct drm_file *file, struct lima_submit *submit)
bos[i] = bo;
}
- err = drm_gem_lock_reservations((struct drm_gem_object **)bos,
- submit->nr_bos, &ctx);
+ drm_exec_init(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT);
+ drm_exec_until_all_locked(&exec)
+ err = drm_exec_prepare_array(&exec,
+ (struct drm_gem_object **)bos,
+ submit->nr_bos, 0);
if (err)
goto err_out0;
@@ -360,9 +364,7 @@ int lima_gem_submit(struct drm_file *file, struct lima_submit *submit)
submit->bos[i].flags & LIMA_SUBMIT_BO_WRITE ?
DMA_RESV_USAGE_WRITE : DMA_RESV_USAGE_READ);
}
-
- drm_gem_unlock_reservations((struct drm_gem_object **)bos,
- submit->nr_bos, &ctx);
+ drm_exec_fini(&exec);
for (i = 0; i < submit->nr_bos; i++)
drm_gem_object_put(&bos[i]->base.base);
@@ -379,8 +381,7 @@ int lima_gem_submit(struct drm_file *file, struct lima_submit *submit)
err_out2:
lima_sched_task_fini(submit->task);
err_out1:
- drm_gem_unlock_reservations((struct drm_gem_object **)bos,
- submit->nr_bos, &ctx);
+ drm_exec_fini(&exec);
err_out0:
for (i = 0; i < submit->nr_bos; i++) {
if (!bos[i])
--
2.34.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 4/7] drm/virtgpu: switch to using drm_exec
2023-07-12 12:46 Switching more drivers to use drm_exec Christian König
` (2 preceding siblings ...)
2023-07-12 12:47 ` [PATCH 3/7] drm/lima: " Christian König
@ 2023-07-12 12:47 ` Christian König
2023-07-12 12:47 ` [PATCH 5/7] drm/panfrost: " Christian König
` (2 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Christian König @ 2023-07-12 12:47 UTC (permalink / raw)
To: dri-devel
Cc: Christian König, Gurchetan Singh, Gerd Hoffmann,
David Airlie, virtualization
Just a straightforward conversion without any optimization.
Only compile tested for now.
Signed-off-by: Christian König <christian.koenig@amd.com>
Cc: David Airlie <airlied@redhat.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Gurchetan Singh <gurchetansingh@chromium.org>
Cc: Chia-I Wu <olvaffe@gmail.com>
Cc: virtualization@lists.linux-foundation.org
---
drivers/gpu/drm/virtio/Kconfig | 1 +
drivers/gpu/drm/virtio/virtgpu_drv.h | 3 ++-
drivers/gpu/drm/virtio/virtgpu_gem.c | 28 +++++-----------------------
3 files changed, 8 insertions(+), 24 deletions(-)
diff --git a/drivers/gpu/drm/virtio/Kconfig b/drivers/gpu/drm/virtio/Kconfig
index ea06ff2aa4b4..a24a1ce5e666 100644
--- a/drivers/gpu/drm/virtio/Kconfig
+++ b/drivers/gpu/drm/virtio/Kconfig
@@ -5,6 +5,7 @@ config DRM_VIRTIO_GPU
select VIRTIO
select DRM_KMS_HELPER
select DRM_GEM_SHMEM_HELPER
+ select DRM_EXEC
select VIRTIO_DMA_SHARED_BUFFER
help
This is the virtual GPU driver for virtio. It can be used with
diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
index 4126c384286b..cb5d9218a3ab 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.h
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
@@ -35,6 +35,7 @@
#include <drm/drm_atomic.h>
#include <drm/drm_drv.h>
#include <drm/drm_encoder.h>
+#include <drm/drm_exec.h>
#include <drm/drm_fourcc.h>
#include <drm/drm_framebuffer.h>
#include <drm/drm_gem.h>
@@ -116,7 +117,7 @@ struct virtio_gpu_object_vram {
container_of((virtio_gpu_object), struct virtio_gpu_object_vram, base)
struct virtio_gpu_object_array {
- struct ww_acquire_ctx ticket;
+ struct drm_exec exec;
struct list_head next;
u32 nents, total;
struct drm_gem_object *objs[];
diff --git a/drivers/gpu/drm/virtio/virtgpu_gem.c b/drivers/gpu/drm/virtio/virtgpu_gem.c
index 7db48d17ee3a..bb7928e7b3b6 100644
--- a/drivers/gpu/drm/virtio/virtgpu_gem.c
+++ b/drivers/gpu/drm/virtio/virtgpu_gem.c
@@ -171,6 +171,7 @@ struct virtio_gpu_object_array *virtio_gpu_array_alloc(u32 nents)
objs->nents = 0;
objs->total = nents;
+ drm_exec_init(&objs->exec, DRM_EXEC_INTERRUPTIBLE_WAIT);
return objs;
}
@@ -214,36 +215,17 @@ void virtio_gpu_array_add_obj(struct virtio_gpu_object_array *objs,
int virtio_gpu_array_lock_resv(struct virtio_gpu_object_array *objs)
{
- unsigned int i;
int ret;
- if (objs->nents == 1) {
- ret = dma_resv_lock_interruptible(objs->objs[0]->resv, NULL);
- } else {
- ret = drm_gem_lock_reservations(objs->objs, objs->nents,
- &objs->ticket);
- }
- if (ret)
- return ret;
-
- for (i = 0; i < objs->nents; ++i) {
- ret = dma_resv_reserve_fences(objs->objs[i]->resv, 1);
- if (ret) {
- virtio_gpu_array_unlock_resv(objs);
- return ret;
- }
- }
+ drm_exec_until_all_locked(&objs->exec)
+ ret = drm_exec_prepare_array(&objs->exec, objs->objs,
+ objs->nents, 1);
return ret;
}
void virtio_gpu_array_unlock_resv(struct virtio_gpu_object_array *objs)
{
- if (objs->nents == 1) {
- dma_resv_unlock(objs->objs[0]->resv);
- } else {
- drm_gem_unlock_reservations(objs->objs, objs->nents,
- &objs->ticket);
- }
+ drm_exec_fini(&objs->exec);
}
void virtio_gpu_array_add_fence(struct virtio_gpu_object_array *objs,
--
2.34.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 5/7] drm/panfrost: switch to using drm_exec
2023-07-12 12:46 Switching more drivers to use drm_exec Christian König
` (3 preceding siblings ...)
2023-07-12 12:47 ` [PATCH 4/7] drm/virtgpu: " Christian König
@ 2023-07-12 12:47 ` Christian König
2023-07-12 15:31 ` Steven Price
2023-07-12 12:47 ` [PATCH 6/7] drm/v3d: " Christian König
2023-07-12 12:47 ` [PATCH 7/7] drm: remove drm_gem_(un)lock_reservations Christian König
6 siblings, 1 reply; 10+ messages in thread
From: Christian König @ 2023-07-12 12:47 UTC (permalink / raw)
To: dri-devel
Cc: Alyssa Rosenzweig, Christian König, Tomeu Vizoso, Steven Price
Just a straightforward conversion without any optimization.
Only compile tested for now.
Signed-off-by: Christian König <christian.koenig@amd.com>
Cc: Rob Herring <robh@kernel.org>
Cc: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Cc: Steven Price <steven.price@arm.com>
Cc: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
---
drivers/gpu/drm/panfrost/Kconfig | 1 +
drivers/gpu/drm/panfrost/panfrost_job.c | 12 +++++++-----
2 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/panfrost/Kconfig b/drivers/gpu/drm/panfrost/Kconfig
index e6403a9d66ad..e86a1a2fd8e1 100644
--- a/drivers/gpu/drm/panfrost/Kconfig
+++ b/drivers/gpu/drm/panfrost/Kconfig
@@ -7,6 +7,7 @@ config DRM_PANFROST
depends on !GENERIC_ATOMIC64 # for IOMMU_IO_PGTABLE_LPAE
depends on MMU
select DRM_SCHED
+ select DRM_EXEC
select IOMMU_SUPPORT
select IOMMU_IO_PGTABLE_LPAE
select DRM_GEM_SHMEM_HELPER
diff --git a/drivers/gpu/drm/panfrost/panfrost_job.c b/drivers/gpu/drm/panfrost/panfrost_job.c
index dbc597ab46fb..8b9206e910b5 100644
--- a/drivers/gpu/drm/panfrost/panfrost_job.c
+++ b/drivers/gpu/drm/panfrost/panfrost_job.c
@@ -8,6 +8,7 @@
#include <linux/platform_device.h>
#include <linux/pm_runtime.h>
#include <linux/dma-resv.h>
+#include <drm/drm_exec.h>
#include <drm/gpu_scheduler.h>
#include <drm/panfrost_drm.h>
@@ -275,13 +276,14 @@ static void panfrost_attach_object_fences(struct drm_gem_object **bos,
int panfrost_job_push(struct panfrost_job *job)
{
struct panfrost_device *pfdev = job->pfdev;
- struct ww_acquire_ctx acquire_ctx;
+ struct drm_exec exec;
int ret = 0;
- ret = drm_gem_lock_reservations(job->bos, job->bo_count,
- &acquire_ctx);
+ drm_exec_init(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT);
+ drm_exec_until_all_locked(&exec)
+ ret = drm_exec_prepare_array(&exec, job->bos, job->bo_count, 1);
if (ret)
- return ret;
+ goto unlock;
mutex_lock(&pfdev->sched_lock);
drm_sched_job_arm(&job->base);
@@ -305,7 +307,7 @@ int panfrost_job_push(struct panfrost_job *job)
job->render_done_fence);
unlock:
- drm_gem_unlock_reservations(job->bos, job->bo_count, &acquire_ctx);
+ drm_exec_fini(&exec);
return ret;
}
--
2.34.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 6/7] drm/v3d: switch to using drm_exec
2023-07-12 12:46 Switching more drivers to use drm_exec Christian König
` (4 preceding siblings ...)
2023-07-12 12:47 ` [PATCH 5/7] drm/panfrost: " Christian König
@ 2023-07-12 12:47 ` Christian König
2023-07-17 19:32 ` Maira Canal
2023-07-12 12:47 ` [PATCH 7/7] drm: remove drm_gem_(un)lock_reservations Christian König
6 siblings, 1 reply; 10+ messages in thread
From: Christian König @ 2023-07-12 12:47 UTC (permalink / raw)
To: dri-devel; +Cc: Melissa Wen, Christian König, Emma Anholt
Just a straightforward conversion without any optimization.
Only compile tested for now.
Signed-off-by: Christian König <christian.koenig@amd.com>
Cc: Emma Anholt <emma@anholt.net>
Cc: Melissa Wen <mwen@igalia.com>
---
drivers/gpu/drm/v3d/v3d_gem.c | 44 ++++++++++++++++-------------------
1 file changed, 20 insertions(+), 24 deletions(-)
diff --git a/drivers/gpu/drm/v3d/v3d_gem.c b/drivers/gpu/drm/v3d/v3d_gem.c
index 2e94ce788c71..190e2a9f64a4 100644
--- a/drivers/gpu/drm/v3d/v3d_gem.c
+++ b/drivers/gpu/drm/v3d/v3d_gem.c
@@ -10,6 +10,7 @@
#include <linux/sched/signal.h>
#include <linux/uaccess.h>
+#include <drm/drm_exec.h>
#include <drm/drm_managed.h>
#include <drm/drm_syncobj.h>
#include <uapi/drm/v3d_drm.h>
@@ -249,20 +250,17 @@ v3d_invalidate_caches(struct v3d_dev *v3d)
* to v3d, so we don't attach dma-buf fences to them.
*/
static int
-v3d_lock_bo_reservations(struct v3d_job *job,
- struct ww_acquire_ctx *acquire_ctx)
+v3d_lock_bo_reservations(struct v3d_job *job, struct drm_exec *exec)
{
int i, ret;
- ret = drm_gem_lock_reservations(job->bo, job->bo_count, acquire_ctx);
+ drm_exec_init(exec, DRM_EXEC_INTERRUPTIBLE_WAIT);
+ drm_exec_until_all_locked(exec)
+ ret = drm_exec_prepare_array(exec, job->bo, job->bo_count, 1);
if (ret)
- return ret;
+ goto fail;
for (i = 0; i < job->bo_count; i++) {
- ret = dma_resv_reserve_fences(job->bo[i]->resv, 1);
- if (ret)
- goto fail;
-
ret = drm_sched_job_add_implicit_dependencies(&job->base,
job->bo[i], true);
if (ret)
@@ -272,7 +270,7 @@ v3d_lock_bo_reservations(struct v3d_job *job,
return 0;
fail:
- drm_gem_unlock_reservations(job->bo, job->bo_count, acquire_ctx);
+ drm_exec_fini(exec);
return ret;
}
@@ -477,7 +475,7 @@ v3d_push_job(struct v3d_job *job)
static void
v3d_attach_fences_and_unlock_reservation(struct drm_file *file_priv,
struct v3d_job *job,
- struct ww_acquire_ctx *acquire_ctx,
+ struct drm_exec *exec,
u32 out_sync,
struct v3d_submit_ext *se,
struct dma_fence *done_fence)
@@ -492,7 +490,7 @@ v3d_attach_fences_and_unlock_reservation(struct drm_file *file_priv,
DMA_RESV_USAGE_WRITE);
}
- drm_gem_unlock_reservations(job->bo, job->bo_count, acquire_ctx);
+ drm_exec_fini(exec);
/* Update the return sync object for the job */
/* If it only supports a single signal semaphore*/
@@ -669,7 +667,7 @@ v3d_submit_cl_ioctl(struct drm_device *dev, void *data,
struct v3d_render_job *render = NULL;
struct v3d_job *clean_job = NULL;
struct v3d_job *last_job;
- struct ww_acquire_ctx acquire_ctx;
+ struct drm_exec exec;
int ret = 0;
trace_v3d_submit_cl_ioctl(&v3d->drm, args->rcl_start, args->rcl_end);
@@ -731,7 +729,7 @@ v3d_submit_cl_ioctl(struct drm_device *dev, void *data,
if (ret)
goto fail;
- ret = v3d_lock_bo_reservations(last_job, &acquire_ctx);
+ ret = v3d_lock_bo_reservations(last_job, &exec);
if (ret)
goto fail;
@@ -775,7 +773,7 @@ v3d_submit_cl_ioctl(struct drm_device *dev, void *data,
v3d_attach_fences_and_unlock_reservation(file_priv,
last_job,
- &acquire_ctx,
+ &exec,
args->out_sync,
&se,
last_job->done_fence);
@@ -791,8 +789,7 @@ v3d_submit_cl_ioctl(struct drm_device *dev, void *data,
fail_unreserve:
mutex_unlock(&v3d->sched_lock);
fail_perfmon:
- drm_gem_unlock_reservations(last_job->bo,
- last_job->bo_count, &acquire_ctx);
+ drm_exec_fini(&exec);
fail:
v3d_job_cleanup((void *)bin);
v3d_job_cleanup((void *)render);
@@ -819,7 +816,7 @@ v3d_submit_tfu_ioctl(struct drm_device *dev, void *data,
struct drm_v3d_submit_tfu *args = data;
struct v3d_submit_ext se = {0};
struct v3d_tfu_job *job = NULL;
- struct ww_acquire_ctx acquire_ctx;
+ struct drm_exec exec;
int ret = 0;
trace_v3d_submit_tfu_ioctl(&v3d->drm, args->iia);
@@ -870,7 +867,7 @@ v3d_submit_tfu_ioctl(struct drm_device *dev, void *data,
job->base.bo[job->base.bo_count] = bo;
}
- ret = v3d_lock_bo_reservations(&job->base, &acquire_ctx);
+ ret = v3d_lock_bo_reservations(&job->base, &exec);
if (ret)
goto fail;
@@ -879,7 +876,7 @@ v3d_submit_tfu_ioctl(struct drm_device *dev, void *data,
mutex_unlock(&v3d->sched_lock);
v3d_attach_fences_and_unlock_reservation(file_priv,
- &job->base, &acquire_ctx,
+ &job->base, &exec,
args->out_sync,
&se,
job->base.done_fence);
@@ -914,7 +911,7 @@ v3d_submit_csd_ioctl(struct drm_device *dev, void *data,
struct v3d_submit_ext se = {0};
struct v3d_csd_job *job = NULL;
struct v3d_job *clean_job = NULL;
- struct ww_acquire_ctx acquire_ctx;
+ struct drm_exec exec;
int ret;
trace_v3d_submit_csd_ioctl(&v3d->drm, args->cfg[5], args->cfg[6]);
@@ -957,7 +954,7 @@ v3d_submit_csd_ioctl(struct drm_device *dev, void *data,
if (ret)
goto fail;
- ret = v3d_lock_bo_reservations(clean_job, &acquire_ctx);
+ ret = v3d_lock_bo_reservations(clean_job, &exec);
if (ret)
goto fail;
@@ -983,7 +980,7 @@ v3d_submit_csd_ioctl(struct drm_device *dev, void *data,
v3d_attach_fences_and_unlock_reservation(file_priv,
clean_job,
- &acquire_ctx,
+ &exec,
args->out_sync,
&se,
clean_job->done_fence);
@@ -996,8 +993,7 @@ v3d_submit_csd_ioctl(struct drm_device *dev, void *data,
fail_unreserve:
mutex_unlock(&v3d->sched_lock);
fail_perfmon:
- drm_gem_unlock_reservations(clean_job->bo, clean_job->bo_count,
- &acquire_ctx);
+ drm_exec_fini(&exec);
fail:
v3d_job_cleanup((void *)job);
v3d_job_cleanup(clean_job);
--
2.34.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 7/7] drm: remove drm_gem_(un)lock_reservations
2023-07-12 12:46 Switching more drivers to use drm_exec Christian König
` (5 preceding siblings ...)
2023-07-12 12:47 ` [PATCH 6/7] drm/v3d: " Christian König
@ 2023-07-12 12:47 ` Christian König
6 siblings, 0 replies; 10+ messages in thread
From: Christian König @ 2023-07-12 12:47 UTC (permalink / raw)
To: dri-devel; +Cc: Thomas Zimmermann, Christian König, Maxime Ripard
Not used any more.
Signed-off-by: Christian König <christian.koenig@amd.com>
Cc: Maxime Ripard <mripard@kernel.org>
Cc: Thomas Zimmermann <tzimmermann@suse.de>
---
drivers/gpu/drm/drm_gem.c | 78 --------------------------
drivers/gpu/drm/scheduler/sched_main.c | 5 +-
include/drm/drm_gem.h | 4 --
3 files changed, 2 insertions(+), 85 deletions(-)
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
index c18686f434d4..2753926c74db 100644
--- a/drivers/gpu/drm/drm_gem.c
+++ b/drivers/gpu/drm/drm_gem.c
@@ -1214,84 +1214,6 @@ void drm_gem_vunmap_unlocked(struct drm_gem_object *obj, struct iosys_map *map)
}
EXPORT_SYMBOL(drm_gem_vunmap_unlocked);
-/**
- * drm_gem_lock_reservations - Sets up the ww context and acquires
- * the lock on an array of GEM objects.
- *
- * Once you've locked your reservations, you'll want to set up space
- * for your shared fences (if applicable), submit your job, then
- * drm_gem_unlock_reservations().
- *
- * @objs: drm_gem_objects to lock
- * @count: Number of objects in @objs
- * @acquire_ctx: struct ww_acquire_ctx that will be initialized as
- * part of tracking this set of locked reservations.
- */
-int
-drm_gem_lock_reservations(struct drm_gem_object **objs, int count,
- struct ww_acquire_ctx *acquire_ctx)
-{
- int contended = -1;
- int i, ret;
-
- ww_acquire_init(acquire_ctx, &reservation_ww_class);
-
-retry:
- if (contended != -1) {
- struct drm_gem_object *obj = objs[contended];
-
- ret = dma_resv_lock_slow_interruptible(obj->resv,
- acquire_ctx);
- if (ret) {
- ww_acquire_fini(acquire_ctx);
- return ret;
- }
- }
-
- for (i = 0; i < count; i++) {
- if (i == contended)
- continue;
-
- ret = dma_resv_lock_interruptible(objs[i]->resv,
- acquire_ctx);
- if (ret) {
- int j;
-
- for (j = 0; j < i; j++)
- dma_resv_unlock(objs[j]->resv);
-
- if (contended != -1 && contended >= i)
- dma_resv_unlock(objs[contended]->resv);
-
- if (ret == -EDEADLK) {
- contended = i;
- goto retry;
- }
-
- ww_acquire_fini(acquire_ctx);
- return ret;
- }
- }
-
- ww_acquire_done(acquire_ctx);
-
- return 0;
-}
-EXPORT_SYMBOL(drm_gem_lock_reservations);
-
-void
-drm_gem_unlock_reservations(struct drm_gem_object **objs, int count,
- struct ww_acquire_ctx *acquire_ctx)
-{
- int i;
-
- for (i = 0; i < count; i++)
- dma_resv_unlock(objs[i]->resv);
-
- ww_acquire_fini(acquire_ctx);
-}
-EXPORT_SYMBOL(drm_gem_unlock_reservations);
-
/**
* drm_gem_lru_init - initialize a LRU
*
diff --git a/drivers/gpu/drm/scheduler/sched_main.c b/drivers/gpu/drm/scheduler/sched_main.c
index 7b2bfc10c1a5..335640369a0f 100644
--- a/drivers/gpu/drm/scheduler/sched_main.c
+++ b/drivers/gpu/drm/scheduler/sched_main.c
@@ -795,9 +795,8 @@ EXPORT_SYMBOL(drm_sched_job_add_resv_dependencies);
* @write: whether the job might write the object (so we need to depend on
* shared fences in the reservation object).
*
- * This should be called after drm_gem_lock_reservations() on your array of
- * GEM objects used in the job but before updating the reservations with your
- * own fences.
+ * This should be called after locking your GEM objects used in the job but
+ * before updating the reservations with your own fences.
*
* Returns:
* 0 on success, or an error on failing to expand the array.
diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h
index bbc721870c13..35ffa5aa7b96 100644
--- a/include/drm/drm_gem.h
+++ b/include/drm/drm_gem.h
@@ -508,10 +508,6 @@ int drm_gem_objects_lookup(struct drm_file *filp, void __user *bo_handles,
struct drm_gem_object *drm_gem_object_lookup(struct drm_file *filp, u32 handle);
long drm_gem_dma_resv_wait(struct drm_file *filep, u32 handle,
bool wait_all, unsigned long timeout);
-int drm_gem_lock_reservations(struct drm_gem_object **objs, int count,
- struct ww_acquire_ctx *acquire_ctx);
-void drm_gem_unlock_reservations(struct drm_gem_object **objs, int count,
- struct ww_acquire_ctx *acquire_ctx);
int drm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
u32 handle, u64 *offset);
--
2.34.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 5/7] drm/panfrost: switch to using drm_exec
2023-07-12 12:47 ` [PATCH 5/7] drm/panfrost: " Christian König
@ 2023-07-12 15:31 ` Steven Price
0 siblings, 0 replies; 10+ messages in thread
From: Steven Price @ 2023-07-12 15:31 UTC (permalink / raw)
To: Christian König, dri-devel
Cc: Christian König, Tomeu Vizoso, Alyssa Rosenzweig
On 12/07/2023 13:47, Christian König wrote:
> Just a straightforward conversion without any optimization.
>
> Only compile tested for now.
>
> Signed-off-by: Christian König <christian.koenig@amd.com>
> Cc: Rob Herring <robh@kernel.org>
> Cc: Tomeu Vizoso <tomeu.vizoso@collabora.com>
> Cc: Steven Price <steven.price@arm.com>
> Cc: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
> ---
> drivers/gpu/drm/panfrost/Kconfig | 1 +
> drivers/gpu/drm/panfrost/panfrost_job.c | 12 +++++++-----
> 2 files changed, 8 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/panfrost/Kconfig b/drivers/gpu/drm/panfrost/Kconfig
> index e6403a9d66ad..e86a1a2fd8e1 100644
> --- a/drivers/gpu/drm/panfrost/Kconfig
> +++ b/drivers/gpu/drm/panfrost/Kconfig
> @@ -7,6 +7,7 @@ config DRM_PANFROST
> depends on !GENERIC_ATOMIC64 # for IOMMU_IO_PGTABLE_LPAE
> depends on MMU
> select DRM_SCHED
> + select DRM_EXEC
> select IOMMU_SUPPORT
> select IOMMU_IO_PGTABLE_LPAE
> select DRM_GEM_SHMEM_HELPER
> diff --git a/drivers/gpu/drm/panfrost/panfrost_job.c b/drivers/gpu/drm/panfrost/panfrost_job.c
> index dbc597ab46fb..8b9206e910b5 100644
> --- a/drivers/gpu/drm/panfrost/panfrost_job.c
> +++ b/drivers/gpu/drm/panfrost/panfrost_job.c
> @@ -8,6 +8,7 @@
> #include <linux/platform_device.h>
> #include <linux/pm_runtime.h>
> #include <linux/dma-resv.h>
> +#include <drm/drm_exec.h>
> #include <drm/gpu_scheduler.h>
> #include <drm/panfrost_drm.h>
>
> @@ -275,13 +276,14 @@ static void panfrost_attach_object_fences(struct drm_gem_object **bos,
> int panfrost_job_push(struct panfrost_job *job)
> {
> struct panfrost_device *pfdev = job->pfdev;
> - struct ww_acquire_ctx acquire_ctx;
> + struct drm_exec exec;
> int ret = 0;
>
> - ret = drm_gem_lock_reservations(job->bos, job->bo_count,
> - &acquire_ctx);
> + drm_exec_init(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT);
> + drm_exec_until_all_locked(&exec)
> + ret = drm_exec_prepare_array(&exec, job->bos, job->bo_count, 1);
This loop bothers me - the return value is ignored until
drm_exec_until_all_locked() decides we can exit. It also reads badly
without the braces and with the "if" unindented below. The documentation
("a typical usage pattern") suggests this should be something like:
drm_exec_until_all_locked(&exec) {
ret = drm_exec_prepare_array(...);
drm_exec_retry_on_contention(&exec);
if (ret)
goto unlock;
}
Although I'm not sure if that's actually different because if there's no
contention that drm_exec_until_all_locked() looks like it should exit.
Perhaps it's just the name drm_exec_until_all_locked() which perhaps
should be drm_exec_until_not_contended()...?
Anyway I gave it a quick spin on a Firefly-RK3288 and didn't see any
problems, but I don't think I've got any tests which would create
contention on the BOs.
Steve
> if (ret)
> - return ret;
> + goto unlock;
>
> mutex_lock(&pfdev->sched_lock);
> drm_sched_job_arm(&job->base);
> @@ -305,7 +307,7 @@ int panfrost_job_push(struct panfrost_job *job)
> job->render_done_fence);
>
> unlock:
> - drm_gem_unlock_reservations(job->bos, job->bo_count, &acquire_ctx);
> + drm_exec_fini(&exec);
>
> return ret;
> }
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 6/7] drm/v3d: switch to using drm_exec
2023-07-12 12:47 ` [PATCH 6/7] drm/v3d: " Christian König
@ 2023-07-17 19:32 ` Maira Canal
0 siblings, 0 replies; 10+ messages in thread
From: Maira Canal @ 2023-07-17 19:32 UTC (permalink / raw)
To: Christian König, dri-devel
Cc: Melissa Wen, Christian König, Emma Anholt
Hi Christian,
I believe that `select DRM_EXEC` is missing on v3d's Kconfig file. If
we don't select it, we will get some compilation errors.
Apart from this problem, I ran some tests on the RPi 4 and didn't see
any problems.
Best Regards,
- Maíra
On 7/12/23 09:47, Christian König wrote:
> Just a straightforward conversion without any optimization.
>
> Only compile tested for now.
>
> Signed-off-by: Christian König <christian.koenig@amd.com>
> Cc: Emma Anholt <emma@anholt.net>
> Cc: Melissa Wen <mwen@igalia.com>
> ---
> drivers/gpu/drm/v3d/v3d_gem.c | 44 ++++++++++++++++-------------------
> 1 file changed, 20 insertions(+), 24 deletions(-)
>
> diff --git a/drivers/gpu/drm/v3d/v3d_gem.c b/drivers/gpu/drm/v3d/v3d_gem.c
> index 2e94ce788c71..190e2a9f64a4 100644
> --- a/drivers/gpu/drm/v3d/v3d_gem.c
> +++ b/drivers/gpu/drm/v3d/v3d_gem.c
> @@ -10,6 +10,7 @@
> #include <linux/sched/signal.h>
> #include <linux/uaccess.h>
>
> +#include <drm/drm_exec.h>
> #include <drm/drm_managed.h>
> #include <drm/drm_syncobj.h>
> #include <uapi/drm/v3d_drm.h>
> @@ -249,20 +250,17 @@ v3d_invalidate_caches(struct v3d_dev *v3d)
> * to v3d, so we don't attach dma-buf fences to them.
> */
> static int
> -v3d_lock_bo_reservations(struct v3d_job *job,
> - struct ww_acquire_ctx *acquire_ctx)
> +v3d_lock_bo_reservations(struct v3d_job *job, struct drm_exec *exec)
> {
> int i, ret;
>
> - ret = drm_gem_lock_reservations(job->bo, job->bo_count, acquire_ctx);
> + drm_exec_init(exec, DRM_EXEC_INTERRUPTIBLE_WAIT);
> + drm_exec_until_all_locked(exec)
> + ret = drm_exec_prepare_array(exec, job->bo, job->bo_count, 1);
> if (ret)
> - return ret;
> + goto fail;
>
> for (i = 0; i < job->bo_count; i++) {
> - ret = dma_resv_reserve_fences(job->bo[i]->resv, 1);
> - if (ret)
> - goto fail;
> -
> ret = drm_sched_job_add_implicit_dependencies(&job->base,
> job->bo[i], true);
> if (ret)
> @@ -272,7 +270,7 @@ v3d_lock_bo_reservations(struct v3d_job *job,
> return 0;
>
> fail:
> - drm_gem_unlock_reservations(job->bo, job->bo_count, acquire_ctx);
> + drm_exec_fini(exec);
> return ret;
> }
>
> @@ -477,7 +475,7 @@ v3d_push_job(struct v3d_job *job)
> static void
> v3d_attach_fences_and_unlock_reservation(struct drm_file *file_priv,
> struct v3d_job *job,
> - struct ww_acquire_ctx *acquire_ctx,
> + struct drm_exec *exec,
> u32 out_sync,
> struct v3d_submit_ext *se,
> struct dma_fence *done_fence)
> @@ -492,7 +490,7 @@ v3d_attach_fences_and_unlock_reservation(struct drm_file *file_priv,
> DMA_RESV_USAGE_WRITE);
> }
>
> - drm_gem_unlock_reservations(job->bo, job->bo_count, acquire_ctx);
> + drm_exec_fini(exec);
>
> /* Update the return sync object for the job */
> /* If it only supports a single signal semaphore*/
> @@ -669,7 +667,7 @@ v3d_submit_cl_ioctl(struct drm_device *dev, void *data,
> struct v3d_render_job *render = NULL;
> struct v3d_job *clean_job = NULL;
> struct v3d_job *last_job;
> - struct ww_acquire_ctx acquire_ctx;
> + struct drm_exec exec;
> int ret = 0;
>
> trace_v3d_submit_cl_ioctl(&v3d->drm, args->rcl_start, args->rcl_end);
> @@ -731,7 +729,7 @@ v3d_submit_cl_ioctl(struct drm_device *dev, void *data,
> if (ret)
> goto fail;
>
> - ret = v3d_lock_bo_reservations(last_job, &acquire_ctx);
> + ret = v3d_lock_bo_reservations(last_job, &exec);
> if (ret)
> goto fail;
>
> @@ -775,7 +773,7 @@ v3d_submit_cl_ioctl(struct drm_device *dev, void *data,
>
> v3d_attach_fences_and_unlock_reservation(file_priv,
> last_job,
> - &acquire_ctx,
> + &exec,
> args->out_sync,
> &se,
> last_job->done_fence);
> @@ -791,8 +789,7 @@ v3d_submit_cl_ioctl(struct drm_device *dev, void *data,
> fail_unreserve:
> mutex_unlock(&v3d->sched_lock);
> fail_perfmon:
> - drm_gem_unlock_reservations(last_job->bo,
> - last_job->bo_count, &acquire_ctx);
> + drm_exec_fini(&exec);
> fail:
> v3d_job_cleanup((void *)bin);
> v3d_job_cleanup((void *)render);
> @@ -819,7 +816,7 @@ v3d_submit_tfu_ioctl(struct drm_device *dev, void *data,
> struct drm_v3d_submit_tfu *args = data;
> struct v3d_submit_ext se = {0};
> struct v3d_tfu_job *job = NULL;
> - struct ww_acquire_ctx acquire_ctx;
> + struct drm_exec exec;
> int ret = 0;
>
> trace_v3d_submit_tfu_ioctl(&v3d->drm, args->iia);
> @@ -870,7 +867,7 @@ v3d_submit_tfu_ioctl(struct drm_device *dev, void *data,
> job->base.bo[job->base.bo_count] = bo;
> }
>
> - ret = v3d_lock_bo_reservations(&job->base, &acquire_ctx);
> + ret = v3d_lock_bo_reservations(&job->base, &exec);
> if (ret)
> goto fail;
>
> @@ -879,7 +876,7 @@ v3d_submit_tfu_ioctl(struct drm_device *dev, void *data,
> mutex_unlock(&v3d->sched_lock);
>
> v3d_attach_fences_and_unlock_reservation(file_priv,
> - &job->base, &acquire_ctx,
> + &job->base, &exec,
> args->out_sync,
> &se,
> job->base.done_fence);
> @@ -914,7 +911,7 @@ v3d_submit_csd_ioctl(struct drm_device *dev, void *data,
> struct v3d_submit_ext se = {0};
> struct v3d_csd_job *job = NULL;
> struct v3d_job *clean_job = NULL;
> - struct ww_acquire_ctx acquire_ctx;
> + struct drm_exec exec;
> int ret;
>
> trace_v3d_submit_csd_ioctl(&v3d->drm, args->cfg[5], args->cfg[6]);
> @@ -957,7 +954,7 @@ v3d_submit_csd_ioctl(struct drm_device *dev, void *data,
> if (ret)
> goto fail;
>
> - ret = v3d_lock_bo_reservations(clean_job, &acquire_ctx);
> + ret = v3d_lock_bo_reservations(clean_job, &exec);
> if (ret)
> goto fail;
>
> @@ -983,7 +980,7 @@ v3d_submit_csd_ioctl(struct drm_device *dev, void *data,
>
> v3d_attach_fences_and_unlock_reservation(file_priv,
> clean_job,
> - &acquire_ctx,
> + &exec,
> args->out_sync,
> &se,
> clean_job->done_fence);
> @@ -996,8 +993,7 @@ v3d_submit_csd_ioctl(struct drm_device *dev, void *data,
> fail_unreserve:
> mutex_unlock(&v3d->sched_lock);
> fail_perfmon:
> - drm_gem_unlock_reservations(clean_job->bo, clean_job->bo_count,
> - &acquire_ctx);
> + drm_exec_fini(&exec);
> fail:
> v3d_job_cleanup((void *)job);
> v3d_job_cleanup(clean_job);
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2023-07-17 19:32 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-07-12 12:46 Switching more drivers to use drm_exec Christian König
2023-07-12 12:46 ` [PATCH 1/7] drm/radeon: switch over to drm_exec Christian König
2023-07-12 12:46 ` [PATCH 2/7] drm/qxl: switch to using drm_exec Christian König
2023-07-12 12:47 ` [PATCH 3/7] drm/lima: " Christian König
2023-07-12 12:47 ` [PATCH 4/7] drm/virtgpu: " Christian König
2023-07-12 12:47 ` [PATCH 5/7] drm/panfrost: " Christian König
2023-07-12 15:31 ` Steven Price
2023-07-12 12:47 ` [PATCH 6/7] drm/v3d: " Christian König
2023-07-17 19:32 ` Maira Canal
2023-07-12 12:47 ` [PATCH 7/7] drm: remove drm_gem_(un)lock_reservations Christian König
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).