* Re: [PATCH] drm/amd/display: Fix reference counting for struct dc_sink. [not found] ` <20190210101301.5940-1-Mathias.Froehlich-hi6Y0CQ0nG0@public.gmane.org> @ 2019-02-13 20:38 ` Alex Deucher via amd-gfx [not found] ` <CADnq5_OvyMPZ-QogBbCWLBA=Ez39tt5hb1Hh2jNJt0Rw+MkuCw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 0 siblings, 1 reply; 5+ messages in thread From: Alex Deucher via amd-gfx @ 2019-02-13 20:38 UTC (permalink / raw) To: Mathias Fröhlich, amd-gfx list, Wentland, Harry, Kazlauskas, Nicholas Cc: Deucher, Alexander, Mathias Fröhlich, Daenzer, Michel, Christian Koenig, Maling list - DRI developers Add amd-gfx and some DC people. Alex On Sun, Feb 10, 2019 at 5:13 AM <Mathias.Froehlich@gmx.net> wrote: > > From: Mathias Fröhlich <Mathias.Froehlich@gmx.net> > > Reference counting in amdgpu_dm_connector for amdgpu_dm_connector::dc_sink > and amdgpu_dm_connector::dc_em_sink as well as in dc_link::local_sink seems > to be out of shape. Thus make reference counting consistent for these > members and just plain increment the reference count when the variable > gets assigned and decrement when the pointer is set to zero or replaced. > Also simplify reference counting in selected function sopes to be sure the > reference is released in any case. In some cases add NULL pointer check > before dereferencing. > At a hand full of places a comment is placed to stat that the reference > increment happened already somewhere else. > > This actually fixes the following kernel bug on my system when enabling > display core in amdgpu. There are some more similar bug reports around, > so it probably helps at more places. > > kernel BUG at mm/slub.c:294! > invalid opcode: 0000 [#1] SMP PTI > CPU: 9 PID: 1180 Comm: Xorg Not tainted 5.0.0-rc1+ #2 > Hardware name: Supermicro X10DAi/X10DAI, BIOS 3.0a 02/05/2018 > RIP: 0010:__slab_free+0x1e2/0x3d0 > Code: 8b 54 24 30 48 89 4c 24 28 e8 da fb ff ff 4c 8b 54 24 28 85 c0 0f 85 67 fe ff ff 48 8d 65 d8 5b 41 5c 41 5d 41 5e 41 5f 5d c3 <0f> 0b 49 3b 5c 24 28 75 ab 48 8b 44 24 30 49 89 4c 24 28 49 89 44 > RSP: 0018:ffffb0978589fa90 EFLAGS: 00010246 > RAX: ffff92f12806c400 RBX: 0000000080200019 RCX: ffff92f12806c400 > RDX: ffff92f12806c400 RSI: ffffdd6421a01a00 RDI: ffff92ed2f406e80 > RBP: ffffb0978589fb40 R08: 0000000000000001 R09: ffffffffc0ee4748 > R10: ffff92f12806c400 R11: 0000000000000001 R12: ffffdd6421a01a00 > R13: ffff92f12806c400 R14: ffff92ed2f406e80 R15: ffffdd6421a01a20 > FS: 00007f4170be0ac0(0000) GS:ffff92ed2fb40000(0000) knlGS:0000000000000000 > CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 > CR2: 0000562818aaa000 CR3: 000000045745a002 CR4: 00000000003606e0 > DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 > DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 > Call Trace: > ? drm_dbg+0x87/0x90 [drm] > dc_stream_release+0x28/0x50 [amdgpu] > amdgpu_dm_connector_mode_valid+0xb4/0x1f0 [amdgpu] > drm_helper_probe_single_connector_modes+0x492/0x6b0 [drm_kms_helper] > drm_mode_getconnector+0x457/0x490 [drm] > ? drm_connector_property_set_ioctl+0x60/0x60 [drm] > drm_ioctl_kernel+0xa9/0xf0 [drm] > drm_ioctl+0x201/0x3a0 [drm] > ? drm_connector_property_set_ioctl+0x60/0x60 [drm] > amdgpu_drm_ioctl+0x49/0x80 [amdgpu] > do_vfs_ioctl+0xa4/0x630 > ? __sys_recvmsg+0x83/0xa0 > ksys_ioctl+0x60/0x90 > __x64_sys_ioctl+0x16/0x20 > do_syscall_64+0x5b/0x160 > entry_SYSCALL_64_after_hwframe+0x44/0xa9 > RIP: 0033:0x7f417110809b > Code: 0f 1e fa 48 8b 05 ed bd 0c 00 64 c7 00 26 00 00 00 48 c7 c0 ff ff ff ff c3 66 0f 1f 44 00 00 f3 0f 1e fa b8 10 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d bd bd 0c 00 f7 d8 64 89 01 48 > RSP: 002b:00007ffdd8d1c268 EFLAGS: 00000246 ORIG_RAX: 0000000000000010 > RAX: ffffffffffffffda RBX: 0000562818a8ebc0 RCX: 00007f417110809b > RDX: 00007ffdd8d1c2a0 RSI: 00000000c05064a7 RDI: 0000000000000012 > RBP: 00007ffdd8d1c2a0 R08: 0000562819012280 R09: 0000000000000007 > R10: 0000000000000000 R11: 0000000000000246 R12: 00000000c05064a7 > R13: 0000000000000012 R14: 0000000000000012 R15: 00007ffdd8d1c2a0 > Modules linked in: nfsv4 dns_resolver nfs lockd grace fscache fuse vfat fat amdgpu intel_rapl sb_edac x86_pkg_temp_thermal intel_powerclamp coretemp kvm_intel kvm irqbypass crct10dif_pclmul chash gpu_sched crc32_pclmul snd_hda_codec_realtek ghash_clmulni_intel amd_iommu_v2 iTCO_wdt iTCO_vendor_support ttm snd_hda_codec_generic snd_hda_codec_hdmi ledtrig_audio snd_hda_intel drm_kms_helper snd_hda_codec intel_cstate snd_hda_core drm snd_hwdep snd_seq snd_seq_device intel_uncore snd_pcm intel_rapl_perf snd_timer snd soundcore ioatdma pcspkr intel_wmi_thunderbolt mxm_wmi i2c_i801 lpc_ich pcc_cpufreq auth_rpcgss sunrpc igb crc32c_intel i2c_algo_bit dca wmi hid_cherry analog gameport joydev > > This patch is based on agd5f/drm-next-5.1-wip. This patch does not require > all of that, but agd5f/drm-next-5.1-wip contains at least one more dc_sink > counting fix that I could spot. > > Signed-off-by: Mathias Fröhlich <Mathias.Froehlich@web.de> > --- > .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 43 +++++++++++++++---- > .../display/amdgpu_dm/amdgpu_dm_mst_types.c | 1 + > drivers/gpu/drm/amd/display/dc/core/dc_link.c | 1 + > 3 files changed, 37 insertions(+), 8 deletions(-) > > diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c > index 3a6f595f295e..20fa01bff685 100644 > --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c > +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c > @@ -886,6 +886,7 @@ static void emulated_link_detect(struct dc_link *link) > return; > } > > + /* dc_sink_create returns a new reference */ > link->local_sink = sink; > > edid_status = dm_helpers_read_local_edid( > @@ -952,6 +953,8 @@ static int dm_resume(void *handle) > if (aconnector->fake_enable && aconnector->dc_link->local_sink) > aconnector->fake_enable = false; > > + if (aconnector->dc_sink) > + dc_sink_release(aconnector->dc_sink); > aconnector->dc_sink = NULL; > amdgpu_dm_update_connector_after_detect(aconnector); > mutex_unlock(&aconnector->hpd_lock); > @@ -1061,6 +1064,8 @@ amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector) > > > sink = aconnector->dc_link->local_sink; > + if (sink) > + dc_sink_retain(sink); > > /* > * Edid mgmt connector gets first update only in mode_valid hook and then > @@ -1085,21 +1090,24 @@ amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector) > * to it anymore after disconnect, so on next crtc to connector > * reshuffle by UMD we will get into unwanted dc_sink release > */ > - if (aconnector->dc_sink != aconnector->dc_em_sink) > - dc_sink_release(aconnector->dc_sink); > + dc_sink_release(aconnector->dc_sink); > } > aconnector->dc_sink = sink; > + dc_sink_retain(aconnector->dc_sink); > amdgpu_dm_update_freesync_caps(connector, > aconnector->edid); > } else { > amdgpu_dm_update_freesync_caps(connector, NULL); > - if (!aconnector->dc_sink) > + if (!aconnector->dc_sink) { > aconnector->dc_sink = aconnector->dc_em_sink; > - else if (aconnector->dc_sink != aconnector->dc_em_sink) > dc_sink_retain(aconnector->dc_sink); > + } > } > > mutex_unlock(&dev->mode_config.mutex); > + > + if (sink) > + dc_sink_release(sink); > return; > } > > @@ -1107,8 +1115,10 @@ amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector) > * TODO: temporary guard to look for proper fix > * if this sink is MST sink, we should not do anything > */ > - if (sink && sink->sink_signal == SIGNAL_TYPE_DISPLAY_PORT_MST) > + if (sink && sink->sink_signal == SIGNAL_TYPE_DISPLAY_PORT_MST) { > + dc_sink_release(sink); > return; > + } > > if (aconnector->dc_sink == sink) { > /* > @@ -1117,6 +1127,8 @@ amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector) > */ > DRM_DEBUG_DRIVER("DCHPD: connector_id=%d: dc_sink didn't change.\n", > aconnector->connector_id); > + if (sink) > + dc_sink_release(sink); > return; > } > > @@ -1138,6 +1150,7 @@ amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector) > amdgpu_dm_update_freesync_caps(connector, NULL); > > aconnector->dc_sink = sink; > + dc_sink_retain(aconnector->dc_sink); > if (sink->dc_edid.length == 0) { > aconnector->edid = NULL; > drm_dp_cec_unset_edid(&aconnector->dm_dp_aux.aux); > @@ -1158,11 +1171,15 @@ amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector) > amdgpu_dm_update_freesync_caps(connector, NULL); > drm_connector_update_edid_property(connector, NULL); > aconnector->num_modes = 0; > + dc_sink_release(aconnector->dc_sink); > aconnector->dc_sink = NULL; > aconnector->edid = NULL; > } > > mutex_unlock(&dev->mode_config.mutex); > + > + if (sink) > + dc_sink_release(sink); > } > > static void handle_hpd_irq(void *param) > @@ -2977,6 +2994,7 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector, > return stream; > } else { > sink = aconnector->dc_sink; > + dc_sink_retain(sink); > } > > stream = dc_create_stream_for_sink(sink); > @@ -3042,8 +3060,7 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector, > update_stream_signal(stream, sink); > > finish: > - if (sink && sink->sink_signal == SIGNAL_TYPE_VIRTUAL && aconnector->base.force != DRM_FORCE_ON) > - dc_sink_release(sink); > + dc_sink_release(sink); > > return stream; > } > @@ -3301,6 +3318,14 @@ static void amdgpu_dm_connector_destroy(struct drm_connector *connector) > dm->backlight_dev = NULL; > } > #endif > + > + if (aconnector->dc_em_sink) > + dc_sink_release(aconnector->dc_em_sink); > + aconnector->dc_em_sink = NULL; > + if (aconnector->dc_sink) > + dc_sink_release(aconnector->dc_sink); > + aconnector->dc_sink = NULL; > + > drm_dp_cec_unregister_connector(&aconnector->dm_dp_aux.aux); > drm_connector_unregister(connector); > drm_connector_cleanup(connector); > @@ -3398,10 +3423,12 @@ static void create_eml_sink(struct amdgpu_dm_connector *aconnector) > (edid->extensions + 1) * EDID_LENGTH, > &init_params); > > - if (aconnector->base.force == DRM_FORCE_ON) > + if (aconnector->base.force == DRM_FORCE_ON) { > aconnector->dc_sink = aconnector->dc_link->local_sink ? > aconnector->dc_link->local_sink : > aconnector->dc_em_sink; > + dc_sink_retain(aconnector->dc_sink); > + } > } > > static void handle_edid_mgmt(struct amdgpu_dm_connector *aconnector) > diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c > index 44c1a02e6452..5e524d733249 100644 > --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c > +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c > @@ -190,6 +190,7 @@ static int dm_dp_mst_get_modes(struct drm_connector *connector) > &init_params); > > dc_sink->priv = aconnector; > + /* dc_link_add_remote_sink returns a new reference */ > aconnector->dc_sink = dc_sink; > > if (aconnector->dc_sink) > diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c > index 7f5a947ad31d..792114e737ce 100644 > --- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c > +++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c > @@ -794,6 +794,7 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason) > sink->link->dongle_max_pix_clk = sink_caps.max_hdmi_pixel_clock; > sink->converter_disable_audio = converter_disable_audio; > > + /* dc_sink_create returns a new reference */ > link->local_sink = sink; > > edid_status = dm_helpers_read_local_edid( > -- > 2.20.1 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply [flat|nested] 5+ messages in thread
[parent not found: <CADnq5_OvyMPZ-QogBbCWLBA=Ez39tt5hb1Hh2jNJt0Rw+MkuCw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>]
* Re: [PATCH] drm/amd/display: Fix reference counting for struct dc_sink. [not found] ` <CADnq5_OvyMPZ-QogBbCWLBA=Ez39tt5hb1Hh2jNJt0Rw+MkuCw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> @ 2019-02-15 7:01 ` Mathias Fröhlich 2019-02-20 5:24 ` Mathias Fröhlich 1 sibling, 0 replies; 5+ messages in thread From: Mathias Fröhlich @ 2019-02-15 7:01 UTC (permalink / raw) To: Alex Deucher Cc: Daenzer, Michel, Maling list - DRI developers, Christian Koenig, amd-gfx list, Deucher, Alexander, Wentland, Harry, Kazlauskas, Nicholas Alex, On Wednesday, 13 February 2019 21:38:03 CET Alex Deucher wrote: > Add amd-gfx and some DC people. Thanks!! When I sent, I did not remember that there is an other list for amd! Up to now I am much more on the MESA side ... Mathias _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] drm/amd/display: Fix reference counting for struct dc_sink. [not found] ` <CADnq5_OvyMPZ-QogBbCWLBA=Ez39tt5hb1Hh2jNJt0Rw+MkuCw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 2019-02-15 7:01 ` Mathias Fröhlich @ 2019-02-20 5:24 ` Mathias Fröhlich 2019-02-21 21:00 ` Li, Sun peng (Leo) 1 sibling, 1 reply; 5+ messages in thread From: Mathias Fröhlich @ 2019-02-20 5:24 UTC (permalink / raw) To: Alex Deucher Cc: Daenzer, Michel, Maling list - DRI developers, Christian Koenig, amd-gfx list, Deucher, Alexander, Wentland, Harry, Kazlauskas, Nicholas Hi, ping? ... to the dc folks? best Mathias On Wednesday, 13 February 2019 21:38:03 CET Alex Deucher wrote: > Add amd-gfx and some DC people. > > Alex > > On Sun, Feb 10, 2019 at 5:13 AM <Mathias.Froehlich@gmx.net> wrote: > > > > From: Mathias Fröhlich <Mathias.Froehlich@gmx.net> > > > > Reference counting in amdgpu_dm_connector for amdgpu_dm_connector::dc_sink > > and amdgpu_dm_connector::dc_em_sink as well as in dc_link::local_sink seems > > to be out of shape. Thus make reference counting consistent for these > > members and just plain increment the reference count when the variable > > gets assigned and decrement when the pointer is set to zero or replaced. > > Also simplify reference counting in selected function sopes to be sure the > > reference is released in any case. In some cases add NULL pointer check > > before dereferencing. > > At a hand full of places a comment is placed to stat that the reference > > increment happened already somewhere else. > > > > This actually fixes the following kernel bug on my system when enabling > > display core in amdgpu. There are some more similar bug reports around, > > so it probably helps at more places. > > > > kernel BUG at mm/slub.c:294! > > invalid opcode: 0000 [#1] SMP PTI > > CPU: 9 PID: 1180 Comm: Xorg Not tainted 5.0.0-rc1+ #2 > > Hardware name: Supermicro X10DAi/X10DAI, BIOS 3.0a 02/05/2018 > > RIP: 0010:__slab_free+0x1e2/0x3d0 > > Code: 8b 54 24 30 48 89 4c 24 28 e8 da fb ff ff 4c 8b 54 24 28 85 c0 0f 85 67 fe ff ff 48 8d 65 d8 5b 41 5c 41 5d 41 5e 41 5f 5d c3 <0f> 0b 49 3b 5c 24 28 75 ab 48 8b 44 24 30 49 89 4c 24 28 49 89 44 > > RSP: 0018:ffffb0978589fa90 EFLAGS: 00010246 > > RAX: ffff92f12806c400 RBX: 0000000080200019 RCX: ffff92f12806c400 > > RDX: ffff92f12806c400 RSI: ffffdd6421a01a00 RDI: ffff92ed2f406e80 > > RBP: ffffb0978589fb40 R08: 0000000000000001 R09: ffffffffc0ee4748 > > R10: ffff92f12806c400 R11: 0000000000000001 R12: ffffdd6421a01a00 > > R13: ffff92f12806c400 R14: ffff92ed2f406e80 R15: ffffdd6421a01a20 > > FS: 00007f4170be0ac0(0000) GS:ffff92ed2fb40000(0000) knlGS:0000000000000000 > > CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 > > CR2: 0000562818aaa000 CR3: 000000045745a002 CR4: 00000000003606e0 > > DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 > > DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 > > Call Trace: > > ? drm_dbg+0x87/0x90 [drm] > > dc_stream_release+0x28/0x50 [amdgpu] > > amdgpu_dm_connector_mode_valid+0xb4/0x1f0 [amdgpu] > > drm_helper_probe_single_connector_modes+0x492/0x6b0 [drm_kms_helper] > > drm_mode_getconnector+0x457/0x490 [drm] > > ? drm_connector_property_set_ioctl+0x60/0x60 [drm] > > drm_ioctl_kernel+0xa9/0xf0 [drm] > > drm_ioctl+0x201/0x3a0 [drm] > > ? drm_connector_property_set_ioctl+0x60/0x60 [drm] > > amdgpu_drm_ioctl+0x49/0x80 [amdgpu] > > do_vfs_ioctl+0xa4/0x630 > > ? __sys_recvmsg+0x83/0xa0 > > ksys_ioctl+0x60/0x90 > > __x64_sys_ioctl+0x16/0x20 > > do_syscall_64+0x5b/0x160 > > entry_SYSCALL_64_after_hwframe+0x44/0xa9 > > RIP: 0033:0x7f417110809b > > Code: 0f 1e fa 48 8b 05 ed bd 0c 00 64 c7 00 26 00 00 00 48 c7 c0 ff ff ff ff c3 66 0f 1f 44 00 00 f3 0f 1e fa b8 10 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d bd bd 0c 00 f7 d8 64 89 01 48 > > RSP: 002b:00007ffdd8d1c268 EFLAGS: 00000246 ORIG_RAX: 0000000000000010 > > RAX: ffffffffffffffda RBX: 0000562818a8ebc0 RCX: 00007f417110809b > > RDX: 00007ffdd8d1c2a0 RSI: 00000000c05064a7 RDI: 0000000000000012 > > RBP: 00007ffdd8d1c2a0 R08: 0000562819012280 R09: 0000000000000007 > > R10: 0000000000000000 R11: 0000000000000246 R12: 00000000c05064a7 > > R13: 0000000000000012 R14: 0000000000000012 R15: 00007ffdd8d1c2a0 > > Modules linked in: nfsv4 dns_resolver nfs lockd grace fscache fuse vfat fat amdgpu intel_rapl sb_edac x86_pkg_temp_thermal intel_powerclamp coretemp kvm_intel kvm irqbypass crct10dif_pclmul chash gpu_sched crc32_pclmul snd_hda_codec_realtek ghash_clmulni_intel amd_iommu_v2 iTCO_wdt iTCO_vendor_support ttm snd_hda_codec_generic snd_hda_codec_hdmi ledtrig_audio snd_hda_intel drm_kms_helper snd_hda_codec intel_cstate snd_hda_core drm snd_hwdep snd_seq snd_seq_device intel_uncore snd_pcm intel_rapl_perf snd_timer snd soundcore ioatdma pcspkr intel_wmi_thunderbolt mxm_wmi i2c_i801 lpc_ich pcc_cpufreq auth_rpcgss sunrpc igb crc32c_intel i2c_algo_bit dca wmi hid_cherry analog gameport joydev > > > > This patch is based on agd5f/drm-next-5.1-wip. This patch does not require > > all of that, but agd5f/drm-next-5.1-wip contains at least one more dc_sink > > counting fix that I could spot. > > > > Signed-off-by: Mathias Fröhlich <Mathias.Froehlich@web.de> > > --- > > .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 43 +++++++++++++++---- > > .../display/amdgpu_dm/amdgpu_dm_mst_types.c | 1 + > > drivers/gpu/drm/amd/display/dc/core/dc_link.c | 1 + > > 3 files changed, 37 insertions(+), 8 deletions(-) > > > > diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c > > index 3a6f595f295e..20fa01bff685 100644 > > --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c > > +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c > > @@ -886,6 +886,7 @@ static void emulated_link_detect(struct dc_link *link) > > return; > > } > > > > + /* dc_sink_create returns a new reference */ > > link->local_sink = sink; > > > > edid_status = dm_helpers_read_local_edid( > > @@ -952,6 +953,8 @@ static int dm_resume(void *handle) > > if (aconnector->fake_enable && aconnector->dc_link->local_sink) > > aconnector->fake_enable = false; > > > > + if (aconnector->dc_sink) > > + dc_sink_release(aconnector->dc_sink); > > aconnector->dc_sink = NULL; > > amdgpu_dm_update_connector_after_detect(aconnector); > > mutex_unlock(&aconnector->hpd_lock); > > @@ -1061,6 +1064,8 @@ amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector) > > > > > > sink = aconnector->dc_link->local_sink; > > + if (sink) > > + dc_sink_retain(sink); > > > > /* > > * Edid mgmt connector gets first update only in mode_valid hook and then > > @@ -1085,21 +1090,24 @@ amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector) > > * to it anymore after disconnect, so on next crtc to connector > > * reshuffle by UMD we will get into unwanted dc_sink release > > */ > > - if (aconnector->dc_sink != aconnector->dc_em_sink) > > - dc_sink_release(aconnector->dc_sink); > > + dc_sink_release(aconnector->dc_sink); > > } > > aconnector->dc_sink = sink; > > + dc_sink_retain(aconnector->dc_sink); > > amdgpu_dm_update_freesync_caps(connector, > > aconnector->edid); > > } else { > > amdgpu_dm_update_freesync_caps(connector, NULL); > > - if (!aconnector->dc_sink) > > + if (!aconnector->dc_sink) { > > aconnector->dc_sink = aconnector->dc_em_sink; > > - else if (aconnector->dc_sink != aconnector->dc_em_sink) > > dc_sink_retain(aconnector->dc_sink); > > + } > > } > > > > mutex_unlock(&dev->mode_config.mutex); > > + > > + if (sink) > > + dc_sink_release(sink); > > return; > > } > > > > @@ -1107,8 +1115,10 @@ amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector) > > * TODO: temporary guard to look for proper fix > > * if this sink is MST sink, we should not do anything > > */ > > - if (sink && sink->sink_signal == SIGNAL_TYPE_DISPLAY_PORT_MST) > > + if (sink && sink->sink_signal == SIGNAL_TYPE_DISPLAY_PORT_MST) { > > + dc_sink_release(sink); > > return; > > + } > > > > if (aconnector->dc_sink == sink) { > > /* > > @@ -1117,6 +1127,8 @@ amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector) > > */ > > DRM_DEBUG_DRIVER("DCHPD: connector_id=%d: dc_sink didn't change.\n", > > aconnector->connector_id); > > + if (sink) > > + dc_sink_release(sink); > > return; > > } > > > > @@ -1138,6 +1150,7 @@ amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector) > > amdgpu_dm_update_freesync_caps(connector, NULL); > > > > aconnector->dc_sink = sink; > > + dc_sink_retain(aconnector->dc_sink); > > if (sink->dc_edid.length == 0) { > > aconnector->edid = NULL; > > drm_dp_cec_unset_edid(&aconnector->dm_dp_aux.aux); > > @@ -1158,11 +1171,15 @@ amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector) > > amdgpu_dm_update_freesync_caps(connector, NULL); > > drm_connector_update_edid_property(connector, NULL); > > aconnector->num_modes = 0; > > + dc_sink_release(aconnector->dc_sink); > > aconnector->dc_sink = NULL; > > aconnector->edid = NULL; > > } > > > > mutex_unlock(&dev->mode_config.mutex); > > + > > + if (sink) > > + dc_sink_release(sink); > > } > > > > static void handle_hpd_irq(void *param) > > @@ -2977,6 +2994,7 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector, > > return stream; > > } else { > > sink = aconnector->dc_sink; > > + dc_sink_retain(sink); > > } > > > > stream = dc_create_stream_for_sink(sink); > > @@ -3042,8 +3060,7 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector, > > update_stream_signal(stream, sink); > > > > finish: > > - if (sink && sink->sink_signal == SIGNAL_TYPE_VIRTUAL && aconnector->base.force != DRM_FORCE_ON) > > - dc_sink_release(sink); > > + dc_sink_release(sink); > > > > return stream; > > } > > @@ -3301,6 +3318,14 @@ static void amdgpu_dm_connector_destroy(struct drm_connector *connector) > > dm->backlight_dev = NULL; > > } > > #endif > > + > > + if (aconnector->dc_em_sink) > > + dc_sink_release(aconnector->dc_em_sink); > > + aconnector->dc_em_sink = NULL; > > + if (aconnector->dc_sink) > > + dc_sink_release(aconnector->dc_sink); > > + aconnector->dc_sink = NULL; > > + > > drm_dp_cec_unregister_connector(&aconnector->dm_dp_aux.aux); > > drm_connector_unregister(connector); > > drm_connector_cleanup(connector); > > @@ -3398,10 +3423,12 @@ static void create_eml_sink(struct amdgpu_dm_connector *aconnector) > > (edid->extensions + 1) * EDID_LENGTH, > > &init_params); > > > > - if (aconnector->base.force == DRM_FORCE_ON) > > + if (aconnector->base.force == DRM_FORCE_ON) { > > aconnector->dc_sink = aconnector->dc_link->local_sink ? > > aconnector->dc_link->local_sink : > > aconnector->dc_em_sink; > > + dc_sink_retain(aconnector->dc_sink); > > + } > > } > > > > static void handle_edid_mgmt(struct amdgpu_dm_connector *aconnector) > > diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c > > index 44c1a02e6452..5e524d733249 100644 > > --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c > > +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c > > @@ -190,6 +190,7 @@ static int dm_dp_mst_get_modes(struct drm_connector *connector) > > &init_params); > > > > dc_sink->priv = aconnector; > > + /* dc_link_add_remote_sink returns a new reference */ > > aconnector->dc_sink = dc_sink; > > > > if (aconnector->dc_sink) > > diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c > > index 7f5a947ad31d..792114e737ce 100644 > > --- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c > > +++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c > > @@ -794,6 +794,7 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason) > > sink->link->dongle_max_pix_clk = sink_caps.max_hdmi_pixel_clock; > > sink->converter_disable_audio = converter_disable_audio; > > > > + /* dc_sink_create returns a new reference */ > > link->local_sink = sink; > > > > edid_status = dm_helpers_read_local_edid( > > -- > > 2.20.1 > > > > _______________________________________________ > > dri-devel mailing list > > dri-devel@lists.freedesktop.org > > https://lists.freedesktop.org/mailman/listinfo/dri-devel _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] drm/amd/display: Fix reference counting for struct dc_sink. 2019-02-20 5:24 ` Mathias Fröhlich @ 2019-02-21 21:00 ` Li, Sun peng (Leo) [not found] ` <cc434ed7-ee0d-6cea-3a9c-0dab37115b8e-5C7GfCeVMHo@public.gmane.org> 0 siblings, 1 reply; 5+ messages in thread From: Li, Sun peng (Leo) @ 2019-02-21 21:00 UTC (permalink / raw) To: Mathias Fröhlich, Alex Deucher Cc: Daenzer, Michel, amd-gfx list, Kazlauskas, Nicholas, Maling list - DRI developers, Deucher, Alexander, Koenig, Christian On 2019-02-20 12:24 a.m., Mathias Fröhlich wrote: > Hi, > > ping? > ... to the dc folks? > > best > Mathias Hi Mathias, Sorry for the wait, change looks good to me. Reviewed-by: Leo Li <sunpeng.li@amd.com> ...and merged. Thanks for cleaning this up. Leo > > On Wednesday, 13 February 2019 21:38:03 CET Alex Deucher wrote: >> Add amd-gfx and some DC people. >> >> Alex >> >> On Sun, Feb 10, 2019 at 5:13 AM <Mathias.Froehlich@gmx.net> wrote: >>> >>> From: Mathias Fröhlich <Mathias.Froehlich@gmx.net> >>> >>> Reference counting in amdgpu_dm_connector for amdgpu_dm_connector::dc_sink >>> and amdgpu_dm_connector::dc_em_sink as well as in dc_link::local_sink seems >>> to be out of shape. Thus make reference counting consistent for these >>> members and just plain increment the reference count when the variable >>> gets assigned and decrement when the pointer is set to zero or replaced. >>> Also simplify reference counting in selected function sopes to be sure the >>> reference is released in any case. In some cases add NULL pointer check >>> before dereferencing. >>> At a hand full of places a comment is placed to stat that the reference >>> increment happened already somewhere else. >>> >>> This actually fixes the following kernel bug on my system when enabling >>> display core in amdgpu. There are some more similar bug reports around, >>> so it probably helps at more places. >>> >>> kernel BUG at mm/slub.c:294! >>> invalid opcode: 0000 [#1] SMP PTI >>> CPU: 9 PID: 1180 Comm: Xorg Not tainted 5.0.0-rc1+ #2 >>> Hardware name: Supermicro X10DAi/X10DAI, BIOS 3.0a 02/05/2018 >>> RIP: 0010:__slab_free+0x1e2/0x3d0 >>> Code: 8b 54 24 30 48 89 4c 24 28 e8 da fb ff ff 4c 8b 54 24 28 85 c0 0f 85 67 fe ff ff 48 8d 65 d8 5b 41 5c 41 5d 41 5e 41 5f 5d c3 <0f> 0b 49 3b 5c 24 28 75 ab 48 8b 44 24 30 49 89 4c 24 28 49 89 44 >>> RSP: 0018:ffffb0978589fa90 EFLAGS: 00010246 >>> RAX: ffff92f12806c400 RBX: 0000000080200019 RCX: ffff92f12806c400 >>> RDX: ffff92f12806c400 RSI: ffffdd6421a01a00 RDI: ffff92ed2f406e80 >>> RBP: ffffb0978589fb40 R08: 0000000000000001 R09: ffffffffc0ee4748 >>> R10: ffff92f12806c400 R11: 0000000000000001 R12: ffffdd6421a01a00 >>> R13: ffff92f12806c400 R14: ffff92ed2f406e80 R15: ffffdd6421a01a20 >>> FS: 00007f4170be0ac0(0000) GS:ffff92ed2fb40000(0000) knlGS:0000000000000000 >>> CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 >>> CR2: 0000562818aaa000 CR3: 000000045745a002 CR4: 00000000003606e0 >>> DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 >>> DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 >>> Call Trace: >>> ? drm_dbg+0x87/0x90 [drm] >>> dc_stream_release+0x28/0x50 [amdgpu] >>> amdgpu_dm_connector_mode_valid+0xb4/0x1f0 [amdgpu] >>> drm_helper_probe_single_connector_modes+0x492/0x6b0 [drm_kms_helper] >>> drm_mode_getconnector+0x457/0x490 [drm] >>> ? drm_connector_property_set_ioctl+0x60/0x60 [drm] >>> drm_ioctl_kernel+0xa9/0xf0 [drm] >>> drm_ioctl+0x201/0x3a0 [drm] >>> ? drm_connector_property_set_ioctl+0x60/0x60 [drm] >>> amdgpu_drm_ioctl+0x49/0x80 [amdgpu] >>> do_vfs_ioctl+0xa4/0x630 >>> ? __sys_recvmsg+0x83/0xa0 >>> ksys_ioctl+0x60/0x90 >>> __x64_sys_ioctl+0x16/0x20 >>> do_syscall_64+0x5b/0x160 >>> entry_SYSCALL_64_after_hwframe+0x44/0xa9 >>> RIP: 0033:0x7f417110809b >>> Code: 0f 1e fa 48 8b 05 ed bd 0c 00 64 c7 00 26 00 00 00 48 c7 c0 ff ff ff ff c3 66 0f 1f 44 00 00 f3 0f 1e fa b8 10 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d bd bd 0c 00 f7 d8 64 89 01 48 >>> RSP: 002b:00007ffdd8d1c268 EFLAGS: 00000246 ORIG_RAX: 0000000000000010 >>> RAX: ffffffffffffffda RBX: 0000562818a8ebc0 RCX: 00007f417110809b >>> RDX: 00007ffdd8d1c2a0 RSI: 00000000c05064a7 RDI: 0000000000000012 >>> RBP: 00007ffdd8d1c2a0 R08: 0000562819012280 R09: 0000000000000007 >>> R10: 0000000000000000 R11: 0000000000000246 R12: 00000000c05064a7 >>> R13: 0000000000000012 R14: 0000000000000012 R15: 00007ffdd8d1c2a0 >>> Modules linked in: nfsv4 dns_resolver nfs lockd grace fscache fuse vfat fat amdgpu intel_rapl sb_edac x86_pkg_temp_thermal intel_powerclamp coretemp kvm_intel kvm irqbypass crct10dif_pclmul chash gpu_sched crc32_pclmul snd_hda_codec_realtek ghash_clmulni_intel amd_iommu_v2 iTCO_wdt iTCO_vendor_support ttm snd_hda_codec_generic snd_hda_codec_hdmi ledtrig_audio snd_hda_intel drm_kms_helper snd_hda_codec intel_cstate snd_hda_core drm snd_hwdep snd_seq snd_seq_device intel_uncore snd_pcm intel_rapl_perf snd_timer snd soundcore ioatdma pcspkr intel_wmi_thunderbolt mxm_wmi i2c_i801 lpc_ich pcc_cpufreq auth_rpcgss sunrpc igb crc32c_intel i2c_algo_bit dca wmi hid_cherry analog gameport joydev >>> >>> This patch is based on agd5f/drm-next-5.1-wip. This patch does not require >>> all of that, but agd5f/drm-next-5.1-wip contains at least one more dc_sink >>> counting fix that I could spot. >>> >>> Signed-off-by: Mathias Fröhlich <Mathias.Froehlich@web.de> >>> --- >>> .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 43 +++++++++++++++---- >>> .../display/amdgpu_dm/amdgpu_dm_mst_types.c | 1 + >>> drivers/gpu/drm/amd/display/dc/core/dc_link.c | 1 + >>> 3 files changed, 37 insertions(+), 8 deletions(-) >>> >>> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c >>> index 3a6f595f295e..20fa01bff685 100644 >>> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c >>> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c >>> @@ -886,6 +886,7 @@ static void emulated_link_detect(struct dc_link *link) >>> return; >>> } >>> >>> + /* dc_sink_create returns a new reference */ >>> link->local_sink = sink; >>> >>> edid_status = dm_helpers_read_local_edid( >>> @@ -952,6 +953,8 @@ static int dm_resume(void *handle) >>> if (aconnector->fake_enable && aconnector->dc_link->local_sink) >>> aconnector->fake_enable = false; >>> >>> + if (aconnector->dc_sink) >>> + dc_sink_release(aconnector->dc_sink); >>> aconnector->dc_sink = NULL; >>> amdgpu_dm_update_connector_after_detect(aconnector); >>> mutex_unlock(&aconnector->hpd_lock); >>> @@ -1061,6 +1064,8 @@ amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector) >>> >>> >>> sink = aconnector->dc_link->local_sink; >>> + if (sink) >>> + dc_sink_retain(sink); >>> >>> /* >>> * Edid mgmt connector gets first update only in mode_valid hook and then >>> @@ -1085,21 +1090,24 @@ amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector) >>> * to it anymore after disconnect, so on next crtc to connector >>> * reshuffle by UMD we will get into unwanted dc_sink release >>> */ >>> - if (aconnector->dc_sink != aconnector->dc_em_sink) >>> - dc_sink_release(aconnector->dc_sink); >>> + dc_sink_release(aconnector->dc_sink); >>> } >>> aconnector->dc_sink = sink; >>> + dc_sink_retain(aconnector->dc_sink); >>> amdgpu_dm_update_freesync_caps(connector, >>> aconnector->edid); >>> } else { >>> amdgpu_dm_update_freesync_caps(connector, NULL); >>> - if (!aconnector->dc_sink) >>> + if (!aconnector->dc_sink) { >>> aconnector->dc_sink = aconnector->dc_em_sink; >>> - else if (aconnector->dc_sink != aconnector->dc_em_sink) >>> dc_sink_retain(aconnector->dc_sink); >>> + } >>> } >>> >>> mutex_unlock(&dev->mode_config.mutex); >>> + >>> + if (sink) >>> + dc_sink_release(sink); >>> return; >>> } >>> >>> @@ -1107,8 +1115,10 @@ amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector) >>> * TODO: temporary guard to look for proper fix >>> * if this sink is MST sink, we should not do anything >>> */ >>> - if (sink && sink->sink_signal == SIGNAL_TYPE_DISPLAY_PORT_MST) >>> + if (sink && sink->sink_signal == SIGNAL_TYPE_DISPLAY_PORT_MST) { >>> + dc_sink_release(sink); >>> return; >>> + } >>> >>> if (aconnector->dc_sink == sink) { >>> /* >>> @@ -1117,6 +1127,8 @@ amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector) >>> */ >>> DRM_DEBUG_DRIVER("DCHPD: connector_id=%d: dc_sink didn't change.\n", >>> aconnector->connector_id); >>> + if (sink) >>> + dc_sink_release(sink); >>> return; >>> } >>> >>> @@ -1138,6 +1150,7 @@ amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector) >>> amdgpu_dm_update_freesync_caps(connector, NULL); >>> >>> aconnector->dc_sink = sink; >>> + dc_sink_retain(aconnector->dc_sink); >>> if (sink->dc_edid.length == 0) { >>> aconnector->edid = NULL; >>> drm_dp_cec_unset_edid(&aconnector->dm_dp_aux.aux); >>> @@ -1158,11 +1171,15 @@ amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector) >>> amdgpu_dm_update_freesync_caps(connector, NULL); >>> drm_connector_update_edid_property(connector, NULL); >>> aconnector->num_modes = 0; >>> + dc_sink_release(aconnector->dc_sink); >>> aconnector->dc_sink = NULL; >>> aconnector->edid = NULL; >>> } >>> >>> mutex_unlock(&dev->mode_config.mutex); >>> + >>> + if (sink) >>> + dc_sink_release(sink); >>> } >>> >>> static void handle_hpd_irq(void *param) >>> @@ -2977,6 +2994,7 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector, >>> return stream; >>> } else { >>> sink = aconnector->dc_sink; >>> + dc_sink_retain(sink); >>> } >>> >>> stream = dc_create_stream_for_sink(sink); >>> @@ -3042,8 +3060,7 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector, >>> update_stream_signal(stream, sink); >>> >>> finish: >>> - if (sink && sink->sink_signal == SIGNAL_TYPE_VIRTUAL && aconnector->base.force != DRM_FORCE_ON) >>> - dc_sink_release(sink); >>> + dc_sink_release(sink); >>> >>> return stream; >>> } >>> @@ -3301,6 +3318,14 @@ static void amdgpu_dm_connector_destroy(struct drm_connector *connector) >>> dm->backlight_dev = NULL; >>> } >>> #endif >>> + >>> + if (aconnector->dc_em_sink) >>> + dc_sink_release(aconnector->dc_em_sink); >>> + aconnector->dc_em_sink = NULL; >>> + if (aconnector->dc_sink) >>> + dc_sink_release(aconnector->dc_sink); >>> + aconnector->dc_sink = NULL; >>> + >>> drm_dp_cec_unregister_connector(&aconnector->dm_dp_aux.aux); >>> drm_connector_unregister(connector); >>> drm_connector_cleanup(connector); >>> @@ -3398,10 +3423,12 @@ static void create_eml_sink(struct amdgpu_dm_connector *aconnector) >>> (edid->extensions + 1) * EDID_LENGTH, >>> &init_params); >>> >>> - if (aconnector->base.force == DRM_FORCE_ON) >>> + if (aconnector->base.force == DRM_FORCE_ON) { >>> aconnector->dc_sink = aconnector->dc_link->local_sink ? >>> aconnector->dc_link->local_sink : >>> aconnector->dc_em_sink; >>> + dc_sink_retain(aconnector->dc_sink); >>> + } >>> } >>> >>> static void handle_edid_mgmt(struct amdgpu_dm_connector *aconnector) >>> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c >>> index 44c1a02e6452..5e524d733249 100644 >>> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c >>> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c >>> @@ -190,6 +190,7 @@ static int dm_dp_mst_get_modes(struct drm_connector *connector) >>> &init_params); >>> >>> dc_sink->priv = aconnector; >>> + /* dc_link_add_remote_sink returns a new reference */ >>> aconnector->dc_sink = dc_sink; >>> >>> if (aconnector->dc_sink) >>> diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c >>> index 7f5a947ad31d..792114e737ce 100644 >>> --- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c >>> +++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c >>> @@ -794,6 +794,7 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason) >>> sink->link->dongle_max_pix_clk = sink_caps.max_hdmi_pixel_clock; >>> sink->converter_disable_audio = converter_disable_audio; >>> >>> + /* dc_sink_create returns a new reference */ >>> link->local_sink = sink; >>> >>> edid_status = dm_helpers_read_local_edid( >>> -- >>> 2.20.1 >>> >>> _______________________________________________ >>> dri-devel mailing list >>> dri-devel@lists.freedesktop.org >>> https://lists.freedesktop.org/mailman/listinfo/dri-devel > > > > > _______________________________________________ > amd-gfx mailing list > amd-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx > _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel ^ permalink raw reply [flat|nested] 5+ messages in thread
[parent not found: <cc434ed7-ee0d-6cea-3a9c-0dab37115b8e-5C7GfCeVMHo@public.gmane.org>]
* Re: [PATCH] drm/amd/display: Fix reference counting for struct dc_sink. [not found] ` <cc434ed7-ee0d-6cea-3a9c-0dab37115b8e-5C7GfCeVMHo@public.gmane.org> @ 2019-02-22 5:52 ` Mathias Fröhlich 0 siblings, 0 replies; 5+ messages in thread From: Mathias Fröhlich @ 2019-02-22 5:52 UTC (permalink / raw) To: Li, Sun peng (Leo) Cc: Daenzer, Michel, amd-gfx list, Kazlauskas, Nicholas, Deucher, Alexander, Maling list - DRI developers, Alex Deucher, Wentland, Harry, Koenig, Christian Good Morning, On Thursday, 21 February 2019 22:00:40 CET Li, Sun peng (Leo) wrote: > > On 2019-02-20 12:24 a.m., Mathias Fröhlich wrote: > > Hi, > > > > ping? > > ... to the dc folks? > > > > best > > Mathias > > Hi Mathias, > > Sorry for the wait, change looks good to me. > > Reviewed-by: Leo Li <sunpeng.li@amd.com> > ...and merged. > > Thanks for cleaning this up. > Leo Thanks! Mathias _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2019-02-22 5:52 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20190210101301.5940-1-Mathias.Froehlich@gmx.net>
[not found] ` <20190210101301.5940-1-Mathias.Froehlich-hi6Y0CQ0nG0@public.gmane.org>
2019-02-13 20:38 ` [PATCH] drm/amd/display: Fix reference counting for struct dc_sink Alex Deucher via amd-gfx
[not found] ` <CADnq5_OvyMPZ-QogBbCWLBA=Ez39tt5hb1Hh2jNJt0Rw+MkuCw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2019-02-15 7:01 ` Mathias Fröhlich
2019-02-20 5:24 ` Mathias Fröhlich
2019-02-21 21:00 ` Li, Sun peng (Leo)
[not found] ` <cc434ed7-ee0d-6cea-3a9c-0dab37115b8e-5C7GfCeVMHo@public.gmane.org>
2019-02-22 5:52 ` Mathias Fröhlich
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox