Possible fb ref count issue with drm_plane_force_disable()
Tomi Valkeinen
tomi.valkeinen at ti.com
Tue Apr 15 02:16:52 PDT 2014
On 14/04/14 11:43, Tomi Valkeinen wrote:
> On 11/04/14 14:50, Ville Syrjälä wrote:
>
>>> So the explicit unref done by drm_plane_force_disable() seems a bit out
>>> of place. I can't figure out which drm_framebuffer_reference() would be
>>> the matching one for the unref done by drm_plane_force_disable().
>>>
>>> Any ideas what ref is that? Or is the __drm_framebuffer_unreference()
>>> extra in drm_plane_force_disable()?
>>
>> That's the reference that was taken by the drm_mode_setplane() when it
>> succesfully called the .update_plane() hook.
>
> But drm_mode_setplane() is called via DRM_IOCTL_MODE_SETPLANE, which is
> only used for "proper" planes, not for crtc primary planes, right?
>
> At least I don't see drm_mode_setplane() in my stack traces, and git
> grep doesn't show it called via any other means than ioctl.
>
> I am not using any planes from my app, just the crtc and (indirectly)
> its primary plane.
So here's a summary of the fb refs and unrefs. It still seems to me that the
drm_plane_force_disable does an extra unref. Either that, or omapdrm is missing
something that takes the matching reference.
A line like this in the summary below:
2) ref36/3 drm_mode_setcrtc / drm_framebuffer_lookup
Means that "2" is the number I assigned to that ref, and there's a matching
unref with 2) prefix later. ref36/2 means that FB ID 36 was referenced, and ref
count is 3. And the rest of the line shows rough idea of the stack trace where
the ref/unref happens.
# DRM_IOCTL_MODE_ADDFB 2
0) kref_init
1) ref36/2 drm_mode_addfb2
# DRM_IOCTL_MODE_SETCRTC
2) ref36/3 drm_mode_setcrtc / drm_framebuffer_lookup
3) ref36/4 drm_mode_setcrtc / drm_mode_set_config_internal
2) unref36/3 drm_mode_setcrtc
# pin new fb
4) ref36/4 apply_worker / omap_plane_pre_apply
# BREAK
# RELEASE
1) unref36/3 drm_release / drm_fb_release / __drm_framebuffer_unregister
3) unref36/2 drm_release / drm_fb_release / drm_framebuffer_remove / drm_mode_set_config_internal
?) unref36/1 drm_release / drm_fb_release / drm_framebuffer_remove / drm_plane_force_disable
0) unref36/0 drm_release / drm_fb_release / drm_framebuffer_remove
# unpin old fb
4) unref36/-1 flip_worker / unpin_worker / drm_framebuffer_unreference
All the other unrefs I can explain, except the drm_plane_force_disable() one.
Tomi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: OpenPGP digital signature
URL: <http://lists.freedesktop.org/archives/dri-devel/attachments/20140415/1db17cda/attachment-0001.sig>
More information about the dri-devel
mailing list