Skip to content

Commit bcd9d56

Browse files
committed
Merge tag 'drm-misc-fixes-2023-03-16' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes
Short summary of fixes pull: * fix info leak in edid * build fix for accel/ * ref-counting fix for fbdev deferred I/O * driver fixes Signed-off-by: Dave Airlie <[email protected]> From: Thomas Zimmermann <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/20230316143347.GA9246@linux-uq9g
2 parents eeac8ed + 4028cbf commit bcd9d56

File tree

16 files changed

+65
-28
lines changed

16 files changed

+65
-28
lines changed

drivers/accel/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
# SPDX-License-Identifier: GPL-2.0-only
22

3-
obj-y += habanalabs/
4-
obj-y += ivpu/
3+
obj-$(CONFIG_DRM_ACCEL_HABANALABS) += habanalabs/
4+
obj-$(CONFIG_DRM_ACCEL_IVPU) += ivpu/

drivers/gpu/drm/drm_edid.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2796,7 +2796,7 @@ u32 drm_edid_get_panel_id(struct i2c_adapter *adapter)
27962796
* the EDID then we'll just return 0.
27972797
*/
27982798

2799-
base_block = kmalloc(EDID_LENGTH, GFP_KERNEL);
2799+
base_block = kzalloc(EDID_LENGTH, GFP_KERNEL);
28002800
if (!base_block)
28012801
return 0;
28022802

drivers/gpu/drm/drm_gem.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1388,10 +1388,13 @@ EXPORT_SYMBOL(drm_gem_lru_move_tail);
13881388
*
13891389
* @lru: The LRU to scan
13901390
* @nr_to_scan: The number of pages to try to reclaim
1391+
* @remaining: The number of pages left to reclaim, should be initialized by caller
13911392
* @shrink: Callback to try to shrink/reclaim the object.
13921393
*/
13931394
unsigned long
1394-
drm_gem_lru_scan(struct drm_gem_lru *lru, unsigned nr_to_scan,
1395+
drm_gem_lru_scan(struct drm_gem_lru *lru,
1396+
unsigned int nr_to_scan,
1397+
unsigned long *remaining,
13951398
bool (*shrink)(struct drm_gem_object *obj))
13961399
{
13971400
struct drm_gem_lru still_in_lru;
@@ -1430,8 +1433,10 @@ drm_gem_lru_scan(struct drm_gem_lru *lru, unsigned nr_to_scan,
14301433
* hit shrinker in response to trying to get backing pages
14311434
* for this obj (ie. while it's lock is already held)
14321435
*/
1433-
if (!dma_resv_trylock(obj->resv))
1436+
if (!dma_resv_trylock(obj->resv)) {
1437+
*remaining += obj->size >> PAGE_SHIFT;
14341438
goto tail;
1439+
}
14351440

14361441
if (shrink(obj)) {
14371442
freed += obj->size >> PAGE_SHIFT;

drivers/gpu/drm/drm_gem_shmem_helper.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -619,11 +619,14 @@ int drm_gem_shmem_mmap(struct drm_gem_shmem_object *shmem, struct vm_area_struct
619619
int ret;
620620

621621
if (obj->import_attach) {
622-
/* Drop the reference drm_gem_mmap_obj() acquired.*/
623-
drm_gem_object_put(obj);
624622
vma->vm_private_data = NULL;
623+
ret = dma_buf_mmap(obj->dma_buf, vma, 0);
624+
625+
/* Drop the reference drm_gem_mmap_obj() acquired.*/
626+
if (!ret)
627+
drm_gem_object_put(obj);
625628

626-
return dma_buf_mmap(obj->dma_buf, vma, 0);
629+
return ret;
627630
}
628631

629632
ret = drm_gem_shmem_get_pages(shmem);

drivers/gpu/drm/meson/meson_dw_hdmi.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -718,7 +718,7 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
718718
dw_plat_data = &meson_dw_hdmi->dw_plat_data;
719719

720720
ret = devm_regulator_get_enable_optional(dev, "hdmi");
721-
if (ret < 0)
721+
if (ret < 0 && ret != -ENODEV)
722722
return ret;
723723

724724
meson_dw_hdmi->hdmitx_apb = devm_reset_control_get_exclusive(dev,

drivers/gpu/drm/meson/meson_vpp.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ void meson_vpp_init(struct meson_drm *priv)
100100
priv->io_base + _REG(VPP_DOLBY_CTRL));
101101
writel_relaxed(0x1020080,
102102
priv->io_base + _REG(VPP_DUMMY_DATA1));
103+
writel_relaxed(0x42020,
104+
priv->io_base + _REG(VPP_DUMMY_DATA));
103105
} else if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_G12A))
104106
writel_relaxed(0xf, priv->io_base + _REG(DOLBY_PATH_CTRL));
105107

drivers/gpu/drm/msm/msm_gem_shrinker.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ msm_gem_shrinker_scan(struct shrinker *shrinker, struct shrink_control *sc)
107107
bool (*shrink)(struct drm_gem_object *obj);
108108
bool cond;
109109
unsigned long freed;
110+
unsigned long remaining;
110111
} stages[] = {
111112
/* Stages of progressively more aggressive/expensive reclaim: */
112113
{ &priv->lru.dontneed, purge, true },
@@ -116,14 +117,18 @@ msm_gem_shrinker_scan(struct shrinker *shrinker, struct shrink_control *sc)
116117
};
117118
long nr = sc->nr_to_scan;
118119
unsigned long freed = 0;
120+
unsigned long remaining = 0;
119121

120122
for (unsigned i = 0; (nr > 0) && (i < ARRAY_SIZE(stages)); i++) {
121123
if (!stages[i].cond)
122124
continue;
123125
stages[i].freed =
124-
drm_gem_lru_scan(stages[i].lru, nr, stages[i].shrink);
126+
drm_gem_lru_scan(stages[i].lru, nr,
127+
&stages[i].remaining,
128+
stages[i].shrink);
125129
nr -= stages[i].freed;
126130
freed += stages[i].freed;
131+
remaining += stages[i].remaining;
127132
}
128133

129134
if (freed) {
@@ -132,7 +137,7 @@ msm_gem_shrinker_scan(struct shrinker *shrinker, struct shrink_control *sc)
132137
stages[3].freed);
133138
}
134139

135-
return (freed > 0) ? freed : SHRINK_STOP;
140+
return (freed > 0 && remaining > 0) ? freed : SHRINK_STOP;
136141
}
137142

