Commit 7136f956 authored by Rafael Mendonca's avatar Rafael Mendonca Committed by Alex Deucher
Browse files

drm/amdgpu: Fix memory leak in hpd_rx_irq_create_workqueue()



If construction of the array of work queues to handle hpd_rx_irq offload
work fails, we need to unwind. Destroy all the created workqueues and
the allocated memory for the hpd_rx_irq_offload_work_queue struct array.

Fixes: 8e794421 ("drm/amd/display: Fork thread to offload work of hpd_rx_irq")
Signed-off-by: default avatarRafael Mendonca <rafaelmendsr@gmail.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 221bb3a9
Loading
Loading
Loading
Loading
+9 −1
Original line number Original line Diff line number Diff line
@@ -1296,13 +1296,21 @@ static struct hpd_rx_irq_offload_work_queue *hpd_rx_irq_create_workqueue(struct


		if (hpd_rx_offload_wq[i].wq == NULL) {
		if (hpd_rx_offload_wq[i].wq == NULL) {
			DRM_ERROR("create amdgpu_dm_hpd_rx_offload_wq fail!");
			DRM_ERROR("create amdgpu_dm_hpd_rx_offload_wq fail!");
			return NULL;
			goto out_err;
		}
		}


		spin_lock_init(&hpd_rx_offload_wq[i].offload_lock);
		spin_lock_init(&hpd_rx_offload_wq[i].offload_lock);
	}
	}


	return hpd_rx_offload_wq;
	return hpd_rx_offload_wq;

out_err:
	for (i = 0; i < max_caps; i++) {
		if (hpd_rx_offload_wq[i].wq)
			destroy_workqueue(hpd_rx_offload_wq[i].wq);
	}
	kfree(hpd_rx_offload_wq);
	return NULL;
}
}


struct amdgpu_stutter_quirk {
struct amdgpu_stutter_quirk {