Skip to content

Commit 4c6a231

Browse files
Michel Dänzeralexdeucher
authored andcommitted
drm/amdgpu: Call drm_framebuffer_init last for framebuffer init
Once drm_framebuffer_init has returned 0, the framebuffer is hooked up to the reference counting machinery and can no longer be destroyed with a simple kfree. Therefore, it must be called last. If drm_framebuffer_init returns 0 but its caller then returns non-0, there will likely be memory corruption fireworks down the road. The following lead me to this fix: [ 12.891228] kernel BUG at lib/list_debug.c:25! [...] [ 12.891263] RIP: 0010:__list_add_valid+0x4b/0x70 [...] [ 12.891324] Call Trace: [ 12.891330] drm_framebuffer_init+0xb5/0x100 [drm] [ 12.891378] amdgpu_display_gem_fb_verify_and_init+0x47/0x120 [amdgpu] [ 12.891592] ? amdgpu_display_user_framebuffer_create+0x10d/0x1f0 [amdgpu] [ 12.891794] amdgpu_display_user_framebuffer_create+0x126/0x1f0 [amdgpu] [ 12.891995] drm_internal_framebuffer_create+0x378/0x3f0 [drm] [ 12.892036] ? drm_internal_framebuffer_create+0x3f0/0x3f0 [drm] [ 12.892075] drm_mode_addfb2+0x34/0xd0 [drm] [ 12.892115] ? drm_internal_framebuffer_create+0x3f0/0x3f0 [drm] [ 12.892153] drm_ioctl_kernel+0xe2/0x150 [drm] [ 12.892193] drm_ioctl+0x3da/0x460 [drm] [ 12.892232] ? drm_internal_framebuffer_create+0x3f0/0x3f0 [drm] [ 12.892274] amdgpu_drm_ioctl+0x43/0x80 [amdgpu] [ 12.892475] __se_sys_ioctl+0x72/0xc0 [ 12.892483] do_syscall_64+0x33/0x40 [ 12.892491] entry_SYSCALL_64_after_hwframe+0x44/0xae Fixes: f258907 "drm/amdgpu: Verify bo size can fit framebuffer size on init." Signed-off-by: Michel Dänzer <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent 13311e7 commit 4c6a231

File tree

1 file changed

+7
-5
lines changed

1 file changed

+7
-5
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_display.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1047,11 +1047,12 @@ int amdgpu_display_gem_fb_init(struct drm_device *dev,
10471047

10481048
rfb->base.obj[0] = obj;
10491049
drm_helper_mode_fill_fb_struct(dev, &rfb->base, mode_cmd);
1050-
ret = drm_framebuffer_init(dev, &rfb->base, &amdgpu_fb_funcs);
1050+
1051+
ret = amdgpu_display_framebuffer_init(dev, rfb, mode_cmd, obj);
10511052
if (ret)
10521053
goto err;
10531054

1054-
ret = amdgpu_display_framebuffer_init(dev, rfb, mode_cmd, obj);
1055+
ret = drm_framebuffer_init(dev, &rfb->base, &amdgpu_fb_funcs);
10551056
if (ret)
10561057
goto err;
10571058

@@ -1071,9 +1072,6 @@ int amdgpu_display_gem_fb_verify_and_init(
10711072

10721073
rfb->base.obj[0] = obj;
10731074
drm_helper_mode_fill_fb_struct(dev, &rfb->base, mode_cmd);
1074-
ret = drm_framebuffer_init(dev, &rfb->base, &amdgpu_fb_funcs);
1075-
if (ret)
1076-
goto err;
10771075
/* Verify that the modifier is supported. */
10781076
if (!drm_any_plane_has_format(dev, mode_cmd->pixel_format,
10791077
mode_cmd->modifier[0])) {
@@ -1092,6 +1090,10 @@ int amdgpu_display_gem_fb_verify_and_init(
10921090
if (ret)
10931091
goto err;
10941092

1093+
ret = drm_framebuffer_init(dev, &rfb->base, &amdgpu_fb_funcs);
1094+
if (ret)
1095+
goto err;
1096+
10951097
return 0;
10961098
err:
10971099
drm_dbg_kms(dev, "Failed to verify and init gem fb: %d\n", ret);

0 commit comments

Comments
 (0)