[Intel-gfx] [PATCH] drm/i915/display: Remove useless but deadly local

Jani Nikula jani.nikula at intel.com
Thu Mar 26 10:03:26 UTC 2020


On Thu, 26 Mar 2020, Chris Wilson <chris at chris-wilson.co.uk> wrote:
> Beware dereferencing the NULL pointer prior to checking for its
> existence.

Okay, so the crt code calls ddi functions, and enc_to_dig_port() will
return NULL. Backtrace for posterity below, copy-pasted from logs Chris
pointed me at.

I think alternatively we could just use to_i915(encoder->base.dev) here
instead of accessing intel_dig_port, but the patch at hand fixes stuff,

Reviewed-by: Jani Nikula <jani.nikula at intel.com>

Some other observations: As we're moving further and further away from
crt, I don't think people expect the intel_ddi_* functions to be called
directly from crt code, or any code where the encoder is *not* a digital
port.

And that brings us to another case where enc_to_dig_port() will return
NULL: INTEL_OUTPUT_DP_MST. We rarely check for enc_to_dig_port() being
NULL anywhere. There's probably more subtle bugs waiting to happen here
and there.


BR,
Jani.


<1>[    3.324694] BUG: kernel NULL pointer dereference, address: 0000000000000000
<1>[    3.324696] #PF: supervisor read access in kernel mode
<4>[    3.324704] hardirqs last  enabled at (751): [<ffffffff812a4f77>] d_lookup+0x57/0xa0
<1>[    3.324709] #PF: error_code(0x0000) - not-present page
<4>[    3.324716] hardirqs last disabled at (752): [<ffffffff8125a1b9>] __slab_alloc.isra.89.constprop.94+0x19/0x70
<4>[    3.324720] softirqs last  enabled at (402): [<ffffffff81e00385>] __do_softirq+0x385/0x47f
<6>[    3.324725] PGD 0 P4D 0 
<4>[    3.324733] softirqs last disabled at (395): [<ffffffff810bab6a>] irq_exit+0xba/0xc0
<4>[    3.324762] Oops: 0000 [#1] PREEMPT SMP PTI
<4>[    3.324768] CPU: 0 PID: 380 Comm: systemd-udevd Not tainted 5.6.0-rc7-CI-CI_DRM_8189+ #1
<4>[    3.324776] Hardware name: MSI MS-7924/Z97M-G43(MS-7924), BIOS V1.12 02/15/2016
<4>[    3.324840] RIP: 0010:intel_read_infoframe+0x3a/0x170 [i915]
<4>[    3.324848] Code: 65 48 8b 04 25 28 00 00 00 48 89 44 24 20 31 c0 83 f9 0a 77 12 ba 01 00 00 00 48 d3 e2 f7 c2 c0 05 00 00 48 0f 45 c7 83 fb 03 <4c> 8b 20 0f 84 f2 00 00 00 83 fb 0a 0f 84 f3 00 00 00 83 fb 07 0f
<4>[    3.324865] RSP: 0018:ffffc900005438b0 EFLAGS: 00010212
<4>[    3.324871] RAX: 0000000000000000 RBX: 0000000000000082 RCX: 0000000000000001
<4>[    3.324879] RDX: 0000000000000002 RSI: ffff8883f8309000 RDI: ffff8883f80cbe00
<4>[    3.324887] RBP: ffff8883f8309b34 R08: 000000000000000e R09: 0000000000000001
<4>[    3.324894] R10: 0000000000000000 R11: 0000000000000000 R12: ffff8883f7ac0000
<4>[    3.324901] R13: ffff8883f7ac0000 R14: ffff8883f7ac0d90 R15: ffff8883f844d000
<4>[    3.324908] FS:  00007ffa4a839680(0000) GS:ffff888410000000(0000) knlGS:0000000000000000
<4>[    3.324917] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
<4>[    3.324923] CR2: 0000000000000000 CR3: 0000000401aa4002 CR4: 00000000001606f0
<4>[    3.324930] Call Trace:
<4>[    3.324980]  ? gen6_read32+0x272/0x300 [i915]
<4>[    3.325044]  intel_ddi_get_config+0x238/0x610 [i915]
<4>[    3.325108]  hsw_crt_get_config+0x12/0x40 [i915]
<4>[    3.325173]  intel_modeset_setup_hw_state+0x3b3/0x1660 [i915]
<4>[    3.325182]  ? ww_mutex_lock+0x39/0x70
<4>[    3.325190]  ? drm_modeset_lock+0xad/0x120
<4>[    3.325254]  intel_modeset_init+0x582/0x1c50 [i915]
<4>[    3.325263]  ? _raw_spin_unlock_irqrestore+0x34/0x60
<4>[    3.325314]  ? intel_irq_postinstall+0xb3/0x610 [i915]
<4>[    3.325366]  i915_driver_probe+0xa7e/0xed0 [i915]
<4>[    3.325375]  ? __pm_runtime_resume+0x4f/0x80
<4>[    3.325426]  i915_pci_probe+0x43/0x1b0 [i915]
<4>[    3.325434]  ? _raw_spin_unlock_irqrestore+0x34/0x60
<4>[    3.325442]  pci_device_probe+0x9e/0x120
<4>[    3.325450]  really_probe+0xea/0x430
<4>[    3.325456]  driver_probe_device+0x10b/0x120
<4>[    3.325463]  device_driver_attach+0x4a/0x50
<4>[    3.325469]  __driver_attach+0x97/0x130
<4>[    3.325476]  ? device_driver_attach+0x50/0x50
<4>[    3.325482]  bus_for_each_dev+0x74/0xc0
<4>[    3.325489]  bus_add_driver+0x142/0x220
<4>[    3.325495]  driver_register+0x56/0xf0
<4>[    3.325543]  i915_init+0x6c/0x7c [i915]
<4>[    3.325549]  ? 0xffffffffa087f000
<4>[    3.325555]  do_one_initcall+0x58/0x300
<4>[    3.325562]  ? rcu_read_lock_sched_held+0x4d/0x80
<4>[    3.325570]  ? kmem_cache_alloc_trace+0x2a6/0x2d0
<4>[    3.325578]  do_init_module+0x56/0x1f2
<4>[    3.325584]  load_module+0x233d/0x2a30
<4>[    3.325596]  ? __do_sys_finit_module+0xe9/0x110
<4>[    3.325602]  __do_sys_finit_module+0xe9/0x110
<4>[    3.325612]  do_syscall_64+0x4f/0x220
<4>[    3.325618]  entry_SYSCALL_64_after_hwframe+0x49/0xbe
<4>[    3.325624] RIP: 0033:0x7ffa4a35a839
<4>[    3.325630] Code: 00 f3 c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 1f f6 2c 00 f7 d8 64 89 01 48
<4>[    3.325647] RSP: 002b:00007ffdbdf7b848 EFLAGS: 00000246 ORIG_RAX: 0000000000000139
<4>[    3.325656] RAX: ffffffffffffffda RBX: 000055bc2aa95fc0 RCX: 00007ffa4a35a839
<4>[    3.325663] RDX: 0000000000000000 RSI: 00007ffa4a039145 RDI: 000000000000000f
<4>[    3.325671] RBP: 00007ffa4a039145 R08: 0000000000000000 R09: 00007ffdbdf7b960
<4>[    3.325678] R10: 000000000000000f R11: 0000000000000246 R12: 0000000000000000
<4>[    3.325686] R13: 000055bc2aaa3200 R14: 0000000000020000 R15: 000055bc2aa95fc0
<4>[    3.325696] Modules linked in: i915(+) mei_hdcp x86_pkg_temp_thermal coretemp snd_hda_codec_realtek snd_hda_codec_generic crct10dif_pclmul crc32_pclmul snd_hda_intel snd_intel_dspcfg snd_hda_codec ghash_clmulni_intel snd_hwdep r8169 snd_hda_core realtek snd_pcm mei_me mei prime_numbers lpc_ich
<4>[    3.325729] CR2: 0000000000000000
<4>[    3.325740] ---[ end trace 22628c46d7d6a985 ]---




>
> Fixes: 419190429cd1 ("drm/i915/hdmi: use struct drm_device based logging")
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Wambui Karuga <wambui.karugax at gmail.com>
> Cc: Jani Nikula <jani.nikula at intel.com>
> Cc: "Ville Syrjälä" <ville.syrjala at linux.intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_hdmi.c | 5 ++---
>  1 file changed, 2 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c
> index 395dc192baa0..0076abc63851 100644
> --- a/drivers/gpu/drm/i915/display/intel_hdmi.c
> +++ b/drivers/gpu/drm/i915/display/intel_hdmi.c
> @@ -691,7 +691,6 @@ void intel_read_infoframe(struct intel_encoder *encoder,
>  			  union hdmi_infoframe *frame)
>  {
>  	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
> -	struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
>  	u8 buffer[VIDEO_DIP_DATA_SIZE];
>  	int ret;
>  
> @@ -708,13 +707,13 @@ void intel_read_infoframe(struct intel_encoder *encoder,
>  	/* see comment above for the reason for this offset */
>  	ret = hdmi_infoframe_unpack(frame, buffer + 1, sizeof(buffer) - 1);
>  	if (ret) {
> -		drm_dbg_kms(&i915->drm,
> +		drm_dbg_kms(encoder->base.dev,
>  			    "Failed to unpack infoframe type 0x%02x\n", type);
>  		return;
>  	}
>  
>  	if (frame->any.type != type)
> -		drm_dbg_kms(&i915->drm,
> +		drm_dbg_kms(encoder->base.dev,
>  			    "Found the wrong infoframe type 0x%x (expected 0x%02x)\n",
>  			    frame->any.type, type);
>  }

-- 
Jani Nikula, Intel Open Source Graphics Center


More information about the Intel-gfx mailing list