138143
#ifdef CONFIG_DEBUG_FS
@@ -182,10 +187,12 @@ msm_gem_shrinker_vmap(struct notifier_block *nb, unsigned long event, void *ptr)
182187
NULL,
183188
};
184189
unsigned idx, unmapped = 0;
190+
unsigned long remaining = 0;
185191

186192
for (idx = 0; lrus[idx] && unmapped < vmap_shrink_limit; idx++) {
187193
unmapped += drm_gem_lru_scan(lrus[idx],
188194
vmap_shrink_limit - unmapped,
195+
&remaining,
189196
vmap_shrink);
190197
}
191198

drivers/gpu/drm/panfrost/panfrost_mmu.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ static void panfrost_mmu_flush_range(struct panfrost_device *pfdev,
282282
if (pm_runtime_active(pfdev->dev))
283283
mmu_hw_do_operation(pfdev, mmu, iova, size, AS_COMMAND_FLUSH_PT);
284284

285-
pm_runtime_put_sync_autosuspend(pfdev->dev);
285+
pm_runtime_put_autosuspend(pfdev->dev);
286286
}
287287

288288
static int mmu_map_sg(struct panfrost_device *pfdev, struct panfrost_mmu *mmu,

drivers/gpu/drm/sun4i/sun4i_drv.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,12 +95,12 @@ static int sun4i_drv_bind(struct device *dev)
9595
/* drm_vblank_init calls kcalloc, which can fail */
9696
ret = drm_vblank_init(drm, drm->mode_config.num_crtc);
9797
if (ret)
98-
goto cleanup_mode_config;
98+
goto unbind_all;
9999

100100
/* Remove early framebuffers (ie. simplefb) */
101101
ret = drm_aperture_remove_framebuffers(false, &sun4i_drv_driver);
102102
if (ret)
103-
goto cleanup_mode_config;
103+
goto unbind_all;
104104

105105
sun4i_framebuffer_init(drm);
106106

@@ -119,6 +119,8 @@ static int sun4i_drv_bind(struct device *dev)
119119

120120
finish_poll:
121121
drm_kms_helper_poll_fini(drm);
122+
unbind_all:
123+
component_unbind_all(dev, NULL);
122124
cleanup_mode_config:
123125
drm_mode_config_cleanup(drm);
124126
of_reserved_mem_device_release(dev);

drivers/gpu/drm/ttm/ttm_device.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ int ttm_device_swapout(struct ttm_device *bdev, struct ttm_operation_ctx *ctx,
158158
struct ttm_buffer_object *bo = res->bo;
159159
uint32_t num_pages;
160160

161-
if (!bo)
161+
if (!bo || bo->resource != res)
162162
continue;
163163

164164
num_pages = PFN_UP(bo->base.size);

0 commit comments

Comments
 (0)