⬢ DragonFlyBSD Kernel Audit
DF-4975 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/drm/amd/amdgpu/mxgpu_ai.c
+++ b/sys/dev/drm/amd/amdgpu/mxgpu_ai.c
@@ -347,14 +347,14 @@ static int xgpu_ai_set_mailbox_rcv_irq(str
 int xgpu_ai_mailbox_get_irq(struct amdgpu_device *adev)
 {
 	int r;
 
+	/* Initialize flr_work BEFORE the RCV irq source can fire,
+	 * otherwise a host-timed IDH_FLR_NOTIFICATION makes
+	 * xgpu_ai_mailbox_rcv_irq() schedule_work() on a zeroed
+	 * work_struct -> NULL func call (DF-4975, twin of DF-4755).
+	 */
+	INIT_WORK(&adev->virt.flr_work, xgpu_ai_mailbox_flr_work);
+
 	r = amdgpu_irq_get(adev, &adev->virt.rcv_irq, 0);
 	if (r)
 		return r;
 	r = amdgpu_irq_get(adev, &adev->virt.ack_irq, 0);
 	if (r) {
 		amdgpu_irq_put(adev, &adev->virt.rcv_irq, 0);
 		return r;
 	}
-
-	INIT_WORK(&adev->virt.flr_work, xgpu_ai_mailbox_flr_work);
 
 	return 0;
 }