For some source, it will be shared by some client ID and source ID. To fix the page fault issue, set all those to null. Signed-off-by: Emily Deng <Emily.Deng@xxxxxxx> --- drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c index af026109421a..623b1ac6231d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c @@ -359,7 +359,7 @@ int amdgpu_irq_init(struct amdgpu_device *adev) */ void amdgpu_irq_fini(struct amdgpu_device *adev) { - unsigned i, j; + unsigned i, j, m, n; if (adev->irq.installed) { drm_irq_uninstall(adev_to_drm(adev)); @@ -380,12 +380,22 @@ void amdgpu_irq_fini(struct amdgpu_device *adev) if (!src) continue; - kfree(src->enabled_types); + if (src->enabled_types) + kfree(src->enabled_types); + src->enabled_types = NULL; + if (src->data) { kfree(src->data); kfree(src); - adev->irq.client[i].sources[j] = NULL; + } + + for (m = 0; m < AMDGPU_IRQ_CLIENTID_MAX; ++m) { + if (!adev->irq.client[m].sources) + continue; + for (n = 0; n < AMDGPU_MAX_IRQ_SRC_ID; ++n) + if (adev->irq.client[m].sources[n] == src) + adev->irq.client[m].sources[n] = NULL; } } kfree(adev->irq.client[i].sources); -- 2.25.1 _______________________________________________ amd-gfx mailing list amd-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/amd-gfx