• Thomas Zimmermann's avatar
    drm/atomic-helpers: Invoke end_fb_access while owning plane state · e0f04e41
    Thomas Zimmermann authored
    Invoke drm_plane_helper_funcs.end_fb_access before
    drm_atomic_helper_commit_hw_done(). The latter function hands over
    ownership of the plane state to the following commit, which might
    free it. Releasing resources in end_fb_access then operates on undefined
    state. This bug has been observed with non-blocking commits when they
    are being queued up quickly.
    
    Here is an example stack trace from the bug report. The plane state has
    been free'd already, so the pages for drm_gem_fb_vunmap() are gone.
    
    Unable to handle kernel paging request at virtual address 0000000100000049
    [...]
     drm_gem_fb_vunmap+0x18/0x74
     drm_gem_end_shadow_fb_access+0x1c/0x2c
     drm_atomic_helper_cleanup_planes+0x58/0xd8
     drm_atomic_helper_commit_tail+0x90/0xa0
     commit_tail+0x15c/0x188
     commit_work+0x14/0x20
    
    Fix this by running end_fb_access immediately after updating all planes
    in drm_atomic_helper_commit_planes(). The existing clean-up helper
    drm_atomic_helper_cleanup_planes() now only handles cleanup_fb.
    
    For aborted commits, roll back from drm_atomic_helper_prepare_planes()
    in the new helper drm_atomic_helper_unprepare_planes(). This case is
    different from regular cleanup, as we have to release the new state;
    regular cleanup releases the old state. The new helper also invokes
    cleanup_fb for all planes.
    
    The changes mostly involve DRM's atomic helpers. Only two drivers, i915
    and nouveau, implement their own commit function. Update them to invoke
    drm_atomic_helper_unprepare_planes(). Drivers with custom commit_tail
    function do not require changes.
    
    v4:
    	* fix documentation (kernel test robot)
    v3:
    	* add drm_atomic_helper_unprepare_planes() for rolling back
    	* use correct state for end_fb_access
    v2:
    	* fix test in drm_atomic_helper_cleanup_planes()
    Reported-by: default avatarAlyssa Ross <hi@alyssa.is>
    Closes: https://lore.kernel.org/dri-devel/87leazm0ya.fsf@alyssa.is/Suggested-by: default avatarDaniel Vetter <daniel@ffwll.ch>
    Fixes: 94d879ea ("drm/atomic-helper: Add {begin,end}_fb_access to plane helpers")
    Tested-by: default avatarAlyssa Ross <hi@alyssa.is>
    Reviewed-by: default avatarAlyssa Ross <hi@alyssa.is>
    Signed-off-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
    Cc: <stable@vger.kernel.org> # v6.2+
    Link: https://patchwork.freedesktop.org/patch/msgid/20231204083247.22006-1-tzimmermann@suse.de
    e0f04e41
drm_atomic_helper.h 10.8 KB