Skip to content

Commit 064d491

Browse files
committed
Merge tag 'drm-misc-fixes-2022-08-25' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes
Short summary of fixes pull: * gem: Fixes handle release leak * nouveau: Fix fencing when moving BO * vc4: HDMI fixes * Backmerging for v6.0-rc1 Signed-off-by: Dave Airlie <[email protected]> From: Thomas Zimmermann <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/YwclSWheC+Ai+u+v@linux-uq9g
2 parents 1c23f9e + 6b04ce9 commit 064d491

File tree

6 files changed

+33
-35
lines changed

6 files changed

+33
-35
lines changed

drivers/gpu/drm/drm_gem.c

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -168,21 +168,6 @@ void drm_gem_private_object_init(struct drm_device *dev,
168168
}
169169
EXPORT_SYMBOL(drm_gem_private_object_init);
170170

171-
static void
172-
drm_gem_remove_prime_handles(struct drm_gem_object *obj, struct drm_file *filp)
173-
{
174-
/*
175-
* Note: obj->dma_buf can't disappear as long as we still hold a
176-
* handle reference in obj->handle_count.
177-
*/
178-
mutex_lock(&filp->prime.lock);
179-
if (obj->dma_buf) {
180-
drm_prime_remove_buf_handle_locked(&filp->prime,
181-
obj->dma_buf);
182-
}
183-
mutex_unlock(&filp->prime.lock);
184-
}
185-
186171
/**
187172
* drm_gem_object_handle_free - release resources bound to userspace handles
188173
* @obj: GEM object to clean up.
@@ -253,7 +238,7 @@ drm_gem_object_release_handle(int id, void *ptr, void *data)
253238
if (obj->funcs->close)
254239
obj->funcs->close(obj, file_priv);
255240

256-
drm_gem_remove_prime_handles(obj, file_priv);
241+
drm_prime_remove_buf_handle(&file_priv->prime, id);
257242
drm_vma_node_revoke(&obj->vma_node, file_priv);
258243

259244
drm_gem_object_handle_put_unlocked(obj);

drivers/gpu/drm/drm_internal.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ int drm_prime_fd_to_handle_ioctl(struct drm_device *dev, void *data,
7474

7575
void drm_prime_init_file_private(struct drm_prime_file_private *prime_fpriv);
7676
void drm_prime_destroy_file_private(struct drm_prime_file_private *prime_fpriv);
77-
void drm_prime_remove_buf_handle_locked(struct drm_prime_file_private *prime_fpriv,
78-
struct dma_buf *dma_buf);
77+
void drm_prime_remove_buf_handle(struct drm_prime_file_private *prime_fpriv,
78+
uint32_t handle);
7979

8080
/* drm_drv.c */
8181
struct drm_minor *drm_minor_acquire(unsigned int minor_id);

drivers/gpu/drm/drm_prime.c

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -190,29 +190,33 @@ static int drm_prime_lookup_buf_handle(struct drm_prime_file_private *prime_fpri
190190
return -ENOENT;
191191
}
192192

193-
void drm_prime_remove_buf_handle_locked(struct drm_prime_file_private *prime_fpriv,
194-
struct dma_buf *dma_buf)
193+
void drm_prime_remove_buf_handle(struct drm_prime_file_private *prime_fpriv,
194+
uint32_t handle)
195195
{
196196
struct rb_node *rb;
197197

198-
rb = prime_fpriv->dmabufs.rb_node;
198+
mutex_lock(&prime_fpriv->lock);
199+
200+
rb = prime_fpriv->handles.rb_node;
199201
while (rb) {
200202
struct drm_prime_member *member;
201203

202-
member = rb_entry(rb, struct drm_prime_member, dmabuf_rb);
203-
if (member->dma_buf == dma_buf) {
204+
member = rb_entry(rb, struct drm_prime_member, handle_rb);
205+
if (member->handle == handle) {
204206
rb_erase(&member->handle_rb, &prime_fpriv->handles);
205207
rb_erase(&member->dmabuf_rb, &prime_fpriv->dmabufs);
206208

207-
dma_buf_put(dma_buf);
209+
dma_buf_put(member->dma_buf);
208210
kfree(member);
209-
return;
210-
} else if (member->dma_buf < dma_buf) {
211+
break;
212+
} else if (member->handle < handle) {
211213
rb = rb->rb_right;
212214
} else {
213215
rb = rb->rb_left;
214216
}
215217
}
218+
219+
mutex_unlock(&prime_fpriv->lock);
216220
}
217221

218222
void drm_prime_init_file_private(struct drm_prime_file_private *prime_fpriv)

drivers/gpu/drm/nouveau/nouveau_bo.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -820,6 +820,15 @@ nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int evict,
820820
if (ret == 0) {
821821
ret = nouveau_fence_new(chan, false, &fence);
822822
if (ret == 0) {
823+
/* TODO: figure out a better solution here
824+
*
825+
* wait on the fence here explicitly as going through
826+
* ttm_bo_move_accel_cleanup somehow doesn't seem to do it.
827+
*
828+
* Without this the operation can timeout and we'll fallback to a
829+
* software copy, which might take several minutes to finish.
830+
*/
831+
nouveau_fence_wait(fence, false, false);
823832
ret = ttm_bo_move_accel_cleanup(bo,
824833
&fence->base,
825834
evict, false,

drivers/gpu/drm/vc4/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ config DRM_VC4
88
depends on DRM
99
depends on SND && SND_SOC
1010
depends on COMMON_CLK
11+
depends on PM
1112
select DRM_DISPLAY_HDMI_HELPER
1213
select DRM_DISPLAY_HELPER
1314
select DRM_KMS_HELPER

drivers/gpu/drm/vc4/vc4_hdmi.c

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2855,7 +2855,7 @@ static int vc5_hdmi_init_resources(struct vc4_hdmi *vc4_hdmi)
28552855
return 0;
28562856
}
28572857

2858-
static int __maybe_unused vc4_hdmi_runtime_suspend(struct device *dev)
2858+
static int vc4_hdmi_runtime_suspend(struct device *dev)
28592859
{
28602860
struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev);
28612861

@@ -2972,17 +2972,15 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data)
29722972
vc4_hdmi->disable_4kp60 = true;
29732973
}
29742974

2975+
pm_runtime_enable(dev);
2976+
29752977
/*
2976-
* We need to have the device powered up at this point to call
2977-
* our reset hook and for the CEC init.
2978+
* We need to have the device powered up at this point to call
2979+
* our reset hook and for the CEC init.
29782980
*/
2979-
ret = vc4_hdmi_runtime_resume(dev);
2981+
ret = pm_runtime_resume_and_get(dev);
29802982
if (ret)
2981-
goto err_put_ddc;
2982-
2983-
pm_runtime_get_noresume(dev);
2984-
pm_runtime_set_active(dev);
2985-
pm_runtime_enable(dev);
2983+
goto err_disable_runtime_pm;
29862984

29872985
if ((of_device_is_compatible(dev->of_node, "brcm,bcm2711-hdmi0") ||
29882986
of_device_is_compatible(dev->of_node, "brcm,bcm2711-hdmi1")) &&
@@ -3028,6 +3026,7 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data)
30283026
err_destroy_encoder:
30293027
drm_encoder_cleanup(encoder);
30303028
pm_runtime_put_sync(dev);
3029+
err_disable_runtime_pm:
30313030
pm_runtime_disable(dev);
30323031
err_put_ddc:
30333032
put_device(&vc4_hdmi->ddc->dev);

0 commit comments

Comments
 (0)