drm/amd/display: handler not correctly checked at remove_irq_handler
authorQingqing Zhuo <qingqing.zhuo@amd.com>
Fri, 4 Dec 2020 15:55:13 +0000 (10:55 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 23 Dec 2020 20:01:18 +0000 (15:01 -0500)
[why]
handler is supposedly passed in as a function pointer;
however, the entire struct amdgpu_dm_irq_handler_data
gets from the list is used to check match.

[how]
use the interrupt_handler within amdgpu_dm_irq_handler_data
for checking match.

Signed-off-by: Qingqing Zhuo <qingqing.zhuo@amd.com>
Acked-by: Bindu Ramamurthy <bindu.r@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c

index 3577785..26ed70e 100644 (file)
@@ -165,7 +165,10 @@ static struct list_head *remove_irq_handler(struct amdgpu_device *adev,
                handler = list_entry(entry, struct amdgpu_dm_irq_handler_data,
                                     list);
 
-               if (ih == handler) {
+               if (handler == NULL)
+                       continue;
+
+               if (ih == handler->handler) {
                        /* Found our handler. Remove it from the list. */
                        list_del(&handler->list);
                        handler_removed = true;