amdkfd: use schedule() in sync_with_hw
authorOded Gabbay <oded.gabbay@amd.com>
Mon, 17 Nov 2014 11:18:32 +0000 (13:18 +0200)
committerOded Gabbay <oded.gabbay@amd.com>
Mon, 17 Nov 2014 11:18:32 +0000 (13:18 +0200)
amdkfd uses cpu_relax() in its sync_with_hw() function. Because cpu_relax() is
defined as 'REP; NOP' on x86_64, it will block the CPU from servicing
IOMMU PPR requests.

This may cause a deadlock, because sync_with_hw() won't be completed
until the PPR request has been served.

Therefore, we need to use schedule() instead of cpu_relax() as it is the
minimum requirement to allow other threads to execute.

Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Oded Gabbay <oded.gabbay@amd.com>
drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c

index 5055fc9c87311781b17c9f1291fbc41b7e419cc9..9abac48de4995d200a3f490ab2a6d7e4674198f2 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/mutex.h>
 #include <linux/slab.h>
 #include <linux/printk.h>
+#include <linux/sched.h>
 #include "kfd_kernel_queue.h"
 #include "kfd_priv.h"
 #include "kfd_device_queue_manager.h"
@@ -274,7 +275,7 @@ static int sync_with_hw(struct kernel_queue *kq, unsigned long timeout_ms)
                                *kq->wptr_kernel, *kq->rptr_kernel);
                        return -ETIME;
                }
-               cpu_relax();
+               schedule();
        }
 
        return 0;