From: Greg Kroah-Hartman Date: Wed, 12 May 2021 09:43:48 +0000 (+0200) Subject: 5.11-stable patches X-Git-Tag: v5.4.119~71 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6003f373ebc69f8c2726b78a404d1e08ad37f67d;p=thirdparty%2Fkernel%2Fstable-queue.git 5.11-stable patches added patches: drm-qxl-use-ttm-bo-priorities.patch --- diff --git a/queue-5.11/drm-qxl-use-ttm-bo-priorities.patch b/queue-5.11/drm-qxl-use-ttm-bo-priorities.patch new file mode 100644 index 00000000000..9e89213e6b3 --- /dev/null +++ b/queue-5.11/drm-qxl-use-ttm-bo-priorities.patch @@ -0,0 +1,143 @@ +From 4fff19ae427548d8c37260c975a4b20d3c040ec6 Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Wed, 17 Feb 2021 13:32:05 +0100 +Subject: drm/qxl: use ttm bo priorities + +From: Gerd Hoffmann + +commit 4fff19ae427548d8c37260c975a4b20d3c040ec6 upstream. + +Allow to set priorities for buffer objects. Use priority 1 for surface +and cursor command releases. Use priority 0 for drawing command +releases. That way the short-living drawing commands are first in line +when it comes to eviction, making it *much* less likely that +ttm_bo_mem_force_space() picks something which can't be evicted and +throws an error after waiting a while without success. + +Signed-off-by: Gerd Hoffmann +Acked-by: Thomas Zimmermann +Link: http://patchwork.freedesktop.org/patch/msgid/20210217123213.2199186-4-kraxel@redhat.com +Signed-off-by: Greg Kroah-Hartman +--- + drivers/gpu/drm/qxl/qxl_cmd.c | 2 +- + drivers/gpu/drm/qxl/qxl_display.c | 4 ++-- + drivers/gpu/drm/qxl/qxl_gem.c | 2 +- + drivers/gpu/drm/qxl/qxl_object.c | 5 +++-- + drivers/gpu/drm/qxl/qxl_object.h | 1 + + drivers/gpu/drm/qxl/qxl_release.c | 18 ++++++++++++------ + 6 files changed, 20 insertions(+), 12 deletions(-) + +--- a/drivers/gpu/drm/qxl/qxl_cmd.c ++++ b/drivers/gpu/drm/qxl/qxl_cmd.c +@@ -268,7 +268,7 @@ int qxl_alloc_bo_reserved(struct qxl_dev + int ret; + + ret = qxl_bo_create(qdev, size, false /* not kernel - device */, +- false, QXL_GEM_DOMAIN_VRAM, NULL, &bo); ++ false, QXL_GEM_DOMAIN_VRAM, 0, NULL, &bo); + if (ret) { + DRM_ERROR("failed to allocate VRAM BO\n"); + return ret; +--- a/drivers/gpu/drm/qxl/qxl_display.c ++++ b/drivers/gpu/drm/qxl/qxl_display.c +@@ -798,8 +798,8 @@ static int qxl_plane_prepare_fb(struct d + qdev->dumb_shadow_bo = NULL; + } + qxl_bo_create(qdev, surf.height * surf.stride, +- true, true, QXL_GEM_DOMAIN_SURFACE, &surf, +- &qdev->dumb_shadow_bo); ++ true, true, QXL_GEM_DOMAIN_SURFACE, 0, ++ &surf, &qdev->dumb_shadow_bo); + } + if (user_bo->shadow != qdev->dumb_shadow_bo) { + if (user_bo->shadow) { +--- a/drivers/gpu/drm/qxl/qxl_gem.c ++++ b/drivers/gpu/drm/qxl/qxl_gem.c +@@ -55,7 +55,7 @@ int qxl_gem_object_create(struct qxl_dev + /* At least align on page size */ + if (alignment < PAGE_SIZE) + alignment = PAGE_SIZE; +- r = qxl_bo_create(qdev, size, kernel, false, initial_domain, surf, &qbo); ++ r = qxl_bo_create(qdev, size, kernel, false, initial_domain, 0, surf, &qbo); + if (r) { + if (r != -ERESTARTSYS) + DRM_ERROR( +--- a/drivers/gpu/drm/qxl/qxl_object.c ++++ b/drivers/gpu/drm/qxl/qxl_object.c +@@ -103,8 +103,8 @@ static const struct drm_gem_object_funcs + .print_info = drm_gem_ttm_print_info, + }; + +-int qxl_bo_create(struct qxl_device *qdev, +- unsigned long size, bool kernel, bool pinned, u32 domain, ++int qxl_bo_create(struct qxl_device *qdev, unsigned long size, ++ bool kernel, bool pinned, u32 domain, u32 priority, + struct qxl_surface *surf, + struct qxl_bo **bo_ptr) + { +@@ -137,6 +137,7 @@ int qxl_bo_create(struct qxl_device *qde + + qxl_ttm_placement_from_domain(bo, domain); + ++ bo->tbo.priority = priority; + r = ttm_bo_init_reserved(&qdev->mman.bdev, &bo->tbo, size, type, + &bo->placement, 0, &ctx, size, + NULL, NULL, &qxl_ttm_bo_destroy); +--- a/drivers/gpu/drm/qxl/qxl_object.h ++++ b/drivers/gpu/drm/qxl/qxl_object.h +@@ -61,6 +61,7 @@ static inline u64 qxl_bo_mmap_offset(str + extern int qxl_bo_create(struct qxl_device *qdev, + unsigned long size, + bool kernel, bool pinned, u32 domain, ++ u32 priority, + struct qxl_surface *surf, + struct qxl_bo **bo_ptr); + extern int qxl_bo_kmap(struct qxl_bo *bo, struct dma_buf_map *map); +--- a/drivers/gpu/drm/qxl/qxl_release.c ++++ b/drivers/gpu/drm/qxl/qxl_release.c +@@ -199,11 +199,12 @@ qxl_release_free(struct qxl_device *qdev + } + + static int qxl_release_bo_alloc(struct qxl_device *qdev, +- struct qxl_bo **bo) ++ struct qxl_bo **bo, ++ u32 priority) + { + /* pin releases bo's they are too messy to evict */ + return qxl_bo_create(qdev, PAGE_SIZE, false, true, +- QXL_GEM_DOMAIN_VRAM, NULL, bo); ++ QXL_GEM_DOMAIN_VRAM, priority, NULL, bo); + } + + int qxl_release_list_add(struct qxl_release *release, struct qxl_bo *bo) +@@ -326,13 +327,18 @@ int qxl_alloc_release_reserved(struct qx + int ret = 0; + union qxl_release_info *info; + int cur_idx; ++ u32 priority; + +- if (type == QXL_RELEASE_DRAWABLE) ++ if (type == QXL_RELEASE_DRAWABLE) { + cur_idx = 0; +- else if (type == QXL_RELEASE_SURFACE_CMD) ++ priority = 0; ++ } else if (type == QXL_RELEASE_SURFACE_CMD) { + cur_idx = 1; +- else if (type == QXL_RELEASE_CURSOR_CMD) ++ priority = 1; ++ } else if (type == QXL_RELEASE_CURSOR_CMD) { + cur_idx = 2; ++ priority = 1; ++ } + else { + DRM_ERROR("got illegal type: %d\n", type); + return -EINVAL; +@@ -352,7 +358,7 @@ int qxl_alloc_release_reserved(struct qx + qdev->current_release_bo[cur_idx] = NULL; + } + if (!qdev->current_release_bo[cur_idx]) { +- ret = qxl_release_bo_alloc(qdev, &qdev->current_release_bo[cur_idx]); ++ ret = qxl_release_bo_alloc(qdev, &qdev->current_release_bo[cur_idx], priority); + if (ret) { + mutex_unlock(&qdev->release_mutex); + qxl_release_free(qdev, *release); diff --git a/queue-5.11/series b/queue-5.11/series index f61cde86eb6..df3f013df58 100644 --- a/queue-5.11/series +++ b/queue-5.11/series @@ -59,3 +59,4 @@ cfg80211-scan-drop-entry-from-hidden_list-on-overflow.patch rtw88-fix-array-overrun-in-rtw_get_tx_power_params.patch mt76-fix-potential-dma-mapping-leak.patch fddi-defxx-make-mmio-the-configuration-default-except-for-eisa.patch +drm-qxl-use-ttm-bo-priorities.patch