drm/amdgpu:protect cs submit
authorMonk Liu <Monk.Liu@amd.com>
Wed, 8 Mar 2017 07:51:13 +0000 (15:51 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 30 Mar 2017 03:55:33 +0000 (23:55 -0400)
to prevent submit two or more IBs with PREEMPT flags.

Signed-off-by: Monk Liu <Monk.Liu@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c

index 63d69054276186acb6df5f3504e632a017cea464..cf44388b5bce6c460dd5fc02e43884c4b9a7bbb1 100644 (file)
@@ -888,7 +888,7 @@ static int amdgpu_cs_ib_fill(struct amdgpu_device *adev,
        struct amdgpu_fpriv *fpriv = parser->filp->driver_priv;
        struct amdgpu_vm *vm = &fpriv->vm;
        int i, j;
-       int r;
+       int r, ce_preempt = 0, de_preempt = 0;
 
        for (i = 0, j = 0; i < parser->nchunks && j < parser->job->num_ibs; i++) {
                struct amdgpu_cs_chunk *chunk;
@@ -903,6 +903,17 @@ static int amdgpu_cs_ib_fill(struct amdgpu_device *adev,
                if (chunk->chunk_id != AMDGPU_CHUNK_ID_IB)
                        continue;
 
+               if (ib->flags & AMDGPU_IB_FLAG_PREEMPT) {
+                       if (ib->flags & AMDGPU_IB_FLAG_CE)
+                               ce_preempt++;
+                       else
+                               de_preempt++;
+               }
+
+               /* only one preemptible IB per submit for me/ce */
+               if (ce_preempt > 1 || de_preempt > 1)
+                       return -EINVAL;
+
                r = amdgpu_cs_get_ring(adev, chunk_ib->ip_type,
                                       chunk_ib->ip_instance, chunk_ib->ring,
                                       &ring